2015-05-21 5 views
6

मैं मानक रूपों (useToken = true) के लिए सिंक्रनाइज़र टोकन पैटर्न का उपयोग कर रहा हूं लेकिन मुझे AJAX पर इस से निपटने की कोई अनुशंसित विधि नहीं मिल रही है।Grails - क्या AJAX रूपों में सीएसआरएफ हमलों से निपटने का एक अनुशंसित तरीका है?

संपादित

इस पोस्टिंग के बाद से, मैं ऊपर से मौजूदा पैटर्न Grails को शामिल अपने ही समाधान लुढ़का है।

jQuery AJAX में मैं पूरे फॉर्म को पोस्ट करता हूं (जिसमें Grails 'इंजेक्शन SYNCHRONIZER_TOKEN और SYNCHRONIZER_URI छिपे हुए फ़ील्ड शामिल होंगे) जैसे कि फर्म क्लोजर नियंत्रक में अपेक्षा के अनुसार प्रदर्शन कर सकता है।

समस्या सफल प्रतिक्रिया पर है, कोई नया टोकन सेट नहीं है (क्योंकि पृष्ठ को पुनः लोड नहीं किया गया है और जी: फॉर्म टैगलिब विकसित नहीं हुआ है) और इसलिए मैं मैन्युअल रूप से उसी लाइब्रेरी में कॉल करने वाले नियंत्रक में ऐसा करता हूं जी: फॉर्म टैगलिब, और इसे AJAX प्रतिक्रिया में वापस करें, और उसके बाद छुपा फ़ील्ड मान रीसेट करें। नीचे देखें:

var formData = jQuery("form[name=userform]").serializeArray(); 

$.ajax({ 
    type: 'POST', 
    url: 'delete', 
    data: formData, 
    success: function (data) { 
     // do stuff 
    }, 
    complete: function (data) { 
     // Reset the token on complete 
     $("#SYNCHRONIZER_TOKEN").val(data.newToken); 
    } 
}) 

नियंत्रक में:

def delete(String selectedCommonName) { 

    def messages = [:] 
    withForm { 
     User user = User.findByName(name) 

     if (user) { 
      userService.delete(user) 
      messages.info = message(code: 'user.deleted.text') 

     } else { 
      messages.error = message(code: 'user.notdeleted.text') 
     } 
    }.invalidToken { 
      messages.error = message(code: 'no.duplicate.submissions') 
    } 
    // Set a new token for CSRF protection 
    messages.newToken = SynchronizerTokensHolder.store(session).generateToken(params.SYNCHRONIZER_URI) 
    render messages as JSON 
} 

किसी को भी अगर मैं अनजाने में ऊपर समाधान में एक सुरक्षा दोष शुरू की की पहचान कर सकते हैं। यह मेरे लिए पर्याप्त दिखता है लेकिन मुझे सुरक्षा के साथ कुछ भी करने के लिए हाथ रोलिंग पसंद नहीं है।

उत्तर

0

अच्छा!

आईएमओ, आप एक ही समय में टोकन को बेहतर रीसेट करेंगे।

SynchronizerTokensHolder.store(session).resetToken(params.SYNCHRONIZER_URI)

और अगर आप एक ही पेज में कई रूपों है, एक चर टोकन धारण करने के लिए निर्धारित प्रत्येक ajax अनुरोध से लौट आए।

बीटीडब्ल्यू, टोकन पैटर्न को अपने आप क्यों लागू नहीं करते?

  • टोकन जेनरेट करें, उदाहरण के लिए, UUID.randomUUID().toString(), और इसे यूआरएल के साथ कुंजी में सत्र में संग्रहीत करें।
  • पोस्ट क्रियाओं के satrt पर टोकन को चेक और रीसेट करें।
+0

दरअसल, मैंने इस कार्यान्वयन को तब से संशोधित किया है क्योंकि अगले अनुरोध के लिए टोकन वापस भेजना था, जिसका मतलब था कि ग्रेल्स सिंक्रनाइज़र टोकन पैटर्न कार्यान्वयन के कुछ अंतर्निहित ज्ञान के साथ हमलावर होगा, सफलतापूर्वक इसका फायदा उठा सकेगा। इसलिए मैंने उपरोक्त कार्यान्वयन को डुप्लिकेट फॉर्म सबमिशन को रोकने के लिए रखा और इसे अपने स्वयं के यूयूआईडी को उसी तरह से बढ़ाया जैसा आपने उपरोक्त उल्लेख किया है। – dre

+0

मैं देखता हूं। शायद आपको 'सफलता' की बजाय 'पूर्ण' में टोकन को रीसेट करने के बारे में सोचना चाहिए। मेरी प्रोजेक्ट में, एक ही पृष्ठ में बहुत सारे AJAX अनुरोध हैं, इसलिए मैं वैश्विक स्तर पर AJAXSend और AJAXStop में टोकन को जोड़ और रीसेट करता हूं। – Yang

+0

हां, सफलता * की बजाय * पूर्ण * में इसे करने पर अच्छा बिंदु। अपने स्वयं के कार्यान्वयन के लिए, मैं टोकन उत्पन्न करता हूं और जैसे ही आप नियंत्रक को दबाते हैं सत्र में जोड़ते हैं। मुझे निरंतर पुनर्जन्म का लाभ नहीं दिख रहा है, यह किसी भी उचित अवधि में किसी को अनुमान लगाने की संभावना नहीं है। स्पष्ट रूप से जब उपयोगकर्ता पृष्ठ छोड़ देता है और पृष्ठ पर लौटता है, तो एक नया फिर से उत्पन्न होता है। – dre

संबंधित मुद्दे

 संबंधित मुद्दे