Sicher programmieren - POST-Werte
1. Die Abschnitte
- Einführung
- Informationen
- Desinformation
- GET-Parameter
- POST-Werte
- JavaScript-Hacks
- SQL-Injections Teil 1
- SQL-Injections Teil 2
- Dateiuploads Teil 1
- Dateiuploads Teil 2
- Brute-Force-Attacken
- Webhosting
2. Der böse Schnitzer
... ist fast genau so primitiv wie bei GET-Parametern. Trotzdem machen Anfänger diesen Fehler immer noch sehr häufig. Geht also in den
Ordner post
und ruft die index.php
im Browser und im Editor eurer Wahl auf.
Der Code
Da brauch ich eigentlich nichts zu erklären. Man holt sich alle Produkte aus der Datenbank und gibt sie in einem Formular aus. Absolut nichts Wildes. Jetzt wählt mal zwei oder drei Produkte aus und klickt auf "Bestellen".
Ein Hinweis
Wer noch nicht weiß, was die []
beim name
zu suchen haben, dem sei gesagt, dass man in diesem Fall ein
numerisches Array von Feldern mit identischem Namen erstellt. Die kann man dann wunderbar mit PHP verarbeiten.
3. Der große Fehler
... passiert nun in der list.php
, wo die ausgewählten Produkte noch mal aufgelistet werden sollen. Zunächst wird das
Array(!) mit den ausgewählten IDs ausgelesen.
for ($i = 0; $i < count($_POST['bestell']); $i++)
Jetzt wisst ihr auch, warum wir in der index.php
beim name
ein bestell[]
gesetzt haben. Für die,
die es nicht begriffen haben, sollten mal in der list.php
ein print_r($_POST)
einbauen.
Kommen wir nun zum Problem. Unser Programmierer denkt sich, dass er alle Daten für die Bestellung zusammen hat und möchte sich im
letzten Schritt eine weitere SQL-Abfrage sparen. Also speichert er alle Werte in hidden
-Feldern ab, was natürlich fatale
Folgen hat. Dabei konzentrieren wir uns nur auf diesen Eintrag.
<input type="hidden" name="preis[]" value="'.$prod[$i]['preis'].'"/>
4. Der Hack
Speichert den erzeugten Quellcode der list.php
über euren Browser mal lokal auf eurer Festplatte ab. Wie das geht, solltet
ihr ja wohl wissen. Jetzt öffnet diese HTML-Datei mit eurem Editor und nehmt folgende Anpassungen vor.
action
Damit der Hack gelingen soll, muss zuerst der Pfad im action
-Attribut des Formularelements angepasst werden. Denn der muss
absolut auf die richtige Datei verweisen. So wird denn aus order.php
zum Beispiel ein
http://localhost/sicher_programmieren/post/order.php
.
Die Preise
... werden wir nun einfach ändern und für wenig Geld einkaufen gehen. Darum müsst ihr einfach nur die Werte in allen entsprechenden
hidden
-Feldern ändern. Macht mal zum Beispiel aus dem
<input name="preis[]" value="199.95" type="hidden">
ein
<input name="preis[]" value="9.95" type="hidden">
Jetzt müsst ihr nur noch eure lokale Kopie abspeichern, im Browser aufrufen und auf den submit
-Button drücken.
5. order.php
Dort übernimmt unser Programmierer einfach die Werte, die vom Formular übertragen werden und berechnet daraus den Gesamtpreis:
$preis = 0;
for ($i = 0; $i < count($_POST['preis']); $i++)
{
$preis += $_POST['preis'][$i];
}
Und wenn ihr alles richtig gemacht habt, so liegt euer Gesamtpreis deutlich unter dem tatsächlichen! Geiz ist geil! Und wir hassen teuer!
6. Schlussfolgerung
Man speichert niemals wichtige Daten in versteckten Formular-Feldern! In diesem Beispiel hätte man in der
list.php
wenn überhaupt nur die IDs der Produkte hinterlegen sollen, um sich dann in der order.php
noch mal
alle Werte aus der Datenbank ziehen zu können. Mehr nicht!
zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt