ASP.net MVC AntiForgeryToken über AJAX

8

Ich entwickle gerade eine MVC-Anwendung in ASP.net. Ich verwende AJAX.ActionLink, um einen Löschlink in einer Liste von Datensätzen bereitzustellen, dies ist jedoch sehr unsicher. Ich habe das gesagt:

%Vor%

Über die Funktion zum Löschen, die den Aufruf der Funktion einfach durch eine URL stoppt. Die andere Sicherheitslücke, die immer noch existiert, ist, dass wenn ich eine grundlegende HTML-Seite mit diesem Inhalt erstellen würde:

%Vor%

Es würde immer noch einen Beitrag ausführen, aber von einem anderen Ort.

Ist es möglich, das AntiForgeryToken mit einem AJAX ActionLink zu verwenden? Wenn ja, ist das ein sicherer Ansatz? Gibt es mehr Sicherheitslücken, die ich nicht erkannt habe?

    
j82374823749 28.08.2009, 10:05
quelle

5 Antworten

2

Ich kenne den AJAX ActionLink nicht speziell, aber es ist möglich, von einer WebForms-Seite zu einer MVC-Aktion mit den [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] -Attributen zu posten.

Sie können reflection verwenden, um die MVC-Methoden zu ermitteln, mit denen die Eingabe des Cookies und des übereinstimmenden Formulars für die MVC-Validierung festgelegt wird.

Siehe diese Antwort: Verwenden eines MVC HtmlHelper aus einem WebForm

    
Keith 01.04.2010, 09:12
quelle
9

Sehen Sie sich diese Blogpost .

  

Angenommen, Sie haben eine Aktionsmethode wie   das:

     

[AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] public ActionResult DeleteAccount(int accountId) { // delete stuff }

     

Und du rufst es über:

     

$.post('/home/DeleteAccount', { accountId: 1000 }, function() { alert('Account Deleted.'); });

     

Da der POST nicht die   AntiForgeryToken, es wird fehlschlagen.

     

Zum Glück braucht es nicht viel   Intelligenz, um das zu beheben. Der ganze Kunde   Nebenkomponente von AntiForgeryToken   does ist das Token in einem Basic   verstecktes Feld. Also musst du es einfach tun   ziehe diese Daten heraus und füge sie ein   Dein AJAX-Anruf.

     

var token = $('input[name=__RequestVerificationToken]').val();

     

$.post('/home/DeleteAccount', { accountId: 1000, '__RequestVerificationToken': token }, function() { alert('Account Deleted.'); });

     

Beachten Sie, dass wenn Sie mehrere haben   Formulare auf der Seite mit mehreren   AntiForgeryTokens, müssen Sie   Geben Sie an, welche Sie in Ihrem benötigen   jQuery-Selektor. Ein weiteres Problem ist, wenn   Sie verwenden jQuery's    serializeArray() Funktion, du wirst haben   um es ein bisschen anders hinzuzufügen:

     

var formData = $('#myForm').serializeArray(); var token = $('input[name=__RequestVerificationToken]').val(); formData.push({ name: '__RequestVerificationToken', value: token });

     

$.post('/home/DeleteAccount', formData, function() { alert('Account Deleted.'); });

Update: Der Link wurde repariert.

    
RichardOD 28.08.2009 10:21
quelle
6

Sie können AntiForgeryToken mit Ajax.ActionLink verwenden, aber Sie müssen das AntiForgeryToken wie folgt in den Header Ihrer Anfrage einfügen:

%Vor%

Dann können wir $ .ajaxPrefilter verwenden, um es in den Header einzufügen:

%Vor%

Ich schrieb einen Beitrag darüber hier . Hoffe das hilft!

    
jjwhite01 16.09.2012 10:47
quelle
6

Verwenden Sie AntiForgeryToken mit Ajax.ActionLink

Zusätzlich zu jjwhite01 Antwort; Um das Token in Formulardaten einzufügen, verwenden Sie option.data in Prefilter

%Vor%     
pippopd 11.05.2013 09:53
quelle
0

Ich habe selbst keine Ajax-Helfer benutzt, aber ich sehe keinen Grund, warum Sie keinen Link benutzen können. Persönlich würde ich einen Onload-Event-Handler verwenden, um unauffällig einen Link aus dem Formular selbst zu erstellen und dann das Formular zu entfernen.

    
Blake Pettersson 28.08.2009 10:22
quelle

Tags und Links