2013-04-05 87 views
4

工作我想只有我的几个控制器来接通CSRF保护,所以我有设置配置项(CSRF)犯规在笨

function __construct() { 

    parent::__construct(); 
    $this->load->library('form_validation');   
    $this->load->library('tank_auth'); 
    $this->load->helper(array('form', 'url')); 
    $this->load->model('user_model', '', true); 

    $this->config->set_item('csrf_protection', TRUE); 

} 

但它似乎没有工作,虽然我的时候做一个页面上的var_dump($这个 - >配置),它表明csrf_protection是真的,但饼干没有设置,窗体上有一个隐藏字段没有值

<input type="hidden" name="ci_csrf_token" value="" />

CSRF令牌名和cookie的名称是所有设置,窗体都调用form_open()。

任何帮助将不胜感激。

更新:所以从因安全类线的2.1.1版本构建if (config_item('csrf_protection') === TRUE) {

安全类控制器之前初始化,所以这是不可能的它自然,在控制器中的配置项的变化不会影响它。

+0

尝试设置的配置项之前加载的形式帮助这里建正则表达式? – jcorry 2013-04-05 20:33:03

+0

嗨!感谢您的快速回答,不幸的是,这并没有解决问题,我已经把parent_构造之后的set_item放在 – Bndr 2013-04-05 20:38:49

+1

之后。CSRF保护是核心的一部分,并且在处理任何控制器之前进行初始化。如果你想这样做,而且你运行的是CI 2.x,你可能需要在'application/core'中用'MY_Security.php'文件修改核心,并在那里提供你的逻辑来将CSRF应用到特定的控制器。你想阅读[this](http://ellislab.com/codeigniter/user-guide/general/core_classes.html)并检查文件'system/core/Security.php'如果你正在运行CI 3.x它有一个新的配置项'$ config ['csrf_exclude_uris'] = array();'这将做你想要的。但它只在CI 3.x – 2013-04-06 06:13:15

回答

4

我有适合您的解决方案。创建一个自定义应用程序/核心/ MY_Security.php,并把这个在它:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

class MY_Security extends CI_Security 
{ 
    public function csrf_verify() 
    { 
     foreach (config_item('csrf_excludes') as $exclude) 
     { 
      $uri = load_class('URI', 'core'); 
      if (preg_match($exclude, $uri->uri_string()) > 0) 
      { 
       // still do input filtering to prevent parameter piggybacking in the form 
       if (isset($_COOKIE[$this->_csrf_cookie_name]) && preg_match('#^[0-9a-f]{32}$#iS', $_COOKIE[$this->_csrf_cookie_name]) == 0) 
       { 
        unset($_COOKIE[$this->_csrf_cookie_name]); 
       } 
       return; 
      } 
     } 
     parent::csrf_verify(); 
    } 
} 

这将检查,你需要把你的应用程序/ config.php文件中CSRF段以下不包括:

$config['csrf_excludes'] = array 
    ('@^/?excluded_url_1/[email protected]' 
    , '@^/?excluded_url_2/[email protected]'); 

CSRF检查将排除每个匹配的URL模式。您可以在http://rubular.com

欢呼

+0

嗨!感谢您的回答,我确实如此。 我将CI 3.0的安全类复制到MY_security类,因为它已经可以选择使用$ config ['csrf_exclude_uris']关闭特定URL的CSRF保护,这对于将来迁移到CI 3.0来说是一个更简单的解决方案。但你的解决方案也很好,谢谢! – Bndr 2013-04-07 13:10:01