it-swarm.com.de

Wie kann ich angesichts des CSRF-Schutzes mit einem extrem langsamen Benutzer umgehen?

Wir verwenden in allen unseren Formularen, die Daten über HTTP POST senden, ein Cookie CSRF . Standardmäßig lebt das CSRF-Cookie das Sitzungscookie um mehr als 2 Stunden aus, um sicherzustellen, dass es für Benutzer, die noch eine gültige Sitzung haben, nicht abläuft. Wir benachrichtigen Benutzer über Sitzungen, die bald ablaufen, und geben ihnen die Möglichkeit, diese zu verlängern.

Gestern habe ich einen Bericht über einen Fehler erhalten, der verhindert hat, dass sich jemand anmeldet. Als ich nachforschte, stellte ich fest, dass der Benutzer zu unserem Anmeldeformular gelangt war (das eine Sitzung erst nach dem Absenden startet) . zwölf Stunden vor dem tatsächlichen Absenden des Formulars. Dies führte zu einem kryptischen Fehler "Nicht berechtigt, diese Seite zu sehen" aus dem von uns verwendeten Framework.

Ich habe darauf geachtet, diesen Fehler informativer zu gestalten, damit jemand NICHT etwas Bösartiges versucht und den Benutzer vorsieht, das Problem zu beheben.

Was ist der richtige Weg, um mit Situationen umzugehen, in denen der Benutzer nur eine bestimmte Zeit hat, um etwas zu tun, bevor er es nicht kann? Ich denke nur daran, die Seite einige Minuten vor Ablauf des CSRF-Cookies zu aktualisieren, um zu verhindern, dass sie abläuft (oder das Token neu zu generieren), und diesen Countdown zu stoppen, wenn Tastatur-/Fokusereignisse ausgelöst werden, um das erneute Laden eines Benutzers in der Ecke zu verhindern während sie tippen. JS ist eine Voraussetzung, um das System verwenden zu können. Es ist für uns einfach nicht praktisch, damit umzugehen, dass es deaktiviert ist.

Dies ist kein "typisches" zeitgesteuertes Ereignis, da die meisten Benutzer CSRF-Token nicht kennen und sich nicht darum kümmern oder wann sie ablaufen. Es ist nicht wie bei einer Quizseite, auf der der Benutzer 30 Sekunden Zeit hat, um eine Frage zu beantworten. Dies sollte etwas sein, das der Benutzer nie sieht.

Ich bin mir ziemlich sicher, dass ich nicht die erste Person bin, die auf dieses Szenario stößt. Ich frage mich also, ob es eine Standardmethode gibt, um damit umzugehen.

11
Tim Post

Da Javascript erforderlich ist, führen Sie einfach eine kleine AJAX - Anfrage hinter den Kulissen durch, da das Cookie bald abläuft, um es zu aktualisieren. Der Benutzer muss nichts darüber wissen (vorausgesetzt, es sendet fast keine Daten - mobile Benutzer sollten nicht überrascht sein, wenn sie ihre Datenmenge verwenden), und das aktualisierte Cookie kann mit der Antwort gesetzt werden.

Das Aktualisieren der gesamten Seite scheint übertrieben, insbesondere wenn sich auf der Seite ein Formular befindet, das möglicherweise gelöscht wird, wenn dies geschieht.

Ein bisschen mehr hier: http://www.bennadel.com/blog/1995-AJAX-Requests-Get-And-Set-Cookies-Like-Any-Other-HTTP-Request.htm

8
Andrew Leach

Die Lösung, die Sie in Ihrer Frage beschreiben, klingt wie ein Gewinner. Basierend auf Ihrer Beschreibung der Situation muss die Lösung den Countdown zurücksetzen, ohne die Aktivitäten eines Benutzers zu beeinträchtigen. Ein Skript, das die Seite aktualisiert und bei Maus- oder Tastatureingaben pausiert, behebt das Problem.

Ich würde ein weiteres "Feature" hinzufügen: Zeigen Sie eine Flash-Nachricht mit einem Countdown während der letzten 10 Sekunden an, um den Benutzer über die bevorstehende Aktualisierung zu informieren, falls er sich entscheidet, die Aktion im letzten Moment auszuführen und nicht abgeschlossen werden kann es. Die Nachricht sollte ungefähr so ​​lauten:

Das Cookie für die Anmeldeberechtigung läuft in X Sekunden ab. Die Seite wird dann neu geladen. Warten Sie mal.

Ich habe absichtlich "Anmeldeberechtigung" verwendet, weil die normale Person nicht weiß oder sich nicht darum kümmert, was CSRF ist.

3
dnbrv

Wenn Ihre Empfangsanforderung mit abgelaufenem Cookie ausgeführt wird, führen Sie eine Umleitung der Zielseite aus, die das Cookie neu generiert und genau dieselbe Anforderung wiederholt, anstatt einen Fehler zu generieren. Fügen Sie dieser Anforderung ein zusätzliches Feld hinzu, das angibt, dass es sich um eine Regenerationsanforderung handelt. Wenn es erneut fehlschlägt, hat der Benutzer tatsächlich ein Problem, das mit der Regeneration nicht gelöst werden kann, und erst dann müssen Sie einen Fehler anzeigen. Dies sollte den Prozess für den Benutzer vollständig transparent machen und kein bestimmtes Timing zum Aktualisieren des Cookies erfordern.

1
Oleg V. Volkov