web-dev-qa-db-fra.com

Angular JS Verify CSRF Token in POST Demande

J'utilise AngularJS avec Rails. J'ai la demande suivante qui met à jour les utilisateurs en vrac.

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

Il ne peut s'agir d'une requête "GET" en raison de restrictions quant à la longueur de l'URL (http://support.Microsoft.com/kb/208427).

Mais pour la demande 'POST', nous avons besoin d'un jeton d'authenticité CSRF dans l'en-tête.

Comment pouvons-nous définir le jeton CSRF sur l'en-tête de demande de publication?

28
Sabarish Sankar

Vous pouvez définir des en-têtes http comme expliqué dans le service $ http .

Vous pouvez le configurer globalement:

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

ou pour une seule demande:

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

Voici une citation importante de Angular :

Protection contre la falsification de requêtes inter-sites (XSRF) XSRF est une technique de qu'un site non autorisé peut obtenir les données privées de votre utilisateur. Angulaire fournit le mécanisme suivant pour contrer XSRF. Lors de l'exécution de XHR demandes, le service $ http lit un jeton dans un cookie appelé XSRF-TOKEN et le définit comme en-tête HTTP X-XSRF-TOKEN. Depuis seulement JavaScript qui s'exécute sur votre domaine pourrait lire le cookie, votre serveur peut être assuré que le XHR vient de JavaScript en cours d'exécution sur votre domaine.

Pour en tirer parti, votre serveur doit définir un jeton dans un fichier Cookie de session lisible en JavaScript appelé XSRF-TOKEN sur le premier HTTP GET demande. Lors de demandes ultérieures non-GET, le serveur peut vérifier que le Le cookie correspond à l'en-tête HTTP X-XSRF-TOKEN, et par conséquent, assurez-vous que seul le JavaScript s'exécutant sur votre domaine aurait pu lire le jeton. Le Le jeton doit être unique pour chaque utilisateur et doit être vérifiable par le serveur (pour empêcher le JavaScript de créer ses propres jetons). Nous recommande que le jeton soit un condensé de l'authentification de votre site biscuit avec du sel pour plus de sécurité.

66
asgoth

Si vous vous demandez comment définir une valeur de cookie XSRF-TOKEN dans Rails, cette réponse a une implémentation Rails Protection CSRF + Angular.js: protect_from_forgery me force à me déconnecter POST

1
The Q CS or GS

J'ai récemment fait face au même problème et l'ajout de la gem angular_Rails_js l'a résolu. À ma connaissance, il crée pour chaque contrôleur Rails un cookie avec le CSRF-TOKEN de Rails qui sera capturé (comportement $ http par défaut) par $ angulaire. 

0
theFreedomBanana