2013-04-05 64 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