8

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

为了防止CSRF我在 config.php 中设置它,它适用于所有页面。有什么方法可以通过在控制器中设置仅对某些页面执行此操作吗?

$config['csrf_protection'] = TRUE;
4

3 回答 3

14

您可以通过编辑config.php文件来做到这一点

 $config['csrf_protection'] = FALSE;

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

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

Step2:检查是否有对受保护页面的请求,然后将其设置为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 令牌字段。

于 2016-04-05T21:40:35.770 回答
13

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

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


$config['csrf_exclude_uris'] = array(
    'api/record/[0-9]+',
    'api/title/[a-z]+'
);
于 2015-02-13T07:33:21.610 回答
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;
    }
} 
于 2018-07-02T20:15:36.017 回答