CodeIgniter 3中启用CSRF保护及解决get_csrf_hash()无返回问题
CodeIgniter 3中CSRF哈希值拿不到?试试这几个办法
先确认CSRF配置是否正确启用
打开application/config/config.php,检查核心配置项:
$config['csrf_protection'] = TRUE; // 必须设为TRUE,这是获取哈希值的前提 $config['csrf_token_name'] = 'csrf_test_name'; $config['csrf_cookie_name'] = 'csrf_cookie_name'; $config['csrf_expire'] = 7200; $config['csrf_regenerate'] = TRUE;
如果csrf_protection是FALSE,直接改成TRUE——这是最容易忽略的基础问题。
确保Security类能正常调用
CodeIgniter 3默认自动加载Security类,但如果手动修改过自动加载配置,就在控制器里手动加载:
$this->load->library('security');
也可以去application/config/autoload.php中检查$autoload['libraries']是否包含'security',没有的话添加上即可。
换种方式在视图中调用
别死磕$this->security->get_csrf_hash(),直接用框架提供的全局函数更稳妥:
<input type="hidden" name="<?php echo get_csrf_token_name(); ?>" value="<?php echo get_csrf_hash(); ?>" />
要是还是不行,就在控制器里先获取哈希值,再传递给视图:
// 控制器代码 $csrf_data['csrf_name'] = $this->security->get_csrf_token_name(); $csrf_data['csrf_hash'] = $this->security->get_csrf_hash(); $this->load->view('你的视图文件名', $csrf_data); // 视图中直接使用变量 <input type="hidden" name="<?php echo $csrf_name; ?>" value="<?php echo $csrf_hash; ?>" />
检查Cookie和请求环境
CSRF哈希值存储在Cookie中,打开浏览器开发者工具的「Application」标签,查看csrf_cookie_name对应的Cookie是否存在。如果没有,可能是浏览器禁用了Cookie,或者Cookie的路径/域名配置有误。
另外注意:不要在命令行(CLI)模式下测试,CodeIgniter会自动给CLI模式禁用CSRF保护,这种场景下拿不到哈希值是正常的,必须通过网页浏览器发起HTTP请求测试。
注意csrf_regenerate的细节
如果csrf_regenerate设为TRUE,每次请求都会生成新的哈希值。如果是AJAX请求,记得每次都要从响应中获取新的哈希值,否则下次请求会触发CSRF验证失败。
内容的提问来源于stack exchange,提问作者AliUsama Dev
相关产品推荐
相关产品推荐

