$_POST vorm Absenden manipulierbar?
Stefan
- programmiertechnik
0 Tillmann- php
0 MudGuard
Hallo zusammen,
Ich habe ein Formular mit unter anderem drei Auswahllisten, die zusammen ein Datum ergeben sollen. Im ersten stehen die Zahlen 1 bis 31 für die Tage, im zweiten 1 - 12 für den Monat und im dritten 1950 bis 2000 für das Jahr zur Auswahl. In meiner Datenbank, in die die Werte eingefügt werden sollen, habe ich ein Feld vom Datentyp DATE.
Nun habe ich eine Funktionalität, die den Inhalt der Request-Variable $_POST ausliest, eine INSERT-Query erzeugt und die Werte in die Felder gleichen Namens in der Datenbanktabelle einfügt:
$_POST['first_name'] landet also im Feld last_name der Datenbanktabelle. Die oben angesprochenen Auswahllisten haben die Namen dob, mob und yob, in der Datenbank habe ich jedoch nur ein Feld date_of_birth.
Habe ich eine Chance, $_POST beim Absenden des Formulars so zu manipulieren, dass die Variable einen Schlüssel date_of_birth enthält, indem der Wert für das Datum, zusammengesetzt aus dob, mob und yob, enthalten ist?
Enthält $_POST eigentlich die Inhalte der Formularfelder immer in der Reihenfolge, in der die Felderim Formular angeordnet sind (Also zeilenweise von links nach rechts)?
Viele Grüße,
Stefan
Nabend,
$_POST['first_name'] landet also im Feld last_name der Datenbanktabelle.
Und warum nicht im Feld "first_name"?
Habe ich eine Chance, $_POST beim Absenden des Formulars so zu manipulieren, dass die Variable einen Schlüssel date_of_birth enthält, indem der Wert für das Datum, zusammengesetzt aus dob, mob und yob, enthalten ist?
Hä? Warum nicht einfach so: Im Programmteil, der das SQL-Insert erzeugt, eine Variable $datum = $_POST["yob"]."-".$_POST["mob"]."-".$_POST["dob"] definieren und die dann einfügen? (Je nach DATE-Format/Ländereinstellung eine andere Reihenfolge bzw. "." statt "-" oder drgl.)
Enthält $_POST eigentlich die Inhalte der Formularfelder immer in der Reihenfolge, in der die Felderim Formular angeordnet sind (Also zeilenweise von links nach rechts)?
$_POST ist ein assoziatives Array, also ohne Reihenfolge.
Alles klar?
Grüße,
Tillmann
Hallo Tillmann,
$_POST['first_name'] landet also im Feld last_name der Datenbanktabelle.
Und warum nicht im Feld "first_name"?
Ups, Schreibfehler.
Hä? Warum nicht einfach so: Im Programmteil, der das SQL-Insert erzeugt, eine Variable $datum = $_POST["yob"]."-".$_POST["mob"]."-".$_POST["dob"] definieren und die dann einfügen? (Je nach DATE-Format/Ländereinstellung eine andere Reihenfolge bzw. "." statt "-" oder drgl.)
Diese Möglichkeit ist klar. Dann müsste ich aber die Funktion dem entsprechend verändern. Sie sollte aber noch in anderen Fällen einsetzbar sein. Wenn ich in einem Formular z.B. mehrere solcher "Datumsauswahllisten" habe, haben die ja auch alle unterschiedliche Namen. Konkret habe ich eines für Geburtsdatum, eines für den Eintritt in den Verein und eines für das Datum der letzten Prüfung. Es wäre sehr schön, wenn ich sie so allgemeingültig wie möglich halten könnte.
Enthält $_POST eigentlich die Inhalte der Formularfelder immer in der Reihenfolge, in der die Felderim Formular angeordnet sind (Also zeilenweise von links nach rechts)?
$_POST ist ein assoziatives Array, also ohne Reihenfolge.
Naja, aber bei Benutzung einer foreach-Schleife kann man schon den Eindruck erlangen, dass die Schlüssel in der Reihenfolge ausgelesen werden, wie sie dem Array hinzugefügt worden sind.
Stefan
echo $begrüßung;
Hä? Warum nicht einfach so: Im Programmteil, der das SQL-Insert erzeugt, eine Variable $datum = $_POST["yob"]."-".$_POST["mob"]."-".$_POST["dob"] definieren und die dann einfügen?
Einfach, sieht aber verdächtig nach SQL-Injection-Lücke aus.
Diese Möglichkeit ist klar. Dann müsste ich aber die Funktion dem entsprechend verändern.
Nun, da du sowieso die vom Benutzer übergebenen Daten auf gültige Werte prüfen musst, kannst du bei der Gelegenheit auch gleich die Werte zusammenfassen, die zusammen gehören. Die Werte noch beim Client zusammenzubauen ist nicht in jedem Fall möglich. Einige haben keine Möglichkeit, Code auszuführen, andere haben diese Möglichkeit ausgeschaltet. Außerdem kommst du um eine serverseitige Prüfung der Werte nicht herum.
$_POST ist ein assoziatives Array, also ohne Reihenfolge.
Naja, aber bei Benutzung einer foreach-Schleife kann man schon den Eindruck erlangen, dass die Schlüssel in der Reihenfolge ausgelesen werden, wie sie dem Array hinzugefügt worden sind.
Diese Schlussfolgerung wäre nicht beweisbar. Es gibt keine Regel, die besagt, in welcher Reihenfolge ein Client die Daten zu senden hat. Ich würde mich nicht auf eine solche verlassen. Auch nicht darauf, dass kein Wert fehlt oder dass kein überflüssiger Wert mitgesendet wird, den ich gar nicht bestellt habe.
echo "$verabschiedung $name";
Hallöchen,
Nun, da du sowieso die vom Benutzer übergebenen Daten auf gültige Werte prüfen musst, kannst du bei der Gelegenheit auch gleich die Werte zusammenfassen, die zusammen gehören. Die Werte noch beim Client zusammenzubauen ist nicht in jedem Fall möglich. Einige haben keine Möglichkeit, Code auszuführen, andere haben diese Möglichkeit ausgeschaltet. Außerdem kommst du um eine serverseitige Prüfung der Werte nicht herum.
Okay, ich habe eine Funktion validate(), die z.B. überprüft ob Vor- und Nachname gesetzt sind. Darin kann ich mir natürlich $_POST['date_of_birth'] = $_POST['dob']."-".$_POST['mob']."-".$_POST['yob']
zusammenbauen.
Danke für den Augenöffner.
Hallo,
Okay, ich habe eine Funktion validate(), die z.B. überprüft ob Vor- und Nachname gesetzt sind. Darin kann ich mir natürlich $_POST['date_of_birth'] = $_POST['dob']."-".$_POST['mob']."-".$_POST['yob']
Dedlfix Teil mit der SQL-Injection hast du aber geschickt übersprungen, so dass es immer noch ein leichtes für mich ist die $_POST variablen so zu manipulieren, dass ich deine Datenbank mal eben schnell leeren kann, oder sie auch als externe Festplatte für meine Videosammlung nutzen kann.
Grüße
Jeena Paradies
Dedlfix Teil mit der SQL-Injection hast du aber geschickt übersprungen,...
aber nicht übersehen, die Funktion heißt ja nicht umsonst validate(). Trotzdem vielen Dank an Dich und dedlfix.
echo $begrüßung;
Okay, ich habe eine Funktion validate(), die z.B. überprüft ob Vor- und Nachname gesetzt sind. Darin kann ich mir natürlich $_POST['date_of_birth'] = $_POST['dob']."-".$_POST['mob']."-".$_POST['yob']
zusammenbauen.
PHP bietet für die Überprüfung von Datumsangaben die Funktion checkdate(). Nutze diese, um festzustellen, dass das eingegebene Datum ein gültiges ist. Ebenso kann es nicht schaden, die Werte vorher auf Zahlen zu prüfen. is_integer() eignet sich weniger, da $_POST-Daten generell Strings sind. is_numeric() hilft schon eher, lässt aber auch die Exponentialdarstellung als gültige Zahl durch. intval() liefert einen definierten Integerwert oder 0, wenn es sich um keine Zahl handelte.
echo "$verabschiedung $name";
Hi,
Enthält $_POST eigentlich die Inhalte der Formularfelder immer in der Reihenfolge, in der die Felderim Formular angeordnet sind (Also zeilenweise von links nach rechts)?
Der HTML-Standard legt nur fest, daß die Daten (Name-Value-Pärchen) zu übertragen sind und wie die einzelnen Pärchen übertragen werden - über die Reihenfolge wird nichts gesagt. Es steht den Browser-Programmierern also frei, in welcher Reihenfolge die Pärchen geschickt werden.
Beim Server kommen die Daten also in beliebiger Reihenfolge an. Daß der PHP-Interpreter die Daten beim Befüllen von $_POST nicht umsortiert, ist auch nicht festgeschrieben.
Es gibt also 2 Stellen, an denen die Reihenfolge nicht garantiert ist.
Du solltest Dich also nicht darauf verlassen.
cu,
Andreas