9
votes

Comment se protéger contre le CSRF lorsque vous utilisez Backbone.js pour publier des données?

Backbone.js traite des données sur le serveur sous la hotte. Il n'existe donc aucun moyen facile d'insérer un jeton CSRF dans la charge utile. Comment puis-je protéger mon site contre le CSRF dans cette situation?

dans cette réponse: https://stackoverflow.com/a/10386412/954376 , la suggestion est de Vérifiez que l'en-tête de la demande X-demandé est XMLHTTPQUEST. Est-ce suffisant pour bloquer toutes les tentatives de CSRF?

Dans Django Docs, la suggestion consiste à ajouter un jeton CSRF dans un autre en-tête personnalisé dans chaque demande Ajax: https://docs.djangoproject.com/fr/1.5/ref/contrib/csrf/#ajax . Est-ce nécessaire?

Je comprends si l'attaque utilise une forme cachée, je suis en sécurité en assurant que la demande est de XMLHTTPQUEST. Mais existe-t-il des astuces d'attaque CSRF qui peuvent forger l'en-tête?


1 commentaires

«Je suis en sécurité en assurant que la demande est de XMLHTTPQUEST» - vous ne pouvez pas vous assurer que.


4 Réponses :


4
votes

Vous pouvez utiliser un préfiltre pour ajouter le jeton à toutes les demandes:

$.ajaxPrefilter(function(opts) {
    if (opts.data) {
        opts.data += "&";
    }
    opts.data += "csrfToken=" + token;
});


2 commentaires

Merci pour votre réponse! Alors, vérifiez que la vérification de l'en-tête de la demande X n'est pas bonne? Quel type d'attaque peut forger cet en-tête?


@Neowang ceux qui utilisent des bugs dans des plugins comme Flash. Vous ne pouvez pas forger l'en-tête dans une situation normale du CSRF, alors c'est bien sans bugs. Vous pourriez considérer que l'envoi et la vérification de jeton toujours plus simples est beaucoup plus simple que parfois de vérifier le jeton et de vérifier parfois l'en-tête.



15
votes

Définition d'un jeton CSRF global pour tous les appels JQuery.ajax:

var oldSync = Backbone.sync;
Backbone.sync = function(method, model, options){
  options.beforeSend = function(xhr){
    xhr.setRequestHeader('X-CSRFToken', CSRF_TOKEN);
  };
  return oldSync(method, model, options);
};


2 commentaires

L'orthographe correcte de la clé d'en-tête est x-csrftoken . Il y a un tiret supplémentaire dans votre première suggestion qui le brise.


@kadam L'orthographe correcte de la clé d'en-tête dépend du serveur. Par exemple, Express 3 utilise x-csrf-jeton . expressjs.com/3x/apl.html#csrf



0
votes

Je sais que c'est une question peu ancienne, mais je laisserai un lien vers le repo-github Repo of Module AMD juste pour cela:

https://github.com/kuc2477/backbone.csrf.git ( Disclaimer: Je suis l'auteur du module )


0 commentaires

1
votes

Voici une version mise à jour, basée à Django 1.7 (à l'aide du plug-in jQuery Cookie) xxx


0 commentaires