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

Posted

技术标签:

【中文标题】CodeIgniter 仅在某些页面使用 CSRF 保护【英文标题】:CodeIgniter use CSRF protection only in some pages 【发布时间】:2013-08-25 01:55:17 【问题描述】:

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

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

$config['csrf_protection'] = TRUE;

【问题讨论】:

此功能已在 CI 3.0-DEV 中实现,如果您使用的是 CI 的 v2.x,请查看此答案并尝试一下:***.com/a/15860653/1725764 @HashemQolami 谢谢,请留下答案以接受。 恕我直言,提出一个确切的答案不是一种好方法,它会是重复的内容。我发布了一个类似问题的链接,应该作为参考。 【参考方案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;
    
 

【讨论】:

【参考方案2】:

您可以通过编辑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 令牌字段。

【讨论】:

我将它用于 $config['csrf_regenerate'] ,反之亦然,因此默认值为 true,我只为我的 ajax 页面禁用它。禁用 CSRF 不好,但关闭 regen 是一个可行的修复。【参考方案3】:

现在 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]+'
);

【讨论】:

以上是关于CodeIgniter 仅在某些页面使用 CSRF 保护的主要内容,如果未能解决你的问题,请参考以下文章

防止在 Codeigniter 中显示默认的 CSRF 错误页面

在没有表格的情况下获取 Codeigniter CSRF 令牌?

将特定页面限制为仅在 Codeigniter 中登录用户的最佳实践是啥?

Codeigniter 4 在 AJAX 模式中重用 CSRF 令牌

CodeIgniter 和 CSRF

CodeIgniter 的 CSRF 令牌问题