Ich habe eine Frage zum Stoppen von gefälschten Formularübermittlungen. Wie wäre es, wenn ich mit dem $_SERVER['HTTP_REFERER']
Ich erlaube nur Eingaben in meine Formulare von meiner Website aus? Würde das helfen?! Danke!
Antworten
Zu viele Anzeigen?Referer ist leicht zu fälschen, so dass jeder Angreifer, der eine Formularübermittlung fälschen möchte, einfach auch den Referer-Header fälschen könnte. Außerdem glaube ich nicht, dass Webbrowser verpflichtet sind, den Referer-Header zu senden, so dass möglicherweise Formularbeiträge von legitimen Benutzern ausgeschlossen werden könnten.
Versuchen Sie ein Captcha wie ReCaptcha . So verhindern Sie nicht nur, dass Spambots Ihre Website spammen, sondern Sie können auch nur die Personen "autorisieren", die Ihr Formular verwenden (zumindest bis zu einem gewissen Grad - sie müssen Ihr Formular laden, um das Captcha zu erhalten und dann eine Antwort zu senden).
HTTP-Header zu fälschen ist ziemlich einfach und sollte daher nicht für etwas verwendet werden, das strenge Sicherheitsvorkehrungen erfordert. Eine übliche Technik besteht darin, sowohl ein verschlüsseltes Cookie als auch ein passendes, verschlüsseltes Token in einer versteckten Eingabe im Formular zu senden. Das Cookie sollte ein reines HTTP-Cookie sein. Beim Absenden des Formulars wird überprüft, ob der Wert des Cookies und der Wert der versteckten Eingabe übereinstimmen. Dies hilft, seitenübergreifende Anfragefälschungen zu verhindern, da eine Anfrage an Ihre Website von einer anderen Website aus nicht erfolgreich gestellt werden kann, da entweder das Cookie (für einen MIM-Angriff) oder die versteckte Eingabe (gefälschtes Formular) fehlt. Natürlich hängt dies davon ab, dass Sie sicherstellen, dass Ihre Website ansonsten sicher ist, damit sie die Token nicht ausspähen können, um herauszufinden, was sie eingeben sollen.
Hier ist eine schöne Diskussion darüber, wie dies in ASP.NET MVC getan wird, http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/
Ein Vorschlag wäre die Verwendung eines Tokens. Wenn Sie eine der gängigen MVC-Architekturen verwenden, brauchen Sie sich keine Sorgen zu machen, da Spoofing verhindert wird. Wenn Sie jedoch wie ich mit einer benutzerdefinierten MVC-Architektur arbeiten, ist ein Token ein Ansatz. Prüfen Sie in Ihrer Datenbankklasse bei jeder CRUD-Funktion (CREATE, READ, UPDATE AND DELETE), ob das Token vorhanden ist, z.B. Das Token kann über md5 generiert werden.
public function save(){
if(isset($_SESSION['token']){
//proceed with saving
}else{
//kill it,
die;
}
}
Alternativ können Sie Ihre Webanwendung einfach mit diesem Cross-Site Request Forgery-Schutzkit integrieren. Ausprobieren aquí