2012-05-16 17 views
5

लौटता रहता है मैं एक एजेक्स पोस्ट को किसी क्रिया में उपयोग करने की कोशिश कर रहा हूं। अनुरोधों को ठीक काम करें लेकिन जब मैं पोस्ट करने का प्रयास करता हूं तो मुझे फायरबग में '400 खराब अनुरोध' दिखाई देता है और दृश्य 'ब्लैक होल' प्रतिक्रिया देता है। इस केक या क्या की सुरक्षा सेटिंग के कारण मैं यहाँ याद आ रही हैकेकेपीएचपी AJAX पोस्ट 400 खराब अनुरोध

  $.ajax({ 
      url:"/usermgmt/users/editUser", 
      type:"POST", 
      success:function(data) { 
       alert('Wow this actually worked'); 
       //ko.applyBindings(self); 

      }, 
      error:function() { 
       alert('This will never work'); 
      } 
     }); 

है:

यहाँ Jquery अनुरोध है?

+0

मैं इसमें देख रहा हूं और मुझे पूरा यकीन है कि सुरक्षा घटक मुझे यहां रोक रहा है: http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html – kSeudo

+0

ठीक है अगर मैं इसके साथ क्रॉस साइट सुरक्षा अक्षम करता हूं: $ this-> सुरक्षा-> csrfCheck = false; यह काम करता है ..... लेकिन जाहिर है यह जाने का रास्ता नहीं है :) कोई विचार? – kSeudo

+0

क्या आप कोड/usermgmt/users/editUser – Leo

उत्तर

18

संरक्षण सुरक्षा घटक द्वारा प्रदान की बुनियादी सुविधाओं में से एक है। जब तक यह सक्षम है, यह सभी POSTs को फॉर्म सबमिशन के रूप में पेश करने जा रहा है।

एक नियमित हाथ से कोडित HTML फॉर्म सुरक्षा घटक सक्षम के साथ काम नहीं करेगा, इसलिए न तो JQuery- उत्पन्न पोस्ट होगा। आप निश्चित रूप से $this->Security->validatePost = false; या $this->Security->csrfCheck = false; का उपयोग कर सकते हैं, लेकिन फिर सुरक्षा सुरक्षा प्रदान करने वाली सुरक्षा को खो देते हैं।

सुरक्षा घटक को सामान्य रूप से चालू रखने और काम करने के लिए, आपको AJAX के माध्यम से पोस्ट करने के लिए फ़ॉर्म बनाने के लिए केकेपीएचपी फॉर्म हेल्पर का उपयोग करने की आवश्यकता है। इस तरह data[_Token][fields] और data[_Token][unlocked] छिपा क्षेत्रों उनके कुंजी के साथ उत्पन्न हो:

<?php 
    echo $this->Form->create('Test',array('id'=>'testform')); 
    echo $this->Form->input('Something'); 
    echo $this->Form->submit(); 
    echo $this->Form->end(); 
?> 

यह कुछ इस तरह उत्पन्न करेगा: यह JQuery में इस फार्म serializing का मामला है

<form action="/your/url" id="testform" method="post" accept-charset="utf-8"> 
    <div style="display:none;"> 
     <input type="hidden" name="_method" value="POST"/> 
     <input type="hidden" name="data[_Token][key]" value="9704aa0281d8b5a2fcf628e9fe6f6c8410d8f07a" id="Token937294161"/> 
    </div> 
    <div class="input text"> 
     <input name="data[Test][Something]" class="required" type="text" id="TestSomething"/> 
    </div> 
    <div class="submit"> 
     <input type="submit" /> 
    </div> 
    <div style="display:none;"> 
     <input type="hidden" name="data[_Token][fields]" value="0c81fda1883cf8f8b8ab39eb15d355eabcfee7a9%3A" id="TokenFields817327064"/> 
     <input type="hidden" name="data[_Token][unlocked]" value="" id="TokenUnlocked281911782"/> 
    </div> 
</form> 

