Das Senden eines GET-Formulars mit Abfragezeichenfolgenparametern und versteckten Parametern verschwindet

231

Betrachten Sie dieses Formular:

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

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

Kiquenet
quelle
3
Ihr Aktionselement ist fehlerhaft.
Adrian Godong
Sie sollten nicht verschwinden, also denke ich, wir müssen Ihre Form sehen.
UnkwnTech
2
Hallo, hier ist das vollständige Formular. Sie können einfach ein HTML mit diesem Formular erstellen und sehen, dass die Parameter, die ich in der Aktion übergebe, nicht mehr angezeigt werden: <form action = " example.com?e=4&f=5 " 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>
1
Sie wissen übrigens, dass Sie ein Endzitat zu diesem Aktionswert vermissen? Ganz abgesehen von der Hauptausgabe, aber ...
Jay
Ich habe eine mögliche Problemumgehung mit JavaScript hier veröffentlicht: stackoverflow.com/questions/3548795/…
Jenny O'Reilly

Antworten:

263

Sind das nicht die versteckten Parameter, mit denen man anfangen soll ...?

<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 damit rechnen, dass ein Browser eine vorhandene Abfragezeichenfolge in der Aktions-URL beibehält.

In den Spezifikationen ( RFC1866 , Seite 46; HTML 4.x, Abschnitt 17.13.3) heißt es:

Wenn die Methode "get" ist und die Aktion ein HTTP-URI ist, nimmt der Benutzeragent den Wert der Aktion an und fügt ein "?" Hängt dann den Formulardatensatz an, der mit dem Inhaltstyp "application / x-www-form-urlencoded" codiert ist.

Vielleicht könnte man die Aktions-URL prozentual codieren, um das Fragezeichen und die Parameter einzubetten, und dann die Daumen drücken, um zu hoffen, dass alle Browser diese URL so lassen, wie sie ist (und überprüfen, ob der Server sie auch versteht). Aber darauf würde ich mich nie verlassen.

Übrigens: Bei nicht ausgeblendeten Formularfeldern ist das nicht anders. Für POST könnte die Aktions-URL jedoch eine Abfragezeichenfolge enthalten.

Arjan
quelle
71

In HTML5 ist dies ein Verhalten pro Spezifikation.

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

Siehe "4.10.22.3 Formularübermittlungsalgorithmus", Schritt 17. Im Fall eines GET-Formulars an einen http / s-URI mit einer Abfragezeichenfolge:

Das Ziel sei eine neue URL, die der Aktion entspricht, mit der Ausnahme, dass ihre <query>Komponente durch eine Abfrage ersetzt wird (ggf. Hinzufügen eines U + 003F-FRAGEZEICHEN-Zeichens (?)).

Ihr Browser wird also den vorhandenen "? ..." - Teil Ihrer URI in den Papierkorb werfen und ihn basierend auf Ihrem Formular durch einen neuen ersetzen.

In HTML 4.01 erzeugt die Spezifikation ungültige URIs - die meisten Browser haben dies jedoch nicht getan.

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

Xyphus
quelle
das heißt: alles hinter der ?in der action url wird entfernt? Was ist also, wenn der GET-Parameter in der Aktions-URL das Ziel enthält, wo das Formular verarbeitet werden soll? wie : action="index.php?site=search". Ich bin mir nicht sicher, ob es eine gute Idee ist, den GET-Parameter in versteckte Eingabefelder zu setzen.
Die Bndr
Was meinst du mit per-spec @xyphoid?
AmiNadimi
@AmiNadimi: Es bedeutet "gemäß der Spezifikation".
rekursiv
14

Sie können ein einfaches foreach für die Tabelle verwenden, die die GET-Informationen enthält. Zum Beispiel in PHP:

foreach ($_GET as $key => $value) {
    echo("<input type='hidden' name='$key' value='$value'/>");
}
Efx
quelle
23
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 dass sie zuerst ausgeblendet werden.
Drawm
16
Downvoting bis der XSS-Fehler in diesem Code behoben ist.
Spookylukey
1
Diese Antwort bietet eine ähnliche Lösung, ist jedoch für XSS nicht geeignet.
Vvzh
Dies behandelt keine Array-Parameter
Andrew
5

Sie sollten die beiden Elemente (a und b) als versteckte Eingabeelemente sowie C einfügen.

