CSRF-Schutz in AJAX-Anfragen mit MVC2

8

Die Seite, die ich erstelle hängt stark von AJAX ab. Grundsätzlich gibt es nur eine "Seite" und jede Datenübertragung wird über AJAX abgewickelt. Da zu optimistisches Caching auf der Browser-Seite zu seltsamen Problemen führt (Daten nicht neu geladen), muss ich alle Anfragen (auch Lesevorgänge) mit POST durchführen - das erzwingt ein Reload.

Jetzt möchte ich die Seite gegen CSRF verhindern. Bei der Formularübergabe funktioniert die Verwendung von Html.AntiForgeryToken() einwandfrei, aber in der AJAX-Anfrage muss ich das Token manuell anhängen. Gibt es etwas Out-of-the-Box verfügbar?

Mein aktueller Versuch sieht so aus:

Ich würde gerne die vorhandene Magie wiederverwenden. % Co_de% ist jedoch privat und ich möchte nicht in MVC herumhacken. Die andere Möglichkeit besteht darin, eine Erweiterung wie

zu schreiben %Vor%

Das ist etwas hacky und lässt das größere Problem ungelöst: Wie man dieses Token überprüft? Die Standardverifikationsimplementierung ist intern und fest gegen die Verwendung von Formularfeldern codiert. Ich habe versucht, eine leicht modifizierte HtmlHelper.GetAntiForgeryTokenAndSetCookie zu schreiben, aber es verwendet eine ValidateAntiForgeryTokenAttribute , die privat ist und ich wollte das auch nicht kopieren.

An dieser Stelle scheint es einfacher zu sein, eine selbstgewählte Lösung zu finden, aber das ist wirklich doppelter Code.

Irgendwelche Vorschläge, wie man das auf intelligente Weise macht? Fehle ich etwas völlig Offensichtliches?

    
mnemosyn 28.02.2010, 04:41
quelle

1 Antwort

10

Sie könnten den konventionellen Helfer Html.AntiForgeryToken() verwenden, um irgendwo auf der Seite (nicht unbedingt in einem Formular) ein verstecktes Feld zu erzeugen und es entlang der Ajax-Anfrage einzufügen:

%Vor%

Um es auf der Serverseite zu verifizieren:

%Vor%

Wenn Sie mehrere Tokens auf Ihrer Seite haben, müssen Sie möglicherweise angeben, welches Sie einschließen möchten. Da der vorhandene Helper die versteckten Felder mit den gleichen Namen erzeugt, ist es schwierig, einen guten Selektor zu erstellen, so dass Sie sie in Spannen platzieren können:

%Vor%

und wählen Sie dann das entsprechende Token:

%Vor%     
Darin Dimitrov 28.02.2010, 09:04
quelle