我正在使用第三方库生成一个原始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; }; }());