2011-10-02 6 views
6

저는 codeigniter-paypal-ipn과 협력 중이며 csrf_protection을 활성화했습니다. 이것은 페이팔에서 내 IPN 컨트롤러에 대한 액세스를 차단하는 것 같습니다. csrf_protection을 비활성화하면 csrf_protection이 활성화 된 상태에서 잘 작동하며 paypal IPN 서비스는 500 내부 서버 오류를 발생시킵니다.Codeigniter : Paypal IPN 및 csrf_protection

csrf_protection을 비활성화하지 않고이 문제를 해결할 방법이 있습니까? 그렇지 않은 경우 컨트롤러에 대한 csrf_protection을 비활성화 할 수 있습니까?

감사합니다.

답변

4

알렉스 제작자는 여기 codeigniter-paypal-ipn입니다. 지금은 csrf_protection을 활성화 한 상태에서 IPN 게시물을 사용할 수있는 방법을 모르고 있습니다. 다른 언어/프레임 워크가 어떻게 작동하는지 살펴 봅니다. django-paypal IPN - 그들은 CSRF exemption to the specific IPN controller을 추가합니다.

으로 IMM 당신이 기다릴 수 있다면, 그것은 아무튼 아래 caseyamcl의 접근 방식을 시도 (병합 세밀한 컨트롤이 유형의 this pull request있는 버전까지 CodeIgniter의에서 사용할 수 없습니다 말한다 CI 핵 해킹 관련 ...)

CSRF 상황을 명확하게하기 위해 프로젝트의 README을 업데이트했습니다.

+0

두 번째 링크가 고장 –

12

질문에 대한 답변을 얻었지만 CI 코어를 해킹하지 않고 비슷한 방식으로 해냈습니다. 내 application/config/config.php 파일에 다음을 추가했습니다 :

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

배열에는 원하는 경로가 포함될 수 있습니다. 위의 예는 '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

불편을 끼쳐 드려 죄송합니다. 많은 끔찍한 방법을 검색하고 구현 한 후에이 대답을 보았습니다. 이것은 지금까지 보아온 최고의 솔루션입니다 (PayPal 요청 뿐만이 아닙니다!). 우수하고 많은 감사합니다. – twistedpixel