2017-09-13 1 views
0

Ich verwende reines JavaScript, um auf bestimmte Webdienste zuzugreifen, die mit Spring erstellt wurden. Als ich versuchte, einen Ajax-Post-Anruf bei einem der Dienste zu verwenden, stieß ich auf das Problem mit CSRF.Ungültiger CSRF-Token mit Ajax

Der Ajax-Aufruf ist die Linien:

var data = {'attribute1':'1','attribute2':'2'}; 

$.ajax({ 
    type: "POST", 
    url: url, 
    data: data, 
    success: function(data) 
    { 
     if (typeof inputId !== 'undefined') { 
      $("#"+inputId).val(JSON.stringify(data)); 
     } 
     console.log(JSON.stringify(data));  
    } 
    }); 

Ich habe die Web gesucht, aber alles, was ich gefunden ist das Back-End (JSP, PHP) zu aktualisieren, um das Attribut „$ aufzufüllen {_ csrf. parameterName} "in der Form. Allerdings verwende ich kein Backend, die ganze Seite ist nur HTML und Javascript.

Antwort

1

CSRF_Token ist ein von Ihrem Web-Framework/Server im Browser gesendeter und im Browser gespeicherter Cookie. Normalerweise müssen Sie den CSRF_Token-Wert als Teil Ihrer JSON-Daten senden, wenn Sie über einen Ajax-Aufruf schreiben. Um das zu tun ... müssen Sie JavaScript verwenden, um den Cookie-Namen zu finden und den Wert zu erhalten. Dann müssen Sie den Wert dem richtigen Variablennamen zuweisen, den der Server erwartet. Zum Beispiel

var data = { crsf_token_name_server_expects: csrf_token_value_I_obtained }; 

Die CSRF_Token wird verwendet, um Menschen mit api Kommunikation, um sicherzustellen, tatsächlich Ihre Website zugegriffen und erstellt eine gültige Sitzung, bevor Sie Daten darauf zu schreiben. Ein Nutzer auf google.com kann nicht auf stackoverflow.com posten, es sei denn, der stackoverflow.com-Satz ist ein sogenannter corse-Header, der die Kommunikation zwischen Google.com und Stackoverflow.com ermöglicht.

Basierend auf Ihrer Frage ... haben Sie gesagt, Sie posten auf ein Backend-API, das von Java Spring unterstützt wird. Diese API erwartet ein csrf_token, so dass es sich anhört als wäre es eine API, die nur für den Domainnamen verwendet werden soll, für den dieser Dienst eingerichtet ist. Zum Beispiel geht ein Nutzer auf google.com und macht einen POST auf www.google.com/url_to_post_to/. Google würde sicherstellen, dass ein CSRF_Token mit dieser Anfrage gesendet wird ... da die Leute nicht zufällig auf diese API-URL zugreifen sollen ... ohne eine gültige Google-Sitzung zu haben.

+0

Vielen Dank für die Erklärung. Was ich wirklich wissen muss, sind diese zwei Dinge, der Name, den der Server erwartet, und das eigentliche Token. Ich habe weitere Nachforschungen angestellt, und anscheinend wird Spring das Token für den Client standardmäßig unsichtbar machen. Daher scheint es, dass wenn Sie ihre Technologie (JSP) nicht verwenden, müssen Sie es deaktivieren. – Tony