VeryFying Codeigniter CSRF令牌

时间:2019-10-15 00:42:47

标签: php codeigniter csrf

我要发布此表格,并像这样放置我的csrf令牌

控制器方法

$csrf = array(
        'name' => $this->security->get_csrf_token_name(),
        'hash' => $this->security->get_csrf_hash()
);

通过这样的视图

<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />

文档说

  

令牌可以在每次提交时重新生成(默认):https://codeigniter.com/user_guide/libraries/security.html

我的问题是csrf的实际验证方式。提交表单时使用$this->security->get_csrf_hash()时,该值等于提交的哈希值,还是将发布的csrf哈希值视为有效?。

2 个答案:

答案 0 :(得分:0)

要做的是在$config['csrf_protection']中启用它,并在表单中使用form_open()函数。

CodeIgniter将自动插入并检查CSRF。

答案 1 :(得分:0)

您可以通过以下方式更改application / config / config.php文件来启用CSRF保护:

$config['csrf_protection'] = TRUE;

如果使用表单助手,则form_open()将自动在表单中插入一个隐藏的csrf字段。如果没有,那么您可以使用get_csrf_token_name()get_csrf_hash()

$csrf = array(
        'name' => $this->security->get_csrf_token_name(),
        'hash' => $this->security->get_csrf_hash()
);

<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />

令牌可以在每次提交时重新生成(默认),也可以在CSRF cookie的整个生命周期内保持不变。令牌的默认重新生成提供了更严格的安全性,但是可能会导致可用性问题,因为其他令牌将变得无效(后退/前进导航,多个选项卡/窗口,异步操作等)。您可以通过编辑以下配置参数来更改此行为

$config['csrf_regenerate'] = TRUE;

可以从csrf保护中将选择URI列入白名单(例如,期望外部发布内容的API端点)。您可以通过编辑‘csrf_exclude_uris’配置参数来添加这些URI:

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

还支持正则表达式(不区分大小写):

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

我认为这对您非常有帮助。