我正在张贴此表格,并且正在像这样放置我的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'];?>" />
文档说Tokens may be either regenerated on every submission (default)
:https://codeigniter.com/user_guide/libraries/security.html
我的问题是,如何实际验证csrf。当我在提交表单时使用$this->security->get_csrf_hash()
时,该值应等于提交的哈希值,还是将发布的csrf哈希值视为有效?。
您要做的是在$config['csrf_protection']
中启用它,并在表单中使用form_open()
功能。
CodeIgniter将自动插入并检查CSRF。
您可以通过以下方式更改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参数来更改此行为
$config['csrf_regenerate'] = TRUE;
选择URI可以从csrf保护中列入白名单(例如,期望外部发布内容的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]+'
);
我认为这对您非常有帮助。