2016-08-16 4 views
0

Ok, noch versuche, meinen Kopf herum zu wickeln, was sie sind, und für ..believe mich brauchte Ich habe viel auf sie lesen und denken Ich verstehe, aber ich wahrscheinlich nicht ...CSRF-Token benötigt?

Die nächstgelegene ich kann bekommen ist, dass sie auf jeden Fall benötigt, wenn Sie sich in Seiten haben in irgendeiner Form auf Ihrer Website ...

Meine Frage ist, wenn Sie grundlegende Kontaktformular und/oder Fill-in Form für jede haben Grund ... benötigen Sie CSRF-Tokens für diese Seiten?

+0

ja - kann nicht schaden, da sie als Kontaktformulare Schutz gegen Massenmissbrauch helfen, Foren etc. sind große Ziele für Spammer so ein csrf Token Prüfmechanismus aufweist, ist nur gut – RamRaider

Antwort

1

CSRF-Token sind nicht ‚benötigt auf jeden Fall‘ (wie in, werden Formen, ohne sie arbeiten), aber sie sind eine extrem gute Idee, wenn alle Daten von einer Webseite einreichen, zu einer anderen Webseite/script. Es gibt bemerkenswert wenig Weg von vertrauen, dass alle Daten page 2 erhalten von page 1 kam (Abbildung unten lesen). Jede Seite in Isolationen hat keine Ahnung, auf welcher Seite der Benutzer zuvor war, und selbst Dinge, die darauf hinweisen sollen, wie $_SERVER['HTTP_REFERER'], können von Browserbenutzern leicht manipuliert werden.

CSRF Token sind Seiten-zu-Seite-Schlüssel, die der empfangenden Seite ein wesentlich höheres Maß an Vertrauen geben, dass der Besucher von den beabsichtigten Absenderseite (n) kam. Deployed Eigentum können sie auch Datenwiederholung zu verhindern, die auch ein großer Bonus ist und auf skrupellose Spam und verschwendete CPU-Zyklen reduziert.


Ein Aspekt, der CSRF-Token kann verwendet werden für:

Angenommen, Sie auf einer Seite ein Formular haben, die Seite page1.php genannt wird, und die Form ist ein send contact email, wo das Formular ausgefüllt und dann gesendet, kann die Seite, an die es gesendet wird (page2.php) erstellen und dann eine Kontakt-E-Mail an den beabsichtigten Empfänger senden.

Von diesem der nächste Schritt ist jemand kann den Quellcode der page1.php Form lesen. Das ist trivial einfach und sagt den Leuten, was $_POST Werte gibt und die Position des Ziels, an das das Formular gesendet wird (page2.php).

Ein einfacher Benutzer lädt Ihre page1.php, verbringen zehn Minuten schriftlich eine sorgfältig formulierte E-Mail vor dem Drücken der SEND Schaltfläche und Absenden des Formulars. Aus dem Formular geht an die page2.php, die ihre Details in eine E-Mail erstellt, die an [email protected] gesendet wird.

Nun, wenn jemand den Quellcode von page1.php nimmt sie einen einfachen PHP-Skript (oder einen anderen Code) Verarbeitung verwendet Hunderte oder Tausende von Spam-Formen page2.php, jeder von ihnen mit den richtigen Details zu senden zu generieren und senden Aus einer Email kann diese für verschiedene nafariöse Prozesse verwendet werden, sie können Formulare von zahlreichen anderen Webseiten, beliebigen anderen Teilen des Internets oder sogar von ganzen Botnets senden, wenn sie sich dazu entscheiden - page2.php würde mit vielen Anfragen eine Sekunde überflutet werden und die Empfänger der E-Mails wird eine Mailbox vollgestopft mit nutzlosen formgenerierten Nachrichten haben.

Geben Sie CSRF-Token

