2011-10-02 5 views
6

私はcodeigniter-paypal-ipnと一緒に働いており、csrf_protectionを有効にしています。 これはPaypalから私の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あなたは待つことができないならば、それはdoesnのよう以下caseyamclのアプローチを試してみてください(マージされたきめの細かい制御のこのタイプはthis pull requestとバージョンまでのCodeIgniterで使用することはできません、と言いますCIコアのハッキングを含む)

CSRFの状況を明確にするために、私のプロジェクトのREADMEを更新しました。

+0

あなたの第2のリンクが壊れている –

12

私は質問が答えられたことを知っていますが、私はCIコアをハッキングしないで同様の方法でそれを行いました。配列は、あなたが好きなパスを含めることができます

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

:私は私のapplication/config/config.phpファイルに以下を追加しました。上記の例は、 '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