11
votes

Ajout de l'en-tête X-CSRF-Token dans le monde entier à toutes les instances de XMLHTTPQUEST ();

J'utilise une bibliothèque tierce qui reproche un XMLHTTPQUEST avec Nouveau XMLHTTPQUEST .

Cela contourne ma protection CSRF et se fait abattre par mon serveur de rails.

Y a-t-il un moyen d'ajouter globalement un jeton CSRF prédéfini ( $ ('Meta [nom = csrf-jeton]'). Attrib ("contenu") ) à toutes les instances de XMLHTTPQUEST au moment de l'instanciation?


3 Réponses :


5
votes

Vous pouvez envelopper la méthode Ajax Open () pour ouvrir, puis régler l'en-tête immédiatement:

(function() {
    var op = XMLHttpRequest.prototype.open;
    XMLHttpRequest.prototype.open = function() {
        var resp = op.apply(this, arguments);
        this.setRequestHeader('X-CSRF-Token', $('meta[name=csrf-token]').attr('content'));
        return resp;
    };
}());


0 commentaires

29
votes

Je recommanderais à Intercepter les appels sur la méthode code> envoi code>:

(function() {
    var send = XMLHttpRequest.prototype.send,
        token = $('meta[name=csrf-token]').attr('content');
    XMLHttpRequest.prototype.send = function(data) {
        this.setRequestHeader('X-CSRF-Token', token);
        return send.apply(this, arguments);
    };
}());


4 commentaires

Je suis allé avec le faire après l'ouverture de sorte qu'il puisse être encombré, mais 6 d'une, une demi-douzaine de l'autre, je suppose ...


@dandavis: Au départ, je pensais intercepter ouvert aussi, mais je ne voulais pas simplement répéter le code de votre réponse. Vous avez un +1 tout comme j'ai vu votre article pop up :)


Les grands esprits se rencontrent. Puis-je demander, êtes-vous 100% d'accord avec ce type de mod? C'est un peu risqué / sale pour moi, même si je ne peux pas voir le mal.


99%. MÊME RISQUES que toujours lors de la gâche avec des objets intégrés: ils pourraient être mis en œuvre différemment de ceux que vous pensiez. Des méthodes spécifiques à l'instance à des propriétés non inscriptibles , à la méthode Envoyer pas hériter .Apply Toutes les bizarreries sont possibles (les vieilles ies étaient connu pour avoir de telles bizarreries dans leur DOM). Cependant, dans les navigateurs modernes, cela fonctionnera, ils respectent la spécification Web-IDL pour savoir comment implémenter les API HTML5 dans JavaScript.



4
votes

Si vous avez besoin d'une solution indépendante JQuery, vous pouvez utiliser:

  (function() {
      var send = XMLHttpRequest.prototype.send,
          token = document.getElementsByTagName('meta')['csrf-token'].content;
      XMLHttpRequest.prototype.send = function(data) {
          this.setRequestHeader('X-CSRF-Token', token);
          return send.apply(this, arguments);
      };
  }());


0 commentaires