2013-08-08 8 views
9

Backbone.js हुड के नीचे सर्वर पर डेटा पोस्ट करने को संभालता है, इसलिए पेलोड में सीएसआरएफ टोकन डालने का कोई आसान तरीका नहीं है। मैं इस स्थिति में सीएसआरएफ के खिलाफ अपनी साइट की रक्षा कैसे कर सकता हूं?डेटा पोस्ट करने के लिए Backbone.js का उपयोग करते समय सीएसआरएफ के खिलाफ कैसे सुरक्षा करें?

इस SO उत्तर में: https://stackoverflow.com/a/10386412/954376, सुझाव x-Requested-by header को XMLHTTPRequest होने के लिए सत्यापित करना है। क्या यह सभी सीएसआरएफ प्रयासों को अवरुद्ध करने के लिए पर्याप्त है?

Django दस्तावेज़ों में, सुझाव है कि प्रत्येक AJAX अनुरोध में किसी अन्य कस्टम शीर्षलेख में सीएसआरएफ टोकन जोड़ना है: https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#ajax। क्या यह आवश्यक है?

मैं समझता हूं कि हमले छिपे हुए फॉर्म का उपयोग करता है, मैं केवल यह सुनिश्चित करके सुरक्षित हूं कि अनुरोध XMLHTTPRequest से है। लेकिन क्या कोई सीएसआरएफ हमला चाल है जो हेडर को फोर्ज कर सकती है?

+0

(jQuery कुकी प्लगइन का उपयोग) है "मैं सुरक्षित बस आश्वस्त द्वारा हूँ अनुरोध XMLHTTPRequest से है "- आप यह सुनिश्चित नहीं कर सकते हैं। – Quentin

उत्तर

4

आप सभी अनुरोधों का टोकन जोड़ने के लिए एक prefilter उपयोग कर सकते हैं:

$.ajaxPrefilter(function(opts) { 
    if (opts.data) { 
     opts.data += "&"; 
    } 
    opts.data += "csrfToken=" + token; 
}); 

आप अतिरिक्त तर्क जोड़ने के लिए है, तो आप हमेशा टोकन न भेजें आवश्यकता हो सकती है।

+0

आपके उत्तर के लिए धन्यवाद! तो सिर्फ एक्स-अनुरोधित-हेडर के साथ सत्यापित करना कोई अच्छा नहीं है? इस हेडर को किस तरह का हमला कर सकता है? – NeoWang

+1

@NeoWang जो फ्लैश जैसे प्लगइन में बग का उपयोग करते हैं। आप एक सामान्य सीएसआरएफ स्थिति में हेडर को फोर्ज नहीं कर सकते हैं, इसलिए यह बग के बिना ठीक है। आप इस बात पर विचार कर सकते हैं कि कभी-कभी टोकन को भेजने और जांचने से टोकन की जांच करने और कभी-कभी शीर्षलेख की जांच करने से कहीं अधिक सरल होता है। – Esailija

15

सभी jQuery.ajax के लिए एक वैश्विक CSRF-टोकन स्थापना कॉल:

var oldSync = Backbone.sync; 
Backbone.sync = function(method, model, options){ 
    options.beforeSend = function(xhr){ 
    xhr.setRequestHeader('X-CSRFToken', CSRF_TOKEN); 
    }; 
    return oldSync(method, model, options); 
}; 

संपादित करें:

$(function(){ 
    $.ajaxSetup({ 
    headers: {'X-CSRFToken': CSRF_TOKEN} 
    }); 
}) 

Backbone.sync अधिभावी द्वारा सिर्फ बैकबोन के लिए टोकन स्थापना फिक्स्ड लिखने में कोई त्रुटि कदम अंक टिप्पणियों में

+1

हेडर कुंजी की सही वर्तनी 'एक्स-सीएसआरएफटीकेन' है। आपके पहले सुझाव में एक अतिरिक्त डैश है जो इसे तोड़ देता है। – kadam

+1

@kadam हेडर कुंजी की सही वर्तनी सर्वर पर निर्भर करता है। उदाहरण के लिए, एक्सप्रेस 3 'एक्स-सीएसआरएफ-टोकन' का उपयोग करता है। http://expressjs.com/3x/api.html#csrf – bentael

0

मुझे पता है कि यह एक छोटा सा सवाल है, लेकिन मैं इसके लिए एएमडी मॉड्यूल के जिथब रेपो को एक लिंक छोड़ दूंगा:

https://github.com/kuc2477/backbone.csrf.git (अस्वीकरण: मैं मॉड्यूल के लेखक हूँ)

1

यहाँ एक अद्यतन संस्करण, Django 1.7 में आधारित

oldSync = Backbone.sync 
Backbone.sync = (method, model, options) -> 

    csrfSafeMethod = (method) -> 
     # these HTTP methods do not require CSRF protection 
     /^(GET|HEAD|OPTIONS|TRACE)$/.test method 

    options.beforeSend = (xhr, settings) -> 
     if !csrfSafeMethod(settings.type) and [email protected] 
      xhr.setRequestHeader 'X-CSRFToken', $.cookie('csrftoken') 
     return 
    oldSync method, model, options 
संबंधित मुद्दे