我使用的是一个第三方库,它生成了一个原始的XMLHttpRequest
和新的XMLHttpRequest
。
这绕过了我的CSRF保护,并被我的rails服务器击落。
是否有方法在实例化时向XMLHttpRequest
的所有实例全局添加预定义的CSRF令牌($('meta[name=csrf-token]').attr('content')
)?
我建议拦截对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);
};
}());
这不会在实例化时添加头,而是在发送请求之前添加头。您也可以拦截对new XMLHttpRequest()
的调用,但这没有帮助,因为您需要等待添加头,直到调用open
。
您可能还希望包含一个针对请求的目标URL的测试,以便仅在调用自己的api时添加头。不这样做可能会在其他地方泄漏令牌,甚至可能破坏不允许此头的跨域CORS调用。