Bernhard Hofmann
quelle
Ja, natürlich würde ich das tun, wenn es möglich ist. Angenommen, ich habe Parameter in der Abfragezeichenfolge und in versteckten Eingaben. Was kann ich tun?
Ich denke, Ihre einzige Option besteht darin, die Name / Wert-Paare der Abfragezeichenfolge zu analysieren und versteckte Eingabefelder zu erzeugen. Wenn Sie den Kontext der Seite und der URL etwas genauer beschreiben, können wir möglicherweise eine funktionierende Lösung vorschlagen.
Bernhard Hofmann
Alternativ können Sie die Daten aus den ausgeblendeten Formularelementen übernehmen, sie der URL und zusätzlichen Abfrageparametern hinzufügen und dann die Schaltfläche zum Senden des Formulars durch einen einfachen Ankerlink oder eine Serverumleitung ersetzen, Location:wenn Sie keine Interaktion mit dem Endbenutzer wünschen .
Jason
1

Ich hatte ein sehr ähnliches Problem, bei dem ich für die Formularaktion so etwas hatte wie:

<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 Site bringen, aber die Abfrageinformationen verschwanden, sodass der Benutzer auf der Startseite und nicht auf der gewünschten Inhaltsseite landete. In meinem Fall bestand die Lösung darin, herauszufinden, wie die URL ohne die Abfrage codiert werden kann, die den Benutzer zur gewünschten Seite führt. In diesem Fall war mein Ziel eine Drupal-Site, so wie sich herausstellte, /content/somethingfunktionierte es auch. Ich hätte auch eine Knotennummer (dh /node/123) verwenden können.

KillerRabbit
quelle
0

Wenn Sie eine Problemumgehung benötigen, da dieses Formular in Systemen von Drittanbietern platziert werden kann, können Sie Apache mod_rewrite wie folgt verwenden:

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

dann sieht Ihr neues Formular folgendermaßen aus:

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

und Apache hängt den 3. Parameter an die Abfrage an

Wanis
quelle
-3

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

"Aber nehmen wir an, ich habe Parameter in der Abfragezeichenfolge und in versteckten Eingaben. Was kann ich tun?" Sie können den Fehler beheben. Um nicht hinterhältig zu sein, aber das ist ein bisschen so, als würde man fragen: "Aber sagen wir mal, meine URL verwendet Prozentzeichen anstelle von Schrägstrichen. Was kann ich tun?" Die einzig mögliche Antwort ist, dass Sie die URL korrigieren können.

Jay
quelle
Diese ganze Antwort ist technisch korrekt ("es ist falsch, also behebe es"), aber überhaupt nicht von Nutzen. Das OP weiß bereits, dass etwas nicht stimmt, und fragt hier, wie es behoben werden kann.
Jason
Es tut mir leid, war das nicht klar? "Sie können keine Parameter in den Aktionswert eines Formulars aufnehmen." Entfernen Sie die Parameter aus dem Aktionswert des Formulars, um das Problem zu beheben.
Jay
@ Jay Das Problem ist eindeutig, dass der Benutzer die URL-Parameter benötigt, um zu bleiben, so dass das Sagen von "Entfernen" nicht helfen wird
Chuck Le Butt
@ChuckLeButt Zu sagen "aber ich muss das tun, was nicht funktioniert" ist keine nützliche Sache zu sagen. Wenn mir jemand sagt: "Ich drehe den Funkknopf weiter, aber mein Auto bewegt sich nicht", kann ich mir nur sagen: "Durch Drehen des Funkknopfs bewegt sich das Auto nicht. Sie müssen sich drehen den Zündschlüssel drücken und das Gaspedal betätigen. " Die Antwort "aber ich muss das Auto durch Drehen des Funkknopfs bewegen" ist eine unproduktive Antwort. Es funktioniert nicht. Es wird nicht funktionieren.
Jay
-3

Dies ist eine Antwort auf den obigen Beitrag von Efx:

Wenn die URL bereits die Variable enthält, die Sie ändern möchten, wird sie erneut als verstecktes Feld hinzugefügt.

Hier ist eine Änderung dieses Codes, um das Duplizieren von Variablen in der URL zu verhindern:

foreach ($_GET as $key => $value) {
    if ($key != "my_key") {
        echo("<input type='hidden' name='$key' value='$value'/>");
    }
}
TH_
quelle
-4
<form ... action="http:/www.blabla.com?a=1&b=2" method ="POST">
<input type="hidden" name="c" value="3" /> 
</form>

Ändern Sie die Anforderungsmethode in 'POST' anstelle von 'GET'.

Shashidhar Gr
quelle
-4

Normalerweise schreibe ich so etwas:

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 bereinigen!

Rápli András
quelle