2014-06-13 18 views
8

ile XMLHttpRequest numaralı ham ürününü üreten bir üçüncü taraf kitaplığı kullanıyorum.X-CSRF-Token üstbilgisini global olarak tüm XMLHttpRequest() öğelerine ekleme;

Bu, CSRF korumamı atlar ve raylarım sunucum tarafından vurulur.

Global olarak, ön tanımlı bir CSRF belirteci ($('meta[name=csrf-token]').attr('content')) tüm örnekleme zamanında XMLHttpRequest TÜM örneklerine ekleme yolu var mı?

Açmak open() metodu ajax sarın ve sonra hemen başlığını ayarlayabilirsiniz
+0

sen [ '$ .ajaxPrefilter'] denedin mi (http://api.jquery.com/jQuery.ajaxPrefilter/)? ve burada bir örnek: [jQuery AJAX isteklerine CSRF belirteci ekleme] (http://avinmathew.com/adding-csrf-token-to-jquery-ajax-requests/) – shawnzhu

+1

Neden * siz * üçüncü-pare düzeltmek istiyorum api'nizle nasıl iletişim kuracağını bilemeyen kütüphaneler düzgün bir şekilde mi? – Bergi

+0

@shawnzhu: Hayır, OP bir * ham * 'XMLHttpRequest' olduğunu söylüyor! – Bergi

cevap

22

Ben send yöntemine intercept calls tavsiye ederim Başlığı derleme zamanında eklemez, ancak istek gönderilmeden hemen önce. Siz çağrılarını da new XMLHttpRequest() arayarak engelleyebilirsiniz, ancak open çağrılıncaya kadar başlık eklenmesini beklemeniz gerekmeyecektir.

Ayrıca, isteğin hedef URL'sine bir test eklemek isteyebilirsiniz, böylece sadece kendi başlığınızı aradığınızda başlığı eklersiniz. Bunu yapmamak, başka bir yerde belirteci sızdırıyor olabilir veya hatta bu üstbilgiye izin verilmeyen alanlar arası CORS çağrılarını bile kırabilir.

+0

açıktan sonra bunu yapabilmem için clobbered yapabildim, ama bir, yarım düzine diğerinden 6 tane varsa ... – dandavis

+0

@dandavis: başlangıçta ben de 'açık' kesiştirmeyi düşündüm ama yapmadım Sadece kodu cevabınızdan tekrarlamak istiyorum. Mesajınızı gördüğünüz gibi +1'iniz var :) – Bergi

+0

Büyük akıllar düşünün. sorabilir miyim, bu tür bir mod ile% 100 tamam mı? Zarar göremesem de bana biraz riskli/kirli geliyor. – dandavis

4

:

(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); 
    }; 
}()); 

Bu won:

(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; 
    }; 
}()); 
1

Bir jQuery bağımsız bir çözüm gerekirse kullanabilirsiniz:

(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); 
     }; 
    }()); 
İlgili konular