提问者:小点点

向XMLHttpRequest()的所有实例全局添加X-CSRF-Token头;


我使用的是一个第三方库,它生成了一个原始的XMLHttpRequest新的XMLHttpRequest

这绕过了我的CSRF保护,并被我的rails服务器击落。

是否有方法在实例化时向XMLHttpRequest的所有实例全局添加预定义的CSRF令牌($('meta[name=csrf-token]').attr('content'))?


共1个答案

匿名用户

我建议拦截对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调用。