codeigniter 4 的 csrf 防护需配置、启用和前端配合三步缺一不可:配置 security.php 中参数,filters.php 中启用 csrf 过滤器,前端表单用 csrf_field() 或 ajax 携带 x-csrf-token 请求头。

CodeIgniter 4 的 CSRF 防护不是“开个开关”就自动生效的,必须完成配置 + 启用 + 前端配合三步,缺一不可。
配置 CSRF 参数
打开 app/Config/Security.php,确认以下关键项已设置:
-
$csrfProtection = true;(启用防护) -
$tokenName = 'csrf_test_name';(令牌字段名,可自定义) -
$cookieName = 'csrf_cookie_name';(存储令牌的 Cookie 名) -
$expire = 7200;(建议设为 2 小时,避免过长有效期) -
$regenerate = true;(每次请求都刷新令牌,推荐开启)
注意:
$CSRFHeaderName已迁入此文件(非旧版的App.php),默认值为'X-CSRF-TOKEN',用于 AJAX 请求头校验。
在过滤器中启用 CSRF
打开 app/Config/Filters.php,将 'csrf' 加入全局或指定路由组的 before 列表:
public $globals = [
'before' => [
'csrf', // ← 关键:加上这一行
],
];
或者只对表单提交类路由启用:
public $methods = [
'post' => ['csrf'],
];
前端必须携带有效令牌
-
普通表单:在
<form></form>内插入= csrf_field() ?>,它会生成隐藏域<input type="hidden" name="csrf_test_name" value="xxx">。 -
AJAX 请求:从 Cookie 读取令牌(如用
document.cookie.match(/csrf_cookie_name=([^;]+)/)),并在请求头中带上:headers: { 'X-CSRF-TOKEN': tokenValue } -
API 接口:若用 JSON 提交,也可把令牌放在请求体中同名字段(如
{ "csrf_test_name": "xxx" }),框架会自动识别。
验证是否生效
提交一个没带令牌的 POST 请求(比如删掉 csrf_field() 或清空请求头),应返回 403 Forbidden;带正确令牌则正常处理。这是最直接的验证方式。
不复杂但容易忽略











