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