Frage

Ich weiß, wie Attribut AntiForgeryToken MVC verwenden und es ist HTML-Helfer assoziiert zu helfen, meine Anwendung FORMULARPLZ XSRF-sichern.

Kann etwas Ähnliches kann für JsonResults erfolgen, die GET implementieren?

Zum Beispiel meiner Ansicht enthält einen onSubmit jQuery Aufruf wie so:

$.getJSON("/allowActivity/YesOrNo/" + someFormValue, "{}", function(data) {
  if(data.Allow) {
    //Do something.
  }
});

Ich möchte sicherstellen, dass diese JsonResult nur von der beabsichtigten Seite aufrufbar ist.

EDIT:

Ich fand diesen Beitrag über eine ähnliche Frage, ohne konkrete Antwort.

Was ist der einfachste Weg, um sicherzustellen, dass meine GET (non-destruktiv) URL nur durch einen AJAX-Aufruf von meiner eigenen Seite verbraucht wird?

War es hilfreich?

Lösung

Sie können die AntiForgeryToken mit einigen benutzerdefinierten Logik kombiniert verwenden. Die Schaffung des Fälschungstoken auf dem Server ist die gleiche, aber standardmäßig wird der Wert nicht in Ihrem XmlHttpRequest enthält.

Der Wert dieses Token ist in der HTTP nur Cookie „__RequestVerificationToken“ und auch auf den Server in den Formulardaten geschrieben werden soll. So ist ein Schlüssel / Wert-Paar in Ihrem XmlHttpRequest und verwenden Sie das ValidateAntiForgeryToken - Attribut auf dem Controller

EDIT:

Heute habe ich versucht, die AntiForgeryToken für Ajax fordert mich und es funktioniert gut. Verwenden Sie einfach die folgende javascript:

$.post('my_url',  $.getAntiForgeryTokenString(), function() { ... });

$.getAntiForgeryTokenString = function() {
    return $(document.getElementsByName("__RequestVerificationToken")).fieldSerialize();
};

Auf der Serverseite müssen Sie Ihren Code nicht ändern -. Nur das Attribut für Ihre Aktion ValidateAntiForgeryToken- verwenden

Hope, das hilft

Andere Tipps

Vor allem, warum nicht mehr als $ .post (url, Daten, Rückruf, 'json') zu verwenden, statt getJSON? Und wie kleolb02 sagte, Sie Wert aus dem Cookie auf die Post-Daten hinzufügen, können unter Verwendung von Cookie-Plugin - {__RequestVerificationToken: $ .cookie ( '__ RequestVerificationToken')}

Ich habe eine ähnlichen Code in einem ASP.NET MVC-Projekt verwendet auf einem Elemente Unschärfefunktion zu verwenden, ohne eine Ajax-Form. Dieser Code stellt ein Textfeld mit Serverdaten füllen, wenn ein bestimmtes HTML-Element Blur-Ereignis auftritt.

Hope auch dies hilft. Hier ist mein Code:

Javascript:

var mytext = { 'myText': 'example text' };
$.post('/MyController/JsonResultMethod', AddAntiForgeryToken(myText), function (resultData) {
        $('#htmlElement').val(resultData);
});
AddAntiForgeryToken = function (data) {
    data.__RequestVerificationToken = $('input[name=__RequestVerificationToken]').val();
    return data;
};

C-Sharp-Code:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public JsonResult SeoString(string myText)
    {
        try
        {
            // do something here
            return this.Json("result text");
        }
        catch (Exception)
        { return this.Json(string.Empty); }
    }

Sie können etwas ähnliches wie die anti XSRF Methoden tun. erzeugen Sie einfach ein wenig ID es in die Javascript einzufügen, und wenn der Benutzer ruft Ihre JSON-URL, haben die URL der erzeugten ID enthalten und prüfen, ob es da ist.

Eine Verteidigung gegen XSRF wird auch die sessionID als Schlüssel verwenden, dies nicht stoppen die Benutzer es von einer anderen Website auf eigene Rechnung ausführen though.

Einige Hash basierend auf der Sitzung und Zeit könnte den Trick tun. Natuerlich, wenn der Benutzer kopiert den Wert aus dem JS, er immer noch von einem anderen Ort durchführen können, aber Sie können diesen Wert haben laufen alle x Minuten. Eine weitere Option ist ein Cookie mit JS zu setzen und es server lesen.

Hope dies gibt Ihnen einige Ideen, die Sie den Start.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top