在XMLHttpRequest()的所有实例中全局添加X-CSRF-Token头
Adding X-CSRF-Token header globally to all instances of XMLHttpRequest();
我正在使用第三方库,该库生成原始XMLHttpRequest
与new XMLHttpRequest
。
这绕过了我的CSRF保护并被我的rails服务器击落。
是否有一种方法可以在实例化时全局添加预定义的CSRF令牌($('meta[name=csrf-token]').attr('content')
)到XMLHttpRequest
的所有实例?
我建议拦截对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调用。
您可以将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);
};
}());
相关文章:
- 向调用全局javascript函数的对象添加处理程序
- 是否可以在动态添加的文本输入上全局捕获keydown
- Magento-全局添加额外的js验证规则
- 如何在Javascript中添加所有测试使用的全局变量
- 全局向对象添加属性/方法
- 为剑道UI窗口添加全局功能
- 如何在方法中添加事件侦听器时调用 removeEventLisener 并在 JavaScript 中的全局函数中调用
- 如何将每个 JSON 行添加到全局 jQuery 变量中
- 如何在 nodejs 中全局添加方法到 JSON、Date 或其他“本机”对象
- 如何在运行单元测试时将React添加为全局
- 为什么Google闭包编译器在原始命名空间为空的情况下向全局命名空间添加变量
- 如何向Richfaces添加全局oncomplete JavaScript方法
- AngularJS.添加全局AJAX错误处理程序(如果尚未定义)
- 将JavaScript模块添加到全局范围的跨平台方式是什么
- 如何在JS中添加变量到全局数组
- 添加到全局作用域的函数变量
- 添加到全局数组变量中的项不会在添加函数之外持久存在
- 流星包添加全局资源
- 将Javascript函数添加到全局作用域
- 在XMLHttpRequest()的所有实例中全局添加X-CSRF-Token头