[英]Purge X-CSRF-TOKEN for visitors to fix XMLHttpRequest being blocked by CORS policy
[英]Adding X-CSRF-Token header globally to all instances of XMLHttpRequest();
我使用的是第三方的库,产生一个原始XMLHttpRequest
与new XMLHttpRequest
。
这绕过了我的CSRF保护并被我的rails服务器击落。
有没有办法在实例化时将全局添加预定义的CSRF令牌( $('meta[name=csrf-token]').attr('content')
)添加到XMLHttpRequest
所有实例?
(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);
};
}());
这不会在实例化时添加标头,而是在发送请求之前添加标头。 您也可以拦截对new XMLHttpRequest()
调用,但这不会有用,因为您需要等待添加标头直到调用open
。
您可能还希望包含对请求的目标URL的测试,以便您只在调用自己的api时添加标头。 不这样做可能会将令牌泄漏到其他地方,甚至可能会破坏不允许此标头的跨域CORS调用。
你可以打开ajax open()方法打开然后立即设置标题:
(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;
};
}());
如果您需要Jquery独立解决方案,您可以使用:
(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);
};
}());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.