Ein CSRF-Token ist ein eindeutiger Schlüssel, der in Form gespeichert wird, bei der Erzeugung auf page1.php und würde in der Regel (aber nicht ausschließlich) verwenden (möglicherweise zufällig) erzeugten $_SESSION Werte so, dass, wenn Das Formular wird gesendet und die $_POST Daten werden an page2.php gesendet. Dies ist eine ziemlich zuverlässige Überprüfung, dass das Formular von der gleichen Website gesendet wird. Anstatt also ganze Botnets, die Daten an page2.php senden und viele E-Mails senden, werden die Daten nicht verarbeitet und stattdessen werden nur die von der gleichen Website gesendeten Seiten im Skript page2.php ausgeführt.

Alternativ können Sie, wenn die obige Situation eintritt, auch verfolgen, wo schlechte Übermittlungen kommen und andere Prozesse/Skripte verwenden, um andere Botnets/Server daran zu hindern, Daten an Ihren Server zu senden.


Die obige Abbildung ist eine Form von Versicherung und Prozesssteuerung, so dass Sie eine starke reliablility, dass Daten, die auf page2.php durch eine CSRF passiert:

if ($_SESSION['key'] === $_POST['key']){ 
    unset($_SESSION['key']); ///prevent repetition 
     ... 
     send email 
    } 

(zum Beispiel).

Diese if-Anweisung wird nur mit Formulardaten ausgeführt, die zuverlässig von einer zuverlässigen Quelle gesendet wurden (page1.php). Damit verhindern Sie, dass andere Server Ihre Skripte piggybacken, und verhindern krasse DOS-Angriffsversuche, die Ihre page2.php und andere positive Dinge überladen, weil sie wissen, dass page1.php die Daten gesendet hat, die unter page2.php verwendet werden.

Ein weiterer Aspekt CSRF-Token für

im Code Siehe verwendet werden, über die ich $_SESSION CSRF Wert unset? Dies bedeutet, dass wenn Sie F5 drücken oder den page2.php Besuch aktualisieren (indem Sie ihn in Ihren Browser eingeben oder sonstwie) werden die Originaldaten nicht erneut erneut gesendet. Dies kann verhindern, dass Benutzer ein Formular einmal ausfüllen und dann wie ein wütender Teenager in einem Forum erneut senden (POST-Daten werden immer in der Seite HTTP-Header gespeichert und beim Aufruf der Seite erneut übermittelt, so dass das Deaktivieren von $_POST Daten in PHP sinnlos ist .).


CSRF ist ein Sicherheitsmechanismus, der - wenn der CSRF-Token-Test bestanden wird - bedeutet, dass Sie sicher, dass die Daten an ein Skript gesendet beurteilen können auf dem Server von einem gültigen kam und Quelle bestimmt.

+0

wow. Vielen Dank, dass Sie sich die Zeit genommen haben, diese durchdachte und durchgehende Antwort zu schreiben. es wird sehr geschätzt. Ich habe eine Frage basierend auf dem, was Sie gesagt haben ... wenn Sie nichts dagegen haben =) ... wenn meine Form, dh "page1.php" direkt auf die 'PHPMailer' Seite statt' page2.php geht "... ändert sich dadurch die Notwendigkeit, die Tatsache zu überprüfen, dass es von derselben Website stammt? Übrigens, ich mag deine witzige Analogie von wütendem Teenager im Forum ... =) .... obwohl wer sagt, dass sie nur Teenager sind?=) – user273072545345

+0

'page2.php' ist das gleiche wie die PHPMailer Seite, es ist eine resultierende Seite, die macht, was immer du willst,' page2.php' kann jede Seite sein, egal was. Es muss keine HTML-Ausgabeseite sein, sondern nur eine Seite, die die Daten verarbeitet, die von 'page1.php' an sie gesendet werden. Bevor Sie etwas an das PHPMailer-Objekt senden, sollten Sie die 'if'-Anweisung ausführen, um die Gültigkeit der gesendeten Daten zu überprüfen. – Martin