Frage:
Was ist der richtige Weg, um Anti-CSRF-Formular-Token zu implementieren?
naugtur
2010-11-12 13:58:57 UTC
view on stackexchange narkive permalink

Ich bin mir CSRF voll bewusst und habe bereits einige sichere Formulare implementiert, aber ich war noch nie mit den Ergebnissen zufrieden.

Ich habe Token als MD5 erstellt von Benutzername, Formularinfo und einem Salz und speicherte es in einer Sitzung. Dies hat ein Problem mit dem Durchsuchen von Registerkarten (kann durch Beibehalten einer Reihe aktiver Hashes behoben werden) und mit dem Timing. Ich möchte, dass meine Hashes nur für z. 10 Minuten, aber wie füge ich eine zeitbezogene Variable in den Hash ein?

Kann mich jemand auf eine gute Ressource verweisen, die beschreibt, wie CSRF-Sicherheit richtig gemacht wird?

Fünf antworten:
Andreas Arnold
2010-11-12 18:37:29 UTC
view on stackexchange narkive permalink

Es gibt eine gute Erklärung für OWASP: OWASP CSRF Prevention Cheat Sheet

Kurz gesagt, es gibt zwei Möglichkeiten:

  1. Fügen Sie jeder Benutzersitzung ein zufälliges Token hinzu. Nur wenn dieses Token vorhanden und korrekt ist, werden die Änderungen übernommen, andernfalls sollte die Anforderung abgelehnt werden. Es ist wichtig, dass das Token nur mit einer POST-Anforderung gesendet wird, da GET-Anforderungen das Token an verschiedene Stellen (Browserverlauf, Protokolldateien usw.) übertragen können.

    Es ist auch möglich, ein Token zu generieren pro Anfrage, aber dies führt zu Usability-Problemen. Zum Beispiel würde die Zurück-Taste nicht mehr richtig funktionieren. Aber natürlich würde die Sicherheit erhöht.

    Stellen Sie außerdem sicher (um die Sicherheit noch weiter zu verbessern), dass das Token nur über TLS gesendet wird, damit sich kein Mann in den mittleren Problemen befindet.

  2. Die andere Option ist die Verwendung einer Herausforderung - Antwort (z. B. CAPTCHAs oder einmalige Token).

  3. ol>

    Die OWASP-Seite listet auch einige Maßnahmen auf, die nicht funktionieren. Dies sind

  • Verwenden von (geheimen) Cookies
  • Verwenden von GET-Anfragen
  • Mehrschritttransaktionen
  • URL Rewriting
Die oben verlinkte OWASP-Seite wurde aktualisiert, um zusätzlich zu den beschriebenen Token die Überprüfung "Überprüfung des gleichen Ursprungs mit Standardheadern" zu empfehlen.
AviD
2010-11-12 14:35:32 UTC
view on stackexchange narkive permalink

Der beste Weg, um den CSRF-Schutz ordnungsgemäß zu erstellen:

Nicht.

In den meisten gängigen Frameworks ist dieser Schutz bereits integriert (ASP.NET) , Struts, Ruby (glaube ich) oder es gibt bereits Bibliotheken, die bereits überprüft wurden. (z. B. CSRFGuard von OWASP).

Abhängig von Ihrem Kontext besteht eine weitere Option darin, die erneute Authentifizierung des Benutzers zu erzwingen, jedoch nur für bestimmte, vertrauliche Vorgänge.


Laut Ihren Kommentaren ist Ihre Lösung nicht schlecht, wenn Sie dies selbst implementieren müssen, aber ich würde es vereinfachen.
Sie können eine kryptozufällige Nonce generieren (lang genug) ), speichern Sie das im Sitzungsspeicher und ändern Sie es alle X Minuten (Sie speichern die Ablaufzeit auch in der Sitzung). In jedem Formular fügen Sie die Nonce in ein ausgeblendetes Formularfeld ein und vergleichen diesen Wert, wenn das Formular veröffentlicht wird.
Wenn das Formular-Token übereinstimmt, sind Sie klar. Wenn nicht, können Sie z. das vorherige Token auch, um die Randfälle zu behandeln.

Obwohl ich sagen muss, dass ich zu viele fehlgeschlagene Versuche gesehen habe, dies selbst zu implementieren, um diesen Pfad wirklich zu empfehlen. Sie sind immer noch besser dran, ein minimales Paket zu finden, das dies für Sie erledigt.

