J'utilise une bibliothèque tierce qui reproche un Cela contourne ma protection CSRF et se fait abattre par mon serveur de rails. p>
Y a-t-il un moyen d'ajouter globalement un jeton CSRF prédéfini ( XMLHTTPQUEST code> avec
Nouveau XMLHTTPQUEST code>. P>
$ ('Meta [nom = csrf-jeton]'). Attrib ("contenu") code>) à toutes les instances de
XMLHTTPQUEST code> au moment de l'instanciation? P>
3 Réponses :
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; }; }());
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); }; }());
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 code> 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 code>, à la méthode
Envoyer code> pas hériter
.Apply code> 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.
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); }; }());
Avez-vous essayé
$. Ajaxprefilter code>
? Et voici un exemple: Ajout de jeton CSRF aux demandes de JQuery Ajax a >Pourquoi vous i> voulez-vous réparer les bibliothèques tiers qui ne savent pas comment contacter votre API correctement?
@shawnzhu: Non, OP dit que c'est un brut i>
xmlhttprequest code>!