2009-07-12 11 views
178

dieses Formular vor:eine GET-Form mit Query-String-params und versteckten params Absenden verschwinden

<form action="http://www.blabla.com?a=1&b=2" method="GET"> 
    <input type="hidden" name="c" value="3" /> 
</form> 

Wenn das Absenden dieses Formulars (a GET-Form) die Parameter a und b verschwinden. Gibt es einen Grund dafür? Gibt es eine Möglichkeit, dieses Verhalten zu vermeiden?

+3

Ihr Aktionselement fehlerhaft ist. –

+0

Sie sollten nicht verschwinden, also denke ich, dass wir deine Form sehen müssen. – UnkwnTech

+2

Hallo, hier ist das vollständige Formular, Sie können einfach ein HTML mit diesem Formular erstellen und sehen, dass Parameter, die ich in der Aktion übergeben dispearing sind:

Antwort

214

Ist es nicht das, was versteckte Parameter für den Anfang sind ...?

<form action="http://www.example.com" method="GET"> 
    <input type="hidden" name="a" value="1" /> 
    <input type="hidden" name="b" value="2" /> 
    <input type="hidden" name="c" value="3" /> 
    <input type="submit" /> 
</form> 

Ich würde nicht darauf zählen, dass ein Browser eine vorhandene Abfragezeichenfolge in der Aktions-URL behält.

Da die Spezifikationen (RFC1866, Seite 46; HTML 4.x Abschnitt 17.13.3) Staat:

