2013-01-01 6 views
27

Ich verwende AngularJS mit Rails. Ich habe die folgende Anfrage, die Benutzer in großen Mengen aktualisiert.Angular JS Überprüfen Sie CSRF-Token in POST-Anforderung

$http{ 
    method: 'POST', 
    url: $scope.update_url, 
    params: {selected_ids: userIds} 
} 

Dies kann nicht eine 'GET' Anfrage aufgrund von Einschränkungen in der Länge der URL (http://support.microsoft.com/kb/208427)

Aber für 'POST' Anforderung sein, Wir brauchen ein CSRF Authenticity Token in der Kopfzeile.

Wie können wir das CSRF-Token auf den Post-Request-Header setzen?

Antwort

65

Sie können HTTP-Header wie im Service $http beschrieben einrichten.

Sie können es global einrichten:

$httpProvider.defaults.headers.post['My-Header']='value' (or) 
$http.defaults.headers.post['My-Header']='value'; 

oder für eine einzelne Anfrage:

$http({ 
    headers: { 
     'My-Header': 'value' 
    } 
}); 

Hier ist ein wichtiges Zitat aus Angular:

Cross Site Request Forgery (XSRF) Schutz XSRF ist eine Technik von , die eine unautorisierte Website die Privatsphäre Ihres Benutzers erlangen kann te Daten. Angular bietet folgenden Mechanismus gegen XSRF. Bei der Ausführung von XHR Anfragen liest der $ http-Dienst ein Token aus einem Cookie namens XSRF-TOKEN und legt es als HTTP-Header X-XSRF-TOKEN fest. Da nur JavaScript, das auf Ihrer Domain ausgeführt wird, den Cookie lesen kann, kann Ihr Server sicher sein, dass das XHR von JavaScript stammt, das auf Ihrer -Domäne ausgeführt wird.

Um diesen Vorteil zu nutzen, muss Ihr Server ein Token in einem JavaScript-lesbaren Session-Cookie mit der Bezeichnung XSRF-TOKEN bei der ersten Anforderung HTTP GET einrichten. Bei nachfolgenden Nicht-GET-Anforderungen kann der Server überprüfen, ob der Cookie dem X-XSRF-TOKEN-HTTP-Header entspricht, und daher sicherstellen, dass nur das in Ihrer Domäne ausgeführte JavaScript den Token gelesen haben kann. Das Token muss für jeden Benutzer eindeutig sein und muss vom Server überprüfbar sein (um zu verhindern, dass JavaScript eigene Tokens erstellt). Wir empfehlen , dass das Token ein Auszug der Authentifizierung Ihrer Website ist Cookie mit Salz für zusätzliche Sicherheit.

+0

Dank asgoth! Ist dies der richtige Weg, um eine Post-Anfrage mit CSRF-Token zu stellen? Oder soll ich ein verstecktes Formular erstellen und das Formular mit studentIds auf ng-click() absenden? Aber in diesem Fall, wie kann ich die Antwortdaten erhalten? Danke noch einmal! –

+0

Ich habe ein Zitat von eckig selbst hinzugefügt. – asgoth

+2

Ich bin unklar, warum diese Lösung mit Angulars Dokumentation übereinstimmt. Die Dokumentation besagt, dass Sie einen Cookie setzen müssen, aber Sie scheinen den Header manuell zu setzen. – RevNoah

0

ich das gleiche Problem vor kurzem konfrontiert und das Hinzufügen von den Edelstein angular_rails_js es gelöst. Nach meinem Verständnis erstellt es für jeden Rails-Controller ein Cookie mit den Rails CSRF-TOKEN, das von angular $ http abgefangen wird (Default $ http-Verhalten).