![](/img/trans.png)
[英]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.