Hauptmenü

Untermenü

Sicher programmieren - POST-Werte

1. Die Abschnitte

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