2012-01-09 64 views
0

我使用CodeIgniter的核心CSRF库,它工作正常,但有很多地方我不需要像API调用和回调一样的CSRF,是否有禁用库从自动验证POST请求,并让我手动指定我是否要验证。禁用自动CSRF验证并切换到手动

实施例:

$this->security->verify_csrf(); 

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

回答

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(); 
     } 
    } 
} 
0

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

所以在我的application/config/config.php文件,我设置

$config['csrf_protection'] = FALSE; 

在我的自定义控制器(应用/核心/ 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-> protection false。例如,我的身份验证控制器禁用CSRFchecks:

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

希望有所帮助,它可以完成工作而不会破坏核心。

+0

对不起碰到这篇文章,但我碰到这个,实现它,不幸的是,当启用csrf时,每次提交表单时都会显示csrf错误!任何想法可能发生什么? – twistedpixel 2013-11-17 20:36:43

+0

似乎CI不会生成csrf cookie或隐藏表单元素。 – twistedpixel 2013-11-17 20:49:47