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 响应