Codeigniter:Paypal IPN 和 csrf_protection

发布于 2024-12-07 16:12:16 字数 341 浏览 0 评论 0原文

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

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

谢谢。

I'm working with codeigniter-paypal-ipn and have csrf_protection enabled.
This seems to block the access from Paypal to my IPN controller. If i disable csrf_protection it works just fine, with csrf_protection enabled, paypal IPN service throws a 500 Internal Server Error.

Is there a way to solve this without disabling the csrf_protection?
If not, can i disable the csrf_protection just for that controller?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

樱花坊 2024-12-14 16:12:16

我知道问题已经得到解答,但我以类似的方式做到了这一点,而没有破解 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 */

I know the question has been answered, but I did it in a similar way without hacking the CI core. I added the following to my application/config/config.php file:

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

The array can include any paths you like. The example above will apply to any paths that begin with 'api'.

Then, I added the following file: 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 */
秋千易 2024-12-14 16:12:16

Alex 是 codeigniter-paypal-ipn 的创建者。目前我不知道如何让 IPN 帖子在启用 csrf_protection 的情况下工作。如果你看看另一种语言/框架是如何做到的,例如 django-paypal IPN - 他们添加了 特定 IPN 控制器的 CSRF 豁免

正如 imm 所说,这种类型的细粒度控制在 CodeIgniter 中不可用,直到具有 此拉取请求已合并(如果您等不及,请尝试下面的caseyamcl方法,因为它不涉及攻击 CI 核心...)

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

Alex the creator of codeigniter-paypal-ipn here. At the moment I'm not aware of a way to get the IPN post working with csrf_protection enabled. If you look at how another language/framework does it, e.g. django-paypal IPN - they add a CSRF exemption to the specific IPN controller.

As imm says, this type of fine-grained control won't be available in CodeIgniter till a version with this pull request is merged (if you can't wait, try caseyamcl's approach below as it doesn't involve hacking CI core...)

I've updated my project's README to make the CSRF situation clearer.

秋风の叶未落 2024-12-14 16:12:16

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

Someone asked a similar question on http://ellislab.com/forums/viewthread/200625/, disabling csrf for a single controller will be available in the next release.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文