OK, das beantwortet die Frage nicht ganz. Es ist eine Website über Sicherheit, nicht Webapp-Entwicklung. Ich weiß, dass ich vorhandene Lösungen für jede Sicherheit verwenden sollte, aber hier wollte ich wissen, wie eine solche Lösung erstellt wird.
Außerdem möchte ich den CSRF-Schutz in einer App verwenden, die auf einem winzigen eingebetteten Gerät arbeitet. Kennen Sie Frameworks dafür in Bash oder Perl ohne Module? ;)
Heh, fairer Punkt zum Embedded - Sie stellen daraus eine Web-App bereit? Nach dem ersten Kommentar würde ich sagen, dass die richtige Sicherheit "Das Rad nicht neu erfinden" beinhaltet, aber wenn Sie es für eingebettete oder nur an der Theorie interessierte benötigen, werde ich meine Antwort aktualisieren.
Vielen Dank! Ich bin froh, dass ich Sie überzeugt habe, mir so einfach zu antworten. Die Leute werden oft sehr gemein, wenn ich nach Dingen frage, die nicht erneut implementiert werden sollten. ;)
Nun, Sie haben zwei überzeugende Argumente vorgebracht: 1. Ich möchte verstehen und nicht nur ein Code-Affe sein :), 2. Ich habe einen Randfall (eingebettet passt normalerweise zur Rechnung), und es gibt dort noch kein Rad.
Nasir
2015-01-05 05:26:27 UTC
view on stackexchange narkive permalink

Zusätzlich zur Antwort von @Andreas Arnold gibt es eine Alternative. Ich habe das Encrypted Token Pattern von OWasp implementiert.

Abgesehen von der Verhinderung von CSRF-Angriffen hat es den zusätzlichen Vorteil, dass die Objektsicherheit implementiert wird.

Dies können nur diejenigen tun, die berechtigt sind, Objekte zu ändern. Andere haben nicht den richtigen / gültigen Chiffretext oder Schlüssel. Normalerweise verschlüssele ich sessionId , timestamp , userId und / oder recordId .

timestamp verhindert replayAttacks. sessionid isoliert Änderungen nur an dieser Sitzung userId isoliert Änderungen nur an diesem Benutzer. Wenn Sie recordId einschließen Auf Kosten der zusätzlichen Verarbeitung erhalten Sie mehr Sicherheit.

Zeitstempel verhindern nur die Wiedergabe außerhalb eines konfigurierten Zeitlimits. Sie sollten dafür eine Nonce verwenden. Eine weitere gute Eigenschaft des Musters für verschlüsselte Token besteht darin, dass es keinen Serverstatus erfordert (d. H. Keine Sitzung) und somit die horizontale Skalierbarkeit erleichtert (z. B. keine Sitzungsreplikation, keine Sticky-Sitzung).
Nev Stokes
2010-11-14 00:20:53 UTC
view on stackexchange narkive permalink

Ich glaube nicht, dass es viel Falsches gibt (obwohl ich mich vielleicht irre;), einen Zeitstempel in das zu hashende Token aufzunehmen und diesen Zeitstempel als verstecktes Formularfeld einzuschließen - möglicherweise hexadezimal als grundlegende Verschleierung codiert -, können Sie Überprüfen Sie dann bei der Einreichung, ob sie abgestanden sind.

Ein Zeitstempel hat keine ausreichende Entropie. Wenn Sie es als Eingabe für eine PRF zusammen mit einem kryptografischen Schlüssel verwendet haben, der keinem Client bekannt gegeben wird, funktioniert dies möglicherweise, ist jedoch unnötig komplex. Vermeiden Sie es besser, eigene zu erstellen, und verlassen Sie sich auf eine gut überprüfte Implementierung, wie von AviD empfohlen.
pauld
2013-02-20 01:30:20 UTC
view on stackexchange narkive permalink

Ich neige dazu zu denken, dass der tokenbasierte CSRF-Schutz ziemlich leicht aufgehoben werden kann: Ein Angreifer muss nur wissen, wie er eine CSRF-geschützte Seite anfordert. Normalerweise haben diese Seiten das Token als verstecktes Feld. Der Angreifer greift dann nach dem Token von der Seite (ziemlich trivial) und verwendet ihn, um einen CSRF-Angriff zu erstellen.

Wenn Sie ein Programm verwenden, das die Seite abfragen kann, sind Sie für mich genauso ein Benutzer wie für alle anderen. Anti-CSRF soll verhindern, dass Anforderungen von einer anderen Site über einen normalen Browser gesendet werden (da der Benutzer angemeldet ist und der Browser Sitzungsinformationen sendet). Wenn Ihr angreifender Code den Seiteninhalt erhalten kann, führen Sie keine CSRF mehr durch. Sie können einfach alles posten.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 2.0-Lizenz, unter der er vertrieben wird.
Loading...