2009-02-05 3 views
7

In ASP.net implementiere ich ein IHttpModule, CSRF-Angriffe zu lindern. Es injiziert in die Antwort html einen versteckten Formularparameter mit der asp.net SessionID auf GETs. Bei POSTs überprüft es dann, ob der Wert des ausgeblendeten Parameters mit der aktuellen SessionID übereinstimmt. Soweit ich weiß, kann der SessionID-Wert nur aus dem Cookie abgerufen werden, der von der schädlichen Website nicht gelesen oder bestimmt werden konnte. Gibt es etwas, was ich übersehe?CSRF Validierungs-Token: Sitzungs-ID sicher?

Antwort

8

Dieser Ansatz ist richtig. Sie müssen sicherstellen, dass alle über eine GET-Operation verfügbaren Aktionen "sicher" sind (was ohnehin empfehlenswert ist), da Sie Ihren XSRF-Schutz nur auf POSTs anwenden.

Für eine zusätzliche Versicherung könnten Sie es auch auf GETs verwenden (indem Sie allen Ihren Links einen URL-Parameter hinzufügen und bei jeder GET-Anfrage darauf achten), aber das ist umständlich.

Wenn Sie extra paranoid sind, können Sie eine andere Zufallszahl für die alternative ID wählen. Dies würde Sie schützen, selbst wenn ein Browser Ihr Session-Cookie fälschlicherweise für feindliches Javascript auf einer anderen Site zugänglich macht. Wenn eine Sitzung erstellt wird, wählen Sie eine andere große Zufallszahl und speichern Sie sie in Ihrer Sitzung.

+0

Ich werde mich jetzt wahrscheinlich nicht um die GETs kümmern, da es nicht gültig (aber offensichtlich möglich) ist, dass http den Status mit ihnen ändert. Solange wir diese Konvention/diesen Standard einhalten, sollte es uns gut gehen. Ich kann prüfen, ob ich einen anderen Wert als die SessionID für zusätzliche Sicherheit verwende, wie du erwähnt hast - danke. – ironsam

6

Idealerweise möchten Sie etwas anderes als Session-ID verwenden, aber das ist es im Grunde. OWASP schlägt vor, einen zufälligen Formularelementnamen zu verwenden, der in der Benutzersitzung gespeichert wird. Auf diese Weise würde ein Angreifer nicht einmal in der Lage sein, das korrekte versteckte Feld zu fälschen.

http://www.owasp.org/index.php/Top_10_2007-A5#Protection

+0

Die Randomisierung des Formularelementnamens ist eine interessante Idee. Danke für den Link. – ironsam