Sicherheit, $_POST, $_SERVER["HTTP_REFERER"], register_globals
Manfred
- php
0 Sönke Tesch0 Manfred0 Harry0 Sönke Tesch
0 Harry0 Manfred
Hallo,
mein Problem ist folgendes:
Um mit einem Formular über post übermittelte Daten auf einer anderen Seite benutzen zu können, muß ich bei register_globals=Off die Variable $_POST benutzen.
Beispiel:
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.
Deshalb habe ich mir gedacht, die Variable $_SERVER["HTTP_REFERER"] zu benutzen, um zu überprüfen, ob die Seite, die die Variablen mit POST übermittelt wirklich von meinem eigenen Root-Server kommt.
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?
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?
Bin für jede Hilfe dankbar
Viele Grüße
Manfred
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
Hallo,
Verwende Sessions, dafür sind sie gedacht.
In Ordnung, dann werde ich in den sicherheitsrelevanten Bereichen mit Sessions arbeiten.
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.
Kannst Du bitte noch beschreiben (es genügt auch ein Link dazu, wenn es eine bestimmte Prozedur ist) was Du mit "eindeutiger Kennung" meinst?
Auf jeden Fall vielen Dank für die Antwort, das hat mir schon erheblich weitergeholfen.
Mit freundlichen Grüßen
Manfred
Holladiewaldfee,
Kannst Du bitte noch beschreiben (es genügt auch ein Link dazu, wenn es eine bestimmte Prozedur ist) was Du mit "eindeutiger Kennung" meinst?
Spendiere jedem Formular eine einzigartige ID und trage diese beim Verarbeiten der Formulardaten in eine Datenbank ein. Zuvor überprüfst Du, ob eine ID bereits eingetragen ist / ob alle nötigen IDs schon eingetragen sind.
Ciao,
Harry
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.
Kannst Du bitte noch beschreiben (es genügt auch ein Link dazu, wenn es eine bestimmte Prozedur ist) was Du mit "eindeutiger Kennung" meinst?
Eine Zufallszahl aus einem angemessen großen Wertebereich. Je größer der Bereich, desto schwieriger ist es, die richtige Nummer zu erraten.
Für jedes ausgegebene Formular erzeugst Du so eine eindeutige Kennung. Diese gibst Du einmal in einem <input>-hidden-Element dem Formular mit auf den Weg, zum zweiten speicherst Du sie in einer internen Tabelle.
Beim Empfang eines ausgefüllten Formulars löschst Du die in den Daten mitgelieferte Kennung wieder aus der Tabelle.
Damit ein Formular gültig ist, muß es lediglich eine bekannte Kennung besitzen. Ein Formular mit unbekannter Kennung ist entweder gefälscht (weil Du die Kennung garnicht ausgegeben hast) oder wurde doppelt abgeschickt (weil Du die Kennung zwar ausgegeben, aber ja schon nach ersten Empfang wieder gelöscht hattest).
Hier im Forum wird diese Methode angewandt, wirf mal einen Blick in den Quelltext dieser Seite.
Quereinstieg kannst Du verhindern, indem Du in dieser Kennung einen verschlüsselten bzw. nicht sofort offensichtlichen Wert einfügst, der die bereits abgearbeiteten Formulare kennzeichnet.
Das ist aber sicherlich weniger oft von Bedeutung, da sich die Formularabfolge in der Regel schon aus den bereits eingegebenen Daten ergibt.
Gruß,
soenk.e
Holladiewaldfee,
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.
Du darst keiner einzige User-Eingabe trauen und mußt alles überprüfen. Aber wenn Du eine Variable einmal geprüft hast, dann kannst Du Sie im Normalfall auch ein zweites mal prüfen.
Deshalb habe ich mir gedacht, die Variable $_SERVER["HTTP_REFERER"] zu benutzen, um zu überprüfen, ob die Seite, die die Variablen mit POST übermittelt wirklich von meinem eigenen Root-Server kommt.
Schlechte Idee ...
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?
Nein, der Referer kann beliebig gefälscht werden, und das ist gar nicht mal so schwer. Der Referer wird vom Clienten gesendet - also darfst Du ihm nicht trauen.
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?
Zwischenergebnisse in einer Session oder in der Datenbank abspeichern (Identifikation über Hash-Key) etc.
Ciao,
Harry
Hallo,
Zwischenergebnisse in einer Session oder in der Datenbank abspeichern (Identifikation über Hash-Key) etc.
Danke für die Antwort, es wird wahrscheinlich auf die Lösung mit einer Sessions hinauslaufen.
Mit freundlichen Grüßen
Manfred