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 中登录用户的最佳实践是啥?