doppelt vergebene Namen im HTML-Formular
aha
- html
Was passiert, wenn ein Name eines HTML-Formular-Elements doppelt vorkommt?
Gibt es da eine eindeutige Antwort, ob der erste oder zweite Inhalt als POST-Variable weitergegeben wird?
Oder anders gefragt: Überschreiben gleichnamige Formularfelder sich in der Reihenfolge ihres Vorkommens im Formular?
Danke.
aha
Hi!
Was passiert, wenn ein Name eines HTML-Formular-Elements doppelt vorkommt?
Unerwartete Ergebnisse!
Gibt es da eine eindeutige Antwort, ob der erste oder zweite Inhalt als POST-Variable weitergegeben wird?
AFAIK: nein!
Oder anders gefragt: Überschreiben gleichnamige Formularfelder sich in der Reihenfolge ihres Vorkommens im Formular?
Du hast erkannt, dass die doppelte resp. mehrfache Vergabe von Namen ein Problem verursachen kann - warum vermeidest Du dieses dann nicht einfach?
off:PP
Du hast erkannt, dass die doppelte resp. mehrfache Vergabe von Namen ein Problem verursachen kann - warum vermeidest Du dieses dann nicht einfach?
Hallo,
... um Arbeit zu sparen :-)
Ich hole etwas weiter aus:
Es gibt einen umfangreichen Bestellprozess mit ca. 40...50 durch mehrere HTML-Seiten "geschleppten" Werten. Um die Variablen weiterzugeben steht am Ende der Seite:
<?
reset($HTTP_POST_VARS);
while(list($key, $val) = each($HTTP_POST_VARS)) {
echo "<input type="Hidden" name="";
echo $key;
echo "" value="";
echo $val;
echo "">\n";
}
?>
Damit werden alle per POST "empfangenen" Variablen per POST wieder weitergegeben. Dazu kommen dann die "neuen" Formular-Elemente auf dieser Seite.
Nun prüft die Seite aber manche Eingaben auf Korrektheit und ruft sich ggf. selbst auf (mit entsprechenden Fehlermeldungen etc.)
Dadurch sind aber alle vorkommenden Formularelemente "doppelt", einmal als Original und dann nochmal als "Hidden"-Feld am Ende. Dadurch werden geänderte Eingaben durch die "alten" Hidden-Werte überschrieben.
Die Idee war jetzt, die Hidden-Felder einfach an den Anfang zu setzen. Dann werden sie ggf. durch die Inhalte der später im Formular stehenden Elemenet überschrieben.
Klappt in ersten Tests im IE und Firefox auch sehr gut.
Die Frage ist nur, ob man sich darauf verlassen kann...
Kann man?
(Bitte jetzt nicht erklären, daß man die Variablen-Übergabe prinzipiell anders lösen kann. das weiß ich. Mich interessiert an dieser Stelle die obenstehende Frage.)
Danke.
aha
echo $begrüßung;
reset($HTTP_POST_VARS);
$HTTP_*_VARS ist uraltes PHP. Schon seit 2001 wurden sie durch $_* ersetzt.
while(list($key, $val) = each($HTTP_POST_VARS)) {
Außerdem gibt es foreach seit PHP 4.0.
echo "<input type="Hidden" name="";
echo $key;
echo "" value="";
echo $val;
echo "">\n";
}
Hier fehlt die kontextgerechte Behandlung der Werte. Für die Ausgabe von Werten nach HTML wäre ein htmlspecialchars() angebracht, für $key und $val.
Die Idee war jetzt, die Hidden-Felder einfach an den Anfang zu setzen. Dann werden sie ggf. durch die Inhalte der später im Formular stehenden Elemenet überschrieben.
Klappt in ersten Tests im IE und Firefox auch sehr gut.
Die Frage ist nur, ob man sich darauf verlassen kann...
Kann man?
Sie werden beide vom Client zum Server übertragen. PHP stellt sie in dem bekannten Array $_POST zur Verfügung. Allerdings werden die Elemente des Arrays blind geschrieben. Wenn bereits ein mit dem gleichen Schlüssel Wert vorhanden war, wird er somit überschrieben. Ausnahme wäre ein Name, der auf [] endet, der erzeugt ein Array.
echo "$verabschiedung $name";
Mahlzeit aha,
... um Arbeit zu sparen :-)
Im Gegenteil: bei Deiner Konstruktion machst Du Dir erheblich mehr Arbeit und provozierst erheblich mehr Probleme, als wenn Du es "richtig" machen würdest.
Es gibt einen umfangreichen Bestellprozess mit ca. 40...50 durch mehrere HTML-Seiten "geschleppten" Werten.
Für so etwas gibt es Sessions.
<?
Short-Open-Tags waren noch NIE eine gute Idee.
reset($HTTP_POST_VARS);
while(list($key, $val) = each($HTTP_POST_VARS)) {
echo "<input type="Hidden" name="";
echo $key;
echo "" value="";
echo $val;
echo "">\n";
}
Abgesehen von dem, was dedlfix bereits schrieb: Werte, die Du - gleich in welcher Form - an den Browser ausgibst und anschließend von ihm ohne jegliche Gültigkeitsüberprüfung wieder übernimmst und für Dein Skript verwendest, sind ein dermaßen großes Sicherheitsloch, dass selbst mehrere Flugzeugträger samt Begleitflottille und inkl. dem sie umgebenden Ozean problemlos hindurchpassen. "ALL INPUT IS EVIL!" - diese Devise gilt IMMER und ÜBERALL. Verlasse Dich also NIEMALS darauf, dass Du vom Browser des Benutzers genau die Werte zurückbekommst, die Du ihm bei der Antwort auf seinen letzten Request als versteckte Felder ausgeliefert hast. Um Werte von einer Seite auf die andere zu übertragen, bieten sich Sessions an.
Damit werden alle per POST "empfangenen" Variablen per POST wieder weitergegeben.
Richtig. Und anschließend kann der Benutzer sie nach Belieben manipulieren, die Werte verändern usw. ... überprüfst Du auf JEDER Seite die Gültigkeit ALLER erhaltenen Formularelemente (inkl. den versteckten)?
Nun prüft die Seite aber manche Eingaben auf Korrektheit und ruft sich ggf. selbst auf (mit entsprechenden Fehlermeldungen etc.)
"Manche"? Keine gute Idee. Jede Seite sollte ALLE überprüfen ... oder Du sorgst halt dafür, dass bereits überprüfte und gültige Werte Deinen Server (der einzig "sichere" Hafen für die von Dir zu verarbeitenden Daten) nicht wieder verlassen. Und wenn doch, dann müssen sie beim erneuten Eintreffen wieder überprüft werden. Immer und immer und immer.
Die Frage ist nur, ob man sich darauf verlassen kann...
Kann man?
Nein, nicht in der von Dir beabsichtigten Weise.
(Bitte jetzt nicht erklären, daß man die Variablen-Übergabe prinzipiell anders lösen kann. das weiß ich.
Warum tust Du es dann nicht? Willst Du mit Absicht unsichere Anwendungen stricken?
Mich interessiert an dieser Stelle die obenstehende Frage.)
Der Browser üebrträgt nur die Werte aller Formularelemente (egal ob sichtbar oder versteckt) in der Reihenfolge ihres Auftretens im Quelltext auf die Art und Weise, die Du ihm sagst (GET oder POST) an den Webserver. Was dieser bzw. die dort laufende Skriptsprache tut, ist für Deine Fragestellung relevant. In PHP überschreiben z.B. "spätere" Werte die früheren. ASP dagegen legt für alle mehrfach vorkommenden Werte eine Collection an. Andere Sprachen mögen andere Vorgehensweisen haben ... probier's aus.
MfG,
EKKi
Hi,
Was passiert, wenn ein Name eines HTML-Formular-Elements doppelt vorkommt?
Gibt es da eine eindeutige Antwort, ob der erste oder zweite Inhalt als POST-Variable weitergegeben wird?
Nein, beide.
Oder anders gefragt: Überschreiben gleichnamige Formularfelder sich in der Reihenfolge ihres Vorkommens im Formular?
Nur bei der Auswertung in "dummen" Sprachen wie PHP.
MfG ChrisB
Hi!
Nur bei der Auswertung in "dummen" Sprachen wie PHP.
Kannst Du mir eine "schlaue" Sprache empfehlen?
off:PP
Mahlzeit Peter Pan,
Nur bei der Auswertung in "dummen" Sprachen wie PHP.
Kannst Du mir eine "schlaue" Sprache empfehlen?
Auch wenn ich jetzt warsteinlich geflamt und anschließend gevierteilt werde: selbst (classic) ASP kann das ... jaja, ich weiß - ich benutze es auch nur widerwillig. Aber immerhin ist es so "schlau", aus dem mehrfachen Auftauchen gleichbenannter Parameter ein Array zu machen.
MfG,
EKKi
n'Abend!
Auch wenn ich jetzt warsteinlich geflamt [...]
bring jetzt bitte nicht die ganze Velt ins Grübeln, sonst serviert Malcolm Beck's dir noch einen Bit-Burger und ein Harzwasser im Krombecher!
Prost!
Martin
echo $begrüßung;
Nur bei der Auswertung in "dummen" Sprachen wie PHP.
Kannst Du mir eine "schlaue" Sprache empfehlen?
PHP. Man muss nur den Querystring oder bei POST die Standardeingabe selbst auswerten, wenn nicht der Sonderfall foo[] vorliegt. Werkzeuge dafür bringt PHP ausreichend mit.
echo "$verabschiedung $name";
Hi!
Nur bei der Auswertung in "dummen" Sprachen wie PHP.
Kannst Du mir eine "schlaue" Sprache empfehlen?
PHP. Man muss nur den Querystring oder bei POST die Standardeingabe selbst auswerten, wenn nicht der Sonderfall foo[] vorliegt. Werkzeuge dafür bringt PHP ausreichend mit.
Meine Frage zielte auf etwas anders ab - egal;)
off:PP
echo $begrüßung;
Was passiert, wenn ein Name eines HTML-Formular-Elements doppelt vorkommt?
Gibt es da eine eindeutige Antwort, ob der erste oder zweite Inhalt als POST-Variable weitergegeben wird?
Es wird alles übertragen.
Oder anders gefragt: Überschreiben gleichnamige Formularfelder sich in der Reihenfolge ihres Vorkommens im Formular?
Nicht beim Übertragen. Du kannst das sehr gut nachvollziehen, wenn du GET nimmst. Da kannst du in der URL sehen, dass beides hintereinander steht. Für POST kannst du beispielsweise mit der livehttpheaders-Extension für den Firefox sehen, dass alles übertragen wird. Der Server muss dann die Werte geeignet zur Verfügung stellen. PHP kann das nicht, da bekommst du den zuletzt übertragenen Wert. Aber wenn die gleichen Namen auf [] enden, dann kannst du auch mit PHP auf alle Werte zugreifen, weil PHP dann ein Array anlegt.
echo "$verabschiedung $name";
Was passiert, wenn ein Name eines HTML-Formular-Elements doppelt vorkommt?
Dies wird bei radios erwartet.
Es wird jedoch nur der selektierte Wert übertragen.
Bei einer selectbox mit multiple choice werden param=wert Kombos aller selektieren Elemente gesendet
Gibt es da eine eindeutige Antwort, ob der erste oder zweite Inhalt als POST-Variable weitergegeben wird?
Das normale Verhalten ist, dass die Reihenfolge der Combos dem Quelltext folgt.
Abweichungen durch sonderbare User-Agents nicht ausgeschlossen.
Oder anders gefragt: Überschreiben gleichnamige Formularfelder sich in der Reihenfolge ihres Vorkommens im Formular?
Clientseitig nein.
Serverseitig, kommt darauf an, was man beim auslesen macht.
Grundsätzlich ist man frei, das zu verhindern.
mfg Beat;