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?
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
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.
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!
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.
Tags und Links asp.net-mvc asp.net security ajax