禁用自动CSRF验证并切换到手动

时间:2012-01-09 05:35:04

标签: php codeigniter

我正在使用CodeIgniter的核心CSRF库,它工作正常但是有很多地方我不需要像API调用和回调那样的CSRF,无论如何都禁止库自动验证POST请求并让我手动指定我是否要验证。

示例:

$this->security->verify_csrf();

P.S。我实际上修改了安全类,我让它工作,但我更喜欢一个只扩展核心而不是硬编码的解决方案。

2 个答案:

答案 0 :(得分:0)

为什么不扩展安全类?

<?php

class MY_Security extends CI_Security {
    public function csrf_verify()
    {
        $bypass_csrf = TRUE; // some logic to bypass csrf goes here
        if ($bypass_csrf)
        {
            return $this->csrf_set_cookie();
        }
        else
        {
            return parent::csrf_verify();
        }
    }
}

答案 1 :(得分:0)

遇到同样的问题,我最终做的是禁用全局CSRF验证并在控制器中进行验证。

所以在我的application / config / config.php中,我设置了

$config['csrf_protection'] = FALSE;

在我的自定义控制器(application / core / MY_Controller.php)中,我有一个控制csrf_protection的属性,如下所示:

class MW_Controller extends CI_Controller {
    var $csrf_protection = TRUE; // on by default

    function __construct()
    {
        parent::__construct();

        if ($this->csrf_protection)
        {
            $this->security->csrf_verify();
        }
    }
    ....

我的其他控制器扩展了MY_Controller,所以我可以根据需要设置$ csrf-&gt;保护错误。例如,我的Auth控制器禁用CSRFchecks:

class Auth extends My_Controller {
    var $csrf_protection = FALSE; // don't need CSRF during login
    ....

希望有所帮助,它可以在不破坏核心的情况下完成工作。