अब इतना है कि यह कर सकते हैं ajax पोस्ट के साथ भेजा:

$('#testform').submit(function(event) { 
     $.ajax({ 
      type: 'POST', 
      url: "/your/url", 
      data: $('#testform').serialize(), 
      success: function(data){ 
       alert('Wow this actually worked'); 
      }, 
      error:function() { 
       alert('This will never work'); 
      } 
     }); 
     event.preventDefault(); // Stops form being submitted in traditional way 
    }); 

अब अगर आप सबमिट बटन दबाते हैं, तो पोस्ट सफल होगा।

महत्वपूर्ण: तथ्य यह है कि फार्म सहायक के टोकन केवल सुरक्षा घटक एक बार के साथ इस्तेमाल किया जा सकता के कारण, इस समाधान केवल काम करता है अगर आप केवल पेज पीढ़ी प्रति एक बार पोस्ट करना चाहते हैं। आप एक ही रूप पृष्ठ पुनः लोड के बीच कई बार पोस्ट करने में सक्षम होने की जरूरत है, तो आप जब आप अपने नियंत्रक की शुरुआत में सुरक्षा घटक जोड़ने के लिए निम्न कार्य करना होगा:

public $components = array(
    'Security' => array(
     'csrfUseOnce' => false 
    ) 
); 

... इस वसीयत एक से अधिक अनुरोधों के लिए टोकन का उपयोग करने की अनुमति दें। यह सुरक्षित नहीं है लेकिन आप इसे csrfExpires के साथ जोड़ सकते हैं ताकि टोकन अंततः समाप्त हो जाएंगे। यह सब CSRF configuration section of the Cake book में प्रलेखित है।

+1

बहुत उपयोगी उत्तर - धन्यवाद! – Dave

+2

बस इसे थोड़ा जोड़ना चाहता था, क्योंकि अगर जावास्क्रिप्ट एक 'छुपा' इनपुट फ़ील्ड को संशोधित करता है तो त्रुटि भी मिल जाएगी, क्योंकि टोकन उन लोगों का ट्रैक रखता है। यदि आप validatePost को अक्षम नहीं करना चाहते हैं, तो बस फ़ील्ड को छिपे हुए टेक्स्ट प्रकार फ़ील्ड में बदलें, फिर उन्हें सीएसएस के माध्यम से छुपाएं (प्रदर्शन: कोई नहीं)। यह आपके फॉर्म को सही तरीके से सबमिट करने की अनुमति देगा, भले ही जावास्क्रिप्ट आपके इनपुट फ़ील्ड को बदल देता है। – TeckniX

+0

बहुत अच्छा और विस्तृत उत्तर, इससे मुझे एक ही समस्या से बाहर निकलने में मदद मिली और मुझे यह पता लगाने में थोड़ी देर लग गई कि यह सुरक्षा कॉम्पोनेंट था। आपके लिए +1, महोदय! – Oldskool

0

मेक shure आप में समारोह editUser लगा रहे हैं:

public function beforeFilter(){ 
    parent::beforeFilter() 
    $this->Auth->allow('editUser'); 
    } 

UsersController की, इस रूप छेड़छाड़ के खिलाफ

सादर

2

एफवाईआई केकेपीएचपी 2.3 और बाद वाले वर्शन अब इस उद्देश्य के लिए अनलॉक किए गए कार्यों को आपके नियंत्रक, या ऐपकंट्रोलर में पहले से उपयोग करने के लिए शामिल किया गया है।

$this->Security->unlockedActions = array('ajaxAction'); 

से: http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html#disabling-security-component-for-specific-actions

0

जोसेफ जवाब मेरे लिए एक विस्तार याद आ रही थी।मेरा फॉर्म और AJAX कॉल index.ctp में था और कॉल /controller/edit.ctp को कॉल कर रहा था, इसलिए मेरा $ यह-> फॉर्म-> कॉल को 'action' => '/ नियंत्रक/संपादित करें' में जोड़ा गया।

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