Wenn die Methode "get" und die Aktion ist ein HTTP-URI, der User-Agent den Wert von Maßnahmen ergreift , fügt ein `? ' Dazu fügt er den Formulardatensatz an, der mit dem Inhaltstyp "application/x-www-form-urlencoded" codiert wurde.

Vielleicht könnte ein Prozent-codieren die Action-URL auf das Fragezeichen und die Parameter einzubetten und dann die Finger kreuzen alle Browser zu hoffen wäre, dass die URL, wie es verlassen (und bestätigen, dass der Server es auch versteht) . Aber ich würde mich nie darauf verlassen.

Übrigens: es ist nicht anders für nicht versteckte Formularfelder. Bei POST könnte die Aktions-URL jedoch eine Abfragezeichenfolge enthalten.

5

sollten Sie umfassen die zwei Punkte (a und b) als versteckte Eingabeelemente sowie C.

+0

Ja, natürlich würde ich das wenn möglich tun. Aber sagen wir, ich habe Parameter in Query String und in versteckten Eingaben, was kann ich tun? –

+0

Ich denke, Ihre einzige Option besteht darin, die Name/Wert-Paare der Abfragezeichenfolge zu analysieren und versteckte Eingabefelder zu erzeugen. Vielleicht könnten Sie, wenn Sie etwas mehr über den Kontext der Seite und der URL beschreiben, eine funktionierende Lösung vorschlagen. –

+0

Alternativ können Sie die Daten aus den ausgeblendeten Formularelementen übernehmen und sie der URL und den zusätzlichen Abfrageparametern hinzufügen. Ersetzen Sie dann die Formularübergabeschaltfläche durch einen einfachen Ankerlink oder einen Server 'Location:' Redirect, wenn Sie keine möchten Interaktion mit dem Endbenutzer. – Jason

1

ich ein sehr ähnliches Problem hatte, wo die Form Aktion, ich so etwas hatte:

<form action="http://www.example.com/?q=content/something" method="GET"> 
    <input type="submit" value="Go away..." />&nbsp; 
</form> 

Die Schaltfläche würde den Benutzer auf die Website bringen, aber die Abfragedaten verschwanden, sodass der Benutzer auf der Startseite statt auf der gewünschten Inhaltsseite landete. Die Lösung in meinem Fall bestand darin, herauszufinden, wie man die URL ohne die Abfrage codiert, die den Benutzer auf die gewünschte Seite bringen würde. In diesem Fall war mein Ziel eine Drupal-Seite, so wie es sich herausstellte /content/something auch funktioniert. Ich hätte auch eine Knotennummer verwenden können (d. H. /node/123).

2

Ihre Konstruktion ist illegal. Sie können keine Parameter in den Aktionswert eines Formulars aufnehmen. Was passiert, wenn Sie das versuchen, hängt von Macken des Browsers ab. Ich wäre nicht überrascht, wenn es mit einem Browser funktioniert und nicht mit einem anderen. Selbst wenn es zu funktionieren scheint, würde ich mich nicht darauf verlassen, weil die nächste Version des Browsers das Verhalten ändern könnte.

"Aber lassen Sie mich sagen, dass ich Parameter in Abfragezeichenfolge und in versteckten Eingaben habe, was kann ich tun?" Was Sie tun können, ist den Fehler zu beheben. Nicht, um abfällig zu sein, aber das ist ein bisschen wie fragen: "Aber lassen Sie uns sagen, dass meine URL Prozentzeichen anstelle von Schrägstrichen verwendet, was kann ich tun?" Die einzig mögliche Antwort ist, dass Sie die URL korrigieren können.

+0

Diese ganze Antwort ist technisch korrekt ("es ist falsch, also repariere es"), aber nutzlos. Das OP weiß bereits, dass etwas nicht stimmt, und fragt sich, wie man es beheben kann. – Jason

+0

Es tut mir leid, war das nicht klar? "Sie können keine Parameter in den Aktionswert eines Formulars aufnehmen." Um dies zu beheben, entfernen Sie die Parameter aus dem Aktionswert des Formulars. – Jay

14

Was Sie tun können, ist die Verwendung einer einfachen foreach in der Tabelle mit den GET-Informationen. Zum Beispiel in php:

foreach ($_GET as $key => $value) { 
    echo("<input type='hidden' name='$key' value='$value'/>"); 
} 
+18

Hinweis: Verwenden Sie diesen Beispielcode niemals genau so, wie er geschrieben wurde. Es wäre sehr gefährlich. Die Werte von GET stammen vom Benutzer und sollten daher nicht auf die Seite geschrieben werden, ohne sie zuvor zu umgehen. – drewm

+10

Nach unten, bis der XSS-Fehler in diesem Code behoben ist. – spookylukey

+0

[Diese Antwort] (http://stackoverflow.com/a/7201286/3206908) bietet eine ähnliche Lösung, aber nicht mit XSS kompatibel. – vvzh

57

In HTML5 ist dies pro spezifisches Verhalten.

Siehe http://www.w3.org/TR/2011/WD-html5-20110525/association-of-controls-and-forms.html#form-submission-algorithm

Blick auf "4.10.22.3 Formular Vorlage Algorithmus", Schritt 17. Im Falle einer GET Form einer http/s URI mit einer Abfragezeichenfolge:

Let Ziel sei eine neue URL, die der Aktion entspricht, außer dass ihre <query> Komponente durch Abfrage ersetzt wird (Hinzufügen eines U + 003F FRAGE MARK-Zeichen (?), falls zutreffend).

Ihr Browser wird also den vorhandenen "? ..." Teil Ihres URI löschen und durch einen neuen ersetzen, der auf Ihrem Formular basiert.

In HTML 4.01 erzeugt die spec ungültigen URIs - die meisten Browser nicht wirklich dies zwar tun ..

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.3 Siehe Schritt vier - der URI wird ein Produkt? angehängt, auch wenn es bereits einen enthält.

+0

dieser Mittelwert: alles hinter dem '?' In der Aktion URL ist entfernt? Was also, wenn der GET-Parameter in der Aktions-URL das Ziel enthält, wo das Formular verarbeitet werden soll? wie: 'action =" index.php? site = suche "'. Ich bin mir nicht sicher, ob es eine gute Idee ist, den GET-Parameter in versteckte Eingabefelder zu setzen. –

+0

was meinst du mit per-spec @ xyphoid? – AmiNadimi

0

Wenn Sie dieses Problem zu umgehen, da diese Form in 3rd-Party-Systeme gestellt werden können, können Sie Apache mod_rewrite wie folgt verwenden:

RewriteRule ^dummy.link$ index.php?a=1&b=2 [QSA,L] 

dann Ihr neues Formular wird wie folgt aussehen:

<form ... action="http:/www.blabla.com/dummy.link" method="GET"> 
<input type="hidden" name="c" value="3" /> 
</form> 

und Apache 3. Parameter anhängen

-2
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST"> 
<input type="hidden" name="c" value="3" /> 
</form> 

Änderung der Anforderungsmethode zu ‚POST‘ abfragen anstelle von 'GET'.

-3

Ich schreibe in der Regel etwas wie folgt aus:

foreach($_GET as $key=>$content){ 
     echo "<input type='hidden' name='$key' value='$content'/>"; 
} 

Dies funktioniert, aber vergessen Sie nicht, Ihre Eingaben gegen XSS-Angriffe zu sanieren!

-2

Dies als Antwort auf den obigen Beitrag ist von Efx:

Wenn die URL bereits die var enthält, die Sie ändern wollen, dann wird es noch einmal als verstecktes Feld hinzugefügt.

Hier ist eine Modifikation des Codes als Duplizieren Vars in der URL zu verhindern:

foreach ($_GET as $key => $value) { 
    if ($key != "my_key") { 
     echo("<input type='hidden' name='$key' value='$value'/>"); 
    } 
}