Codeigniter:Paypal IPN 和 csrf_protection

Posted

技术标签:

【中文标题】Codeigniter:Paypal IPN 和 csrf_protection【英文标题】:Codeigniter: Paypal IPN and csrf_protection 【发布时间】:2011-11-29 12:16:48 【问题描述】:

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

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

谢谢。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

codeigniter-paypal-ipn 的创建者 Alex 在这里。目前我不知道如何让 IPN 帖子在启用 csrf_protection 的情况下工作。如果你看看另一种语言/框架是如何做到的,例如django-paypal IPN - 他们添加了CSRF exemption to the specific IPN controller。

正如 imm 所说,这种类型的细粒度控件在 CodeIgniter 中将不可用,直到合并了 this pull request 的版本(如果你等不及了,试试 caseyamcl 的方法如下,因为它不涉及黑客 CI 核心...)

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

【讨论】:

你的第二个链接坏了【参考方案3】:

我知道该问题已得到解答,但我以类似的方式完成了该问题,但并未破解 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 */

【讨论】:

谢谢案例,这是一个非常有用的补充! 对不起,我在搜索和实施许多可怕的方法后遇到了这个答案。这是迄今为止我见过的最好的解决方案(不仅仅是针对 PayPal 请求!)。非常好,非常感谢。 这应该是公认的答案!我不敢相信这是多么简单的实现。对上述内容的一个澄清让我有点失望:该字符串适用于您的控制器/方法,但您实现了 IPN。例如'paypal/ipn' 会直接进入你的 IPN 方法,而 'paypal' 会打开整个控制器。

以上是关于Codeigniter:Paypal IPN 和 csrf_protection的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Codeigniter 中接收 PayPal IPN 响应

PHP/CodeIgniter PayPal IPN 无效验证

从 cURL 支付向 paypal IPN 添加自定义变量

Codeigniter .htaccess 不忽略目录

Paypal:IPN 侦听器未收到 IPN 消息

Paypal 动态按钮和 IPN 链接