Codeigniter: Paypal IPN和csrf_protection

6
我正在使用codeigniter-paypal-ipn进行工作,并启用了csrf_protection。 这似乎会阻止Paypal访问我的IPN控制器。如果我禁用csrf_protection,它可以正常工作,但启用csrf_protection后,Paypal IPN服务会抛出500内部服务器错误。
有没有办法在不禁用csrf_protection的情况下解决这个问题? 如果不能,我可以为该控制器禁用csrf_protection吗?
谢谢。
3个回答

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 */

谢谢,Case,这是非常有帮助的补充! - Alex Dean
抱歉打扰,但在搜索和实施许多可怕的方法后,我找到了这个答案。这是迄今为止我见过的最好的解决方案(不仅适用于PayPal请求!)。非常出色,感谢您。 - twistedpixel
这应该是被接受的答案! 我简直不敢相信这么容易实现。上面的只有一个澄清让我有点困惑:字符串适用于您控制器/方法的任何实现方式,例如“paypal/ipn”将直接进入您的IPN方法,而“paypal”会打开整个控制器。 - gillytech

4

我是codeigniter-paypal-ipn 的创作者Alex。目前,我还不知道如何在启用csrf_protection的情况下使IPN帖子正常工作。如果您查看另一种语言/框架的操作方式,例如django-paypal IPN,则它们会向特定的IPN控制器添加CSRF豁免权

就像imm所说的那样,在CodeIgniter中这种细粒度控制将不可用,直到合并了此拉取请求的版本(如果您等不及,请尝试caseyamcl下面的方法,因为它不涉及hack CI core...)

我已更新我的项目的README,以使CSRF情况更清晰易懂。


你的第二个链接已经失效了。 - Babken Vardanyan

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接