我正在使用codeigniter-paypal-ipn并启用了csrf_protection。 这似乎阻止了从Paypal到我的IPN控制器的访问。如果我禁用csrf_protection它工作得很好,启用了csrf_protection,paypal IPN服务会抛出500内部服务器错误。
有没有办法在不禁用csrf_protection的情况下解决这个问题? 如果没有,我可以为该控制器禁用csrf_protection吗?
感谢。
答案 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。