Laravel 11.x 默认启用完整 CSRF 防护,无固有漏洞;需确保 VerifyCsrfToken 中间件启用、表单含 @csrf、AJAX 携带 X-CSRF-TOKEN 头,并谨慎排除例外路由。

确认 VerifyCsrfToken 中间件已启用
Laravel 11.x 的 web 路由组默认应用 App\Http\Middleware\VerifyCsrfToken::class,无需额外开启。但需检查:
- 打开
app/Http/Kernel.php,确认$middlewareGroups['web']中包含该中间件(未被注释或移除) - 确保你的表单或请求走的是
web中间件组(即定义在routes/web.php中),而非api路由(api组默认不启用 CSRF)
所有 POST/PUT/PATCH/DELETE 表单必须含 @csrf
Blade 模板中,任何非 GET 表单都必须插入 @csrf 指令——它会自动渲染一个带有效令牌的隐藏字段:
<form method="POST" action="/user/update">
@csrf
<input type="text" name="name">
<button type="submit">保存</button>
</form>
不要手写 <input name="_token"> 或用 csrf_field() 替代 @csrf,二者等价,但 @csrf 更规范、不易遗漏。
AJAX 请求必须携带最新 X-CSRF-TOKEN 头
前端 JS(如 Axios、Fetch)发送非 GET 请求时,需从页面 meta 标签读取并设置请求头:
- 在模板
<head>中添加:<meta name="csrf-token" content="{{ csrf_token() }}"> - Axios 全局配置示例:
axios.defaults.headers.common['X-CSRF-TOKEN'] = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); - 若使用 Fetch,手动添加:
headers: { 'X-CSRF-TOKEN': tokenValue } - 注意:令牌绑定会话,页面长期未刷新可能导致过期;可配合 Laravel 的 session lifetime 设置,或对敏感操作要求用户重新认证
排除例外路由要谨慎,禁用 CSRF 是高危操作
仅当明确需要(如接收第三方 webhook)才跳过验证,且必须补充其他安全措施:
- 在
app/Http/Middleware/VerifyCsrfToken.php的$except数组中添加路径,例如:protected $except = ['webhook/stripe', 'api/notify']; - 但禁止写
$except = ['*']或全局注释掉中间件——这等于关闭防护大门 - 被排除的路由必须自行实现签名验证、IP 白名单、专用密钥校验等替代方案


















