por enviar csrftoken and javascript ajax security xmlhttprequest csrf

javascript - csrftoken - enviar token por ajax



Agregar encabezado X-CSRF-Token globalmente a todas las instancias de XMLHttpRequest(); (3)

Estoy utilizando una biblioteca de terceros que engendra XMLHttpRequest procesar con la new XMLHttpRequest .

Esto pasa por alto mi protección CSRF y es derribado por mi servidor de rieles.

¿Hay alguna manera de agregar globalmente un token CSRF predefinido ( $(''meta[name=csrf-token]'').attr(''content'') ) a TODAS las instancias de XMLHttpRequest en el momento de instanciación?


puede ajustar el método ajax open () para abrir y luego configurar el encabezado de inmediato:

(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; }; }());


Recomiendo interceptar llamadas al método de send :

(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); }; }());

Esto no agregará el encabezado en el momento de instanciación, pero justo antes de que se envíe la solicitud. También puede interceptar llamadas a la new XMLHttpRequest() , pero eso no será útil, ya que debe esperar agregando el encabezado hasta que se llame.

Es posible que también desee incluir una prueba para la URL objetivo de la solicitud, de modo que solo agregue el encabezado cuando se llame a su propia API. Si no lo hace, podría filtrar el token en otro lugar, o incluso podría romper las llamadas CORS entre dominios que no permiten este encabezado.


Si necesita una solución independiente de Jquery, puede usar:

(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); }; }());