2011-10-02 9 views
6

मैं codeigniter-paypal-ipn साथ काम कर रहा हूँ और csrf_protection सक्षम है। ऐसा लगता है कि पेपैल से मेरे आईपीएन नियंत्रक तक पहुंच को अवरुद्ध कर दिया गया है। अगर मैं csrf_protection को अक्षम करता हूं तो यह ठीक काम करता है, csrf_protection सक्षम के साथ, पेपैल आईपीएन सेवा 500 आंतरिक सर्वर त्रुटि फेंकता है।Codeigniter: Paypal IPN और csrf_protection

क्या csrf_protection को अक्षम किए बिना इसे हल करने का कोई तरीका है? यदि नहीं, तो क्या मैं केवल उस नियंत्रक के लिए csrf_protection को अक्षम कर सकता हूं?

धन्यवाद।

उत्तर

4

एलेक्स codeigniter-paypal-ipn के निर्माता एलेक्स। फिलहाल मैं एक तरह से IPN पद csrf_protection के साथ काम सक्षम करने के लिए के बारे में पता नहीं कर रहा हूँ। यदि आप देखते हैं कि दूसरी भाषा/ढांचा कैसे करता है, उदा। डीजेंगो-पेपैल आईपीएन - वे CSRF exemption to the specific IPN controller जोड़ते हैं।

रूप IMM कहते हैं, कुशल नियंत्रण के इस प्रकार this pull request के साथ एक संस्करण तक CodeIgniter में उपलब्ध नहीं होगा विलय कर दिया है (यदि आप इंतजार नहीं कर सकता, नीचे ऐसा नहीं के रूप में caseyamcl के तरीके का प्रयास करें 'टी हैकिंग सीआई कोर शामिल ...)

मैं अपने प्रोजेक्ट के README CSRF स्थिति स्पष्ट करने के नवीनीकृत किया है।

+0

आपकी दूसरी लिंक टूट गया है –

2

किसी ने एक ही प्रश्न पूछा http://ellislab.com/forums/viewthread/200625/ पर, एक ही नियंत्रक के लिए सीएसआरएफ अक्षम करने से अगली रिलीज में उपलब्ध होगा।

12

मुझे पता है कि सवाल का उत्तर दिया गया है, लेकिन मैंने इसे सीआई कोर को हैक किए बिना इसी तरह किया। मैंने अपने आवेदन/config/config.php फ़ाइल में निम्न जोड़ा:

$config['csrf_ignore'] = array('api'); 

सरणी में आपके पसंदीदा पथ शामिल हो सकते हैं। ऊपर दिया गया उदाहरण 'एपीआई' से शुरू होने वाले किसी भी पथ पर लागू होगा।

फिर, मैं निम्न फ़ाइल कहा: आवेदन/कोर/MY_Input.php:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Input extends CI_Input 
{ 
    function _sanitize_globals() 
    { 
     $ignore_csrf = config_item('csrf_ignore'); 

     if (is_array($ignore_csrf) && count($ignore_csrf)) 
     { 
      global $URI; 
      $haystack = $URI->uri_string(); 

      foreach($ignore_csrf as $needle) 
      { 
       if (strlen($haystack) >= strlen($needle) && substr($haystack, 0, strlen($needle)) == $needle) 
       { 
        $this->_enable_csrf = FALSE; 
        break; 
       } 
      }   
     } 

     parent::_sanitize_globals(); 
    } 
} 
/* EOF: MY_Input */ 
+0

धन्यवाद मामला है, कि एक बहुत ही उपयोगी इसके अतिरिक्त है! –

+0

, बहुत बहुत मददगार जवाब –

+0

टक्कर करने के लिए क्षमा करें मेरे लिए पूरी तरह से काम किया है, लेकिन मैं खोज रहा है और कई भयानक तरीकों को लागू करने के बाद इस उत्तर बारे में जाना। यह अब तक का सबसे अच्छा समाधान है (और पेपैल अनुरोधों के लिए नहीं!)। उत्कृष्ट और बहुत धन्यवाद। – twistedpixel