You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:15:00