Codeigniter:Paypal IPN和csrf_protection

时间:2011-10-02 18:29:10

标签: codeigniter paypal paypal-ipn codeigniter-2

我正在使用codeigniter-paypal-ipn并启用了csrf_protection。 这似乎阻止了从Paypal到我的IPN控制器的访问。如果我禁用csrf_protection它工作得很好,启用了csrf_protection,paypal IPN服务会抛出500内部服务器错误。

有没有办法在不禁用csrf_protection的情况下解决这个问题? 如果没有,我可以为该控制器禁用csrf_protection吗?

感谢。

3 个答案:

答案 0 :(得分:13)

我知道这个问题已经得到了解答,但我在没有破解CI核心的情况下以类似的方式做到了。我将以下内容添加到我的application / config / config.php文件中:

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

数组可以包含您喜欢的任何路径。上面的示例将适用于以'api'开头的任何路径。

然后,我添加了以下文件: application / core / 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 */

答案 1 :(得分:4)

Alex codeigniter-paypal-ipn的创造者。目前我还没有意识到如何使用启用csrf_protection的IPN帖子。如果你看看另一种语言/框架是如何做到的,例如django-paypal IPN - 他们添加CSRF exemption to the specific IPN controller

正如 imm 所说,在合并this pull request的版本之前,这种类型的细粒度控件将无法在CodeIgniter中使用(如果您不能等待,请尝试 caseyamcl 的方法,因为它不涉及黑客CI核心...)

我更新了我的项目README,以使CSRF情况更加清晰。

答案 2 :(得分:2)

有人在http://ellislab.com/forums/viewthread/200625/上提出类似的问题,在下一个版本中将禁用单个控制器的csrf。