HTTP_REFERER in Zusammenhang mit Formularüberprüfung
Richard
- php
0 Der Martin
0 Richard
0 Vinzenz Mai0 Richard0 Vinzenz Mai0 Richard
Hallo,
Ich habe ein Kontaktformular das sich bei Submit selbst aufruft und dessen Eingaben mittels PHP überprüft werden. Dieses Script überprüft also, ob POST-Daten übermittelt wurden, wenn nicht, gibt´s Mecker.
Wenn ich die Seite mit dem Formular von woanders aufrufe, wurden aber auch keine Daten übermittelt, folglich wird auch dann gemeckert. Also habe ich eine Abfrage dazwischengeschaltet, die $_SERVER['HTTP_REFERER'] überprüft und den Check nur dann durchführt, wenn der Eintrag dort die Datei mit dem Formular ist (PHP_SELF).
Ich wollte allerdings nicht das Rad neu erfinden und gleich mit dem Vorschlaghammer drauflosgehen. Gibt es vielleicht eine elegantere Lösung?
Beste Grüße
Hallo Richard,
Ich habe ein Kontaktformular das sich bei Submit selbst aufruft ...
und damit machst du dir selbst die Sache schwierig.
Dieses Script überprüft also, ob POST-Daten übermittelt wurden, wenn nicht, gibt´s Mecker.
Wenn dieses Script, also die Auswertung und Bearbeitung der Formulardaten, vom Formular selbst (Eingabemaske) getrennt ist, ist das überhaupt kein Problem.
Also habe ich eine Abfrage dazwischengeschaltet, die $_SERVER['HTTP_REFERER'] überprüft und den Check nur dann durchführt, wenn der Eintrag dort die Datei mit dem Formular ist (PHP_SELF).
Was ist, wenn ich die URL deines Kontaktformulars direkt aufrufe? Wenn ich sie als Bookmark abrufe? Wenn jemand direkt auf dein Kontaktformular verlinkt? Wenn ich ein Privacy-Tool verwende, das den Referer ausfiltert? Wenn ich einen Browser verwende, bei dem ich die Übermittlung des Referers abgeschaltet habe? In all diesen Fällen kommt _kein_ Referer oder der einer anderen Seite bei dir an, und deine Falle schnappt zu. In allen skizzierten Fällen IMHO unberechtigt.
Ich wollte allerdings nicht das Rad neu erfinden und gleich mit dem Vorschlaghammer drauflosgehen. Gibt es vielleicht eine elegantere Lösung?
Ich würde, wie gesagt, das Formular selbst vom auswertenden Script trennen. Was soll's, wenn die Formularseite zigmal abgerufen wird? Das stört doch nicht. Und das auswertende Script prüft dann auf Plausibilität der POST-Daten. Um die Sache noch ein bisschen besser zu machen, könntest du im Formular noch zwei oder mehr hidden-Felder unterbringen, deren Inhalte in einer bestimmten Beziehung stehen müssen. Diese Beziehung kann dein Script dann zusätzlich kontrollieren.
So long,
Martin
Hallo Der Martin,
Ich habe ein Kontaktformular das sich bei Submit selbst aufruft ...
und damit machst du dir selbst die Sache schwierig.
Das hat den Grund, dass die Fehlermeldungen dann direkt in die Seite integriert sind und nicht optisch aus dem Inhalt gerissen werden.
Also habe ich eine Abfrage dazwischengeschaltet, die $_SERVER['HTTP_REFERER'] überprüft und den Check nur dann durchführt, wenn der Eintrag dort die Datei mit dem Formular ist (PHP_SELF).
Was ist, wenn ich die URL deines Kontaktformulars direkt aufrufe? Wenn ich sie als Bookmark abrufe? Wenn jemand direkt auf dein Kontaktformular verlinkt? Wenn ich ein Privacy-Tool verwende, das den Referer ausfiltert? Wenn ich einen Browser verwende, bei dem ich die Übermittlung des Referers abgeschaltet habe? In all diesen Fällen kommt _kein_ Referer oder der einer anderen Seite bei dir an, und deine Falle schnappt zu. In allen skizzierten Fällen IMHO unberechtigt.
Dafür kann ich ja vorweg abfragen, ob in HTTP_REFERER überhaupt etwas steht.
Beste Grüße
Hallo Richard,
Wenn ich die Seite mit dem Formular von woanders aufrufe, wurden aber auch keine Daten übermittelt, folglich wird auch dann gemeckert.
hier solltest Du ansetzen.
Also habe ich eine Abfrage dazwischengeschaltet, die $_SERVER['HTTP_REFERER'] überprüft und den Check nur dann durchführt, wenn der Eintrag dort die Datei mit dem Formular ist (PHP_SELF).
Das ist keine gute Idee. Manche Benutzer haben keinen Einfluß auf den Referrer, der ihren Anfragen mitgegeben wird, manche verändern diese Information auch ganz bewußt.
Ich wollte allerdings nicht das Rad neu erfinden und gleich mit dem Vorschlaghammer drauflosgehen. Gibt es vielleicht eine elegantere Lösung?
Überprüfe doch die möglichen Submit-Methoden :-)
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
Überprüfe doch die möglichen Submit-Methoden :-)
Wie meinst du das? Was sind Submit-Methoden? GET & POST?
Beste Grüße
Hallo Richard,
Überprüfe doch die möglichen Submit-Methoden :-)
Wie meinst du das? Was sind Submit-Methoden? GET & POST?
Nö, meine ich nicht. Du hast aber typischerweise ein Formularelement oder mehrere Formularelemente, das für das Absenden verantwortlich ist (sind). Überprüfe, ob eines davon genutzt wurde.
Freundliche Grüße
Vinzenz
Hallo,
Überprüfe doch die möglichen Submit-Methoden :-)
Wie meinst du das? Was sind Submit-Methoden? GET & POST?Nö, meine ich nicht. Du hast aber typischerweise ein Formularelement oder mehrere Formularelemente, das für das Absenden verantwortlich ist (sind). Überprüfe, ob eines davon genutzt wurde.
Danke, so hab ich´s jetzt gemacht. Ich habe dem Submit-Button, der auch wirklich ein Button ist (kein input...), ein value verpasst, auf welches das $_POST-Array überprüft wird. Genau das gibt mir aber immernoch zu denken: _Wenn_ es ein <input type="submit">
wäre, hätte value ja bekanntlich noch andere Folgen. Das kann´s doch auch noch nicht sein?
Beste Grüße
Hallo Richard,
Nö, meine ich nicht. Du hast aber typischerweise ein Formularelement oder mehrere Formularelemente, das für das Absenden verantwortlich ist (sind). Überprüfe, ob eines davon genutzt wurde.
Wenn_ es ein
<input type="submit">
wäre, hätte value ja bekanntlich noch andere Folgen.
Nein. Ist mir nicht bekannt. Welche?
Das kann´s doch auch noch nicht sein?
Was denn? Ich nutze genau diese Methode sehr ausgiebig. Mit <input type="submit">. Wo siehst Du ein Problem?
Freundliche Grüße
Vinzenz
echo $begrüßung;
Ich nutze genau diese Methode sehr ausgiebig. Mit <input type="submit">. Wo siehst Du ein Problem?
Es ist nicht eindeutig spezifiziert, dass mindestens ein Submit-Button-Name-Value-Paar (so name und value vorhanden sind) mitgeliefert werden muss. Es ist eigentlich nur die Rede davon, dass "successful controls" zu übertragen sind. Ist nun ein Button "successful", der nicht gedrückt wurde, weil das Formular per Enter abgesendet wird? FF und Opera beantworten diese Frage mit einem Ja, wobei sie sich wohl auch nicht einig sind, welcher Button es sein soll, wenn es mehrere davon gibt, der IE beantwortet sie mit Nein.
Ein <input type=hidden ...> ist eine Alternative, die mit jedem Browser funktionieren sollte.
echo "$verabschiedung $name";
Hallo Vinzenz,
Wenn_ es ein
<input type="submit">
wäre, hätte value ja bekanntlich noch andere Folgen.Nein. Ist mir nicht bekannt. Welche?
<input type="submit" name="submit" value="Absenden">
bewirkt einen Submit-Button mit der Aufschrift "Absenden" ...
Das kann´s doch auch noch nicht sein?
Was denn? Ich nutze genau diese Methode sehr ausgiebig. Mit <input type="submit">. Wo siehst Du ein Problem?
... und dieser value wird übermittelt. Ich halte es für plump, die übermittelten Daten anschließend auf ein "Absenden" zu überprüfen.
Und was ist mit der von dedlfix angesprochenen Problematik? So ganz schlau bin ich aus seinen Ausführungen nicht geworden. Aber was ist denn nun, wenn jemand das Formular mit der ENTER-Taste abschickt?
Beste Grüße
echo $begrüßung;
Und was ist mit der von dedlfix angesprochenen Problematik? So ganz schlau bin ich aus seinen Ausführungen nicht geworden. Aber was ist denn nun, wenn jemand das Formular mit der ENTER-Taste abschickt?
Erstelle dir ein Formular, das mindestens ein Texteingabefeld und mehrere Submit-Buttons enthält. In einem weiteren Versuch solltest du auch mal einen Submit-Button vor das Eingabefeld setzen. Setze den Cursor in das Texteingabefeld und drücke Enter. Schau dir die vom Browser gesendeten Daten an. Führe diese Versuche mit IE, FF und Opera durch. Außerdem solltest du die von mir erwähnte/verlinkte Stelle der HTML-Spezifikation ansehen. Danach, meine ich, solltest du meine Ausführungen besser verstehen.
echo "$verabschiedung $name";