Добавление заголовка X-CSRF-Token глобально во все экземпляры XMLHttpRequest();
Я использую стороннюю библиотеку, которая порождает raw XMLHttpRequest
с new XMLHttpRequest
.
это обходит мою защиту CSRF и сбивается моим сервером rails.
есть ли способ глобально добавить предопределенный токен CSRF ($('meta[name=csrf-token]').attr('content')
) ко всем экземплярам XMLHttpRequest
во время создания экземпляра?
3 ответов
Я бы рекомендовал перехватывать звонки до 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);
};
}());
это не добавит заголовок во время создания экземпляра, но прямо перед отправкой запроса. Вы can перехват вызовов 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);
};
}());