laravel 默认通过 csrf 中间件和 @csrf 指令防护 CSRF 攻击,原理是比对请求 Token 与 session 中存储的随机加密 token 是否一致;ajax 需手动设置 X-CSRF-TOKEN 请求头;api/、_ignition/、telescope/ 路由默认豁免验证。

Laravel 默认通过 CSRF 中间件和隐藏表单字段自动防护 CSRF 攻击,核心是验证每次非 GET 请求携带的 token 是否与服务端会话中存储的一致。
CSRF 保护原理
Laravel 在用户首次访问时生成一个随机、加密的 CSRF token,并存入当前 session。后续所有 POST、PUT、PATCH、delete 等非安全请求,都必须携带该 token(通常放在表单 hidden 字段或请求头中)。服务端收到请求后,比对提交的 token 和 session 中保存的是否匹配——不一致则拒绝请求,返回 419 状态码。
这个机制有效是因为:攻击者无法读取目标站点的响应内容(受同源策略限制),也就拿不到合法用户的 token,无法构造出带正确 token 的恶意请求。
表单中自动插入 CSRF token
在 Blade 模板中,使用 @csrf 指令即可插入隐藏字段:
渲染后等价于:
AJAX 请求如何携带 token
前端 javaScript 发起 AJAX 请求时,需手动设置 X-CSRF-TOKEN 请求头:
// axios 示例
axios.defaults.headers.common[‘X-CSRF-TOKEN’] = document.querySelector(‘meta[name=”csrf-token”]’).getAttribute(‘content’);
// jQuery 示例
$.ajaxSetup({
headers: {
‘X-CSRF-TOKEN’: $(‘meta[name=”csrf-token”]’).attr(‘content’)
}
});
哪些路由默认豁免 CSRF 验证
Laravel 将以下路径前缀下的路由自动排除在 VerifyCsrfToken 中间件之外:
-
api/(API 路由组,默认无 session,用 token 认证) -
_ignition/(调试工具 Ignition) -
telescope/(Telescope 监控面板)
如需自定义豁免规则,可在 app/http/Middleware/VerifyCsrfToken.php 的 $except 数组中添加路径模式,例如:
protected $except = [‘stripe/webhook’, ‘webhook/*’];
基本上就这些。不复杂但容易忽略的是:AJAX 请求漏设 header、手动构造表单忘了 @csrf、或误将 API 路由放到 web 中间件组里——这三类最容易引发 419 错误。
以上就是Laravel如何保护应用免受CSRF攻击?(原理和示例)的详细内容,更多请关注php中文网其它相关文章!