CodeIgniter仅在某些页面中使用CSRF保护

时间:2013-08-22 11:05:19

标签: codeigniter codeigniter-2 csrf

我想要做的是保护某些敏感表单不受CSRF codeigniter攻击,而不是所有页面。

如果我在config.php中设置它,则要保护CSRF,它适用于所有页面。有什么办法可以通过在控制器中设置来为某些页面做到这一点吗?

$config['csrf_protection'] = TRUE;

3 个答案:

答案 0 :(得分:10)

现在CI3具有此功能,我们可以在配置中排除URI http://www.codeigniter.com/userguide3/libraries/security.html?highlight=csrf#cross-site-request-forgery-csrf

$config['csrf_exclude_uris'] = array('api/person/add');


$config['csrf_exclude_uris'] = array(
    'api/record/[0-9]+',
    'api/title/[a-z]+'
);

答案 1 :(得分:8)

您可以通过编辑config.php文件

来执行此操作
 $config['csrf_protection'] = FALSE;

第1步:创建要保护的网页数组

例如。 $csrf_pages = array('login','test');

步骤2:检查是否有对受保护页面的请求,然后将其设置为TRUE;

if (isset($_SERVER["REQUEST_URI"])) {
    foreach ($csrf_pages as $csrf_page){
        if(stripos($_SERVER["REQUEST_URI"],$csrf_page) !== FALSE) {
            $config['csrf_protection'] = TRUE;
            break;
        }
    }

}

第3步:将其添加到您的观看

<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash();?>" />

或者只需使用form_open()函数自动添加隐藏的CSRF令牌字段。

答案 2 :(得分:1)

为获得更安全的方法,您应始终打开CSRF保护,并且仅免除config.php文件中数组中所需的某些页面。

$config['csrf_protection'] = TRUE;

然后设置一系列您希望免于CSRF保护的链接:

$csrf_off = array(
    "/api",
    "/api/example",
    "/somelink/something/example"
    );

现在关闭那些阵列链接的CSRF保护。

if (isset($_SERVER["REQUEST_URI"])) {
    if (in_array($_SERVER["REQUEST_URI"],$csrf_off)) {
        $config['csrf_protection'] = FALSE;
    }
}