8 Stimmen

ASP.net MVC AntiForgeryToken über AJAX

Ich entwickle derzeit eine MVC-Anwendung in ASP.net. Ich verwende AJAX.ActionLink, um einen Link zum Löschen in einer Liste von Datensätzen bereitzustellen, was jedoch sehr unsicher ist. Ich habe dies gesetzt:

<AcceptVerbs(HttpVerbs.Post)>

über die Funktion, die das Löschen vornimmt, wodurch verhindert wird, dass die Funktion einfach durch eine URL aufgerufen wird. Die andere Sicherheitslücke, die immer noch besteht, ist jedoch, dass, wenn ich eine einfache HTML-Seite mit diesem Inhalt machen würde:

<form action="http://foo.com/user/delete/260" method="post">
<input type="submit" />
</form>

Es würde zwar immer noch eine Buchung durchgeführt, aber von einem anderen Ort aus.

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

9voto

RichardOD Punkte 28349

Schauen Sie sich dies an Blogbeitrag .

Angenommen, Sie haben eine Action-Methode wie so:

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

Und Sie nennen es via:

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

Da die POST nicht die AntiForgeryToken enthält, schlägt sie fehl.

Zum Glück braucht es nicht viel Gehirnschmalz, um dies zu beheben. Die gesamte Client Seite Komponente von AntiForgeryToken setzt das Token in ein einfaches verstecktes Feld. Sie müssen also nur diese Daten herausziehen und in Ihren AJAX-Aufruf einbinden.

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

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

Bitte beachten Sie, dass Sie bei mehreren Formulare auf der Seite mit mehreren AntiForgeryTokens haben, müssen Sie angeben müssen, welchen Sie in Ihrem jQuery-Selektor angeben. Ein weiteres Problem ist, wenn Sie jQuery's serializeArray() Funktion, haben Sie ein wenig anders hinzufü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 korrigiert.

6voto

jjwhite01 Punkte 91

Sie können AntiForgeryToken mit Ajax.ActionLink verwenden, aber Sie müssen den AntiForgeryToken manuell in die Kopfzeile Ihrer Anfrage einfügen:

function GetAntiForgeryToken(){
   var tokenWindow = window;
   var tokenName = "__RequestVerificationToken";
   var tokenField = $(tokenWindow.document).find("input[type='hidden'][name='" +     tokenName +   "']");
   if (tokenField.length == 0) {return null;}
   else {
      return {
         name: tokenName,
         value: tokenField.val()
      };
   }
};

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

$.ajaxPrefilter(
   function (options, localOptions, jqXHR) {
      var token = GetAntiForgeryToken();
      jqXHR.setRequestHeader(token.name, token.value);
   }
);

Ich habe einen Beitrag darüber geschrieben aquí . Ich hoffe, das hilft!

6voto

pippopd Punkte 61

AntiForgeryToken mit Ajax.ActionLink verwenden

Zusätzlich zu jjwhite01 Antwort; um das Token in die Formulardaten einzufügen, verwenden Sie option.data im Vorfilter

$.ajaxPrefilter(
    function (options, localOptions, jqXHR) {
        if (options.type !== "GET") {
            var token = GetAntiForgeryToken();
            if (token !== null) {
                if (options.data.indexOf("X-Requested-With") === -1) {
                    options.data = "X-Requested-With=XMLHttpRequest" + (options.data === "") ? "" : "&" + options.data;
                }
                options.data = options.data + "&" + token.name + '=' + token.value;
            }
        }
    }
);

2voto

Keith Punkte 141163

Ich weiß nicht, über die AJAX ActionLink speziell, aber es ist möglich, von einer WebForms-Seite zu einer MVC-Aktion mit dem Post [AcceptVerbs(HttpVerbs.Post), ValidateAntiForgeryToken] Attribute.

Sie können Reflection verwenden, um an die MVC-Methoden zu gelangen, die zum Setzen des Cookies und der passenden Formulareingabe für die MVC-Validierung verwendet werden.

Siehe diese Antwort: Verwendung eines MVC HtmlHelper aus einer WebForm

0voto

Blake Pettersson Punkte 8627

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X