Добавление заголовка 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);
      };
  }());