2017-05-09 1 views
0

Wir haben eine SaaS-Plattform entwickelt, die es Benutzern ermöglicht, eine Nachricht zu erstellen und über einen vorgegebenen alphanumerischen Code auf jedem Werbemedium zu teilen.CSRF - Gracefully Fail Stale Sessions

Alle unsere Formulare verwenden ein CSRF-Token, aber ich habe ein Problem festgestellt. Wenn ein Benutzer seine Nachricht bearbeitet, dann eine Pause macht und zurückkehrt, um die Bearbeitung zu beenden, werden die Treffer mit der Warnmeldung "CSRF Mismatch" angezeigt. Dies ist ein kritisches Problem, da die Seite aktualisiert werden muss und ihre Änderungen verloren gehen müssen, um ein gültiges Token neu zu generieren.

Das erste CSRF-Token wird basierend auf statischen Parametern wie Dateiname und php_uname() generiert, aber es wird auch über session_id() generiert. Wenn sich die session_id ändert, wird ein neues CSRF-Token generiert, das offensichtlich nicht mit dem alten Token übereinstimmt, das zu der Warnmeldung führt.

Es wäre einfach genug, den CSRF-Schutz in Formularen zu deaktivieren, für die eine Benutzerauthentifizierung erforderlich ist. Es gibt jedoch einige Formulare, für die keine Authentifizierung erforderlich ist, beispielsweise die Benutzeranmeldung. Zugegeben, es ist keine große Sache, das "CSRF-Mismatch" bei einer Benutzeranmeldung zu zeigen, aber es sieht für Benutzer, die keine Ahnung haben, was das bedeutet, wackelig aus, und wird am Ende "schrauben" und die Seite verlassen.

Also suche ich nach einer alternativen Lösung, um einen Anschein von Formschutz beizubehalten, ohne eine wertlose Warnmeldung zu erzeugen.

Zwei mögliche Lösungen ...

1) Statt eine CSRF basiert weg Sitzungs_ID zu erzeugen, erzeugen sie eine Cookie-Wert basiert weg, wird diese anmutige Quer Session Handling ermöglichen.

2) CSRF insgesamt löschen. Überprüfen Sie stattdessen den REFERER aller Formularposts, und wenn sie der übergeordneten Domäne entsprechen, fahren Sie fort. Dadurch wird sichergestellt, dass andere Websites nicht auf unseren Formularen posten (der Hauptzweck von CSRF). Wir verwenden diese Lösung tatsächlich für unsere Ajax-Anfragen.

Wir neigen zu Option # 2 aber wollten überprüfen, ob es andere anmutige Lösungen zu berücksichtigen gab.

+0

Verwenden Sie nicht REFERER, es ist trivial zu spoofen und kann nicht vertraut werden. –

+0

@AlexHowansky: Guter Punkt, bemerkt. –

Antwort

0

Ich endete mit Option # 1 (Cookie-Lösung), und behandeln Sie die CSRF-Seeding genau wie eine dauerhafte Login-Cookie. Wenn der Seed in der aktuellen Sitzung nicht verfügbar ist, überprüfen Sie den Cookie, falls vorhanden, füllen Sie die aktuelle Sitzung. Scheint gut zu funktionieren und geht über veraltete Sitzungen hinaus.