Sönke Tesch: Sicherheit, $_POST, $_SERVER["HTTP_REFERER"], register_globals

Beitrag lesen

Seite 1: <input type="hidden" name="check" value="5">

Seite 2: $check=$_POST["check"];

Angenommen, die Variable $check ist sicherheitsrelevant, dann könnte jeder beliebige User ein eigenes _POST-Formular_ schreiben, und nach Seite 2 die Variable $check mit einem anderen Wert übergeben.

Richtig.

Jetzt die Frage: Ist $_SERVER["HTTP_REFERER"] immer vorhanden (feste Root-Server-Konfiguration) oder ist das Vorhandensein der Variablen vom Browser abhängig und die Variable kann vom User geändert werden?

Die URL der verweisenden Seite wird vom Browser gesendet (wie alles, was in $_SERVER mit "HTTP_" beginnt) und ist dementsprechend genauso wie Formulardaten frei manipulierbar.
Schlimmer noch: Einige Programme blockieren diese Angabe gezielt, um eine gewisse Anonymität ihres Benutzers sicherzustellen. Dies wird häufiger der Fall sein, als daß jemand Formulardaten böswillig ändert.

Wenn $_SERVER["HTTP_REFERER"] nicht sicher ist, wie prüfe ich dann, daß wirklich nur Daten benutzt werden, die ich selbst mit meinem Dokument übergeben habe?

Grundsätzlich ist Dein Problem nicht die Prüfung der Formulardaten, sondern vielmehr daß Du überhaupt serverinterne und offenbar kritische Daten bei fremden Leuten "auslagerst" - dort haben sie nichts zu suchen.
Wenn Dein System bei Manipulationen an diesen Daten auf die eine oder andere Art zusammenbricht (im übertragenen Sinne), weil eine simple Plausibilitätsprüfung der Formulardaten nicht reicht, dann solltest Du sowas wirklich unterlassen.
Du dokterst nicht an der Ursache, sondern an den Symptomen herum.

Verwende Sessions, dafür sind sie gedacht. Wenn es hingegen nur um eine Ablaufprüfung geht, d.h. daß niemand ein Formular zweimal abschickt oder zwischen dem dritten und vierten Formular einzusteigen versucht, kannst Du über eindeutige Kennungen im Formular diesen Ablauf erzwingen.

Gruß,
  soenk.e