Laravel如何保护应用免受CSRF攻击?(原理和示例)

2次阅读

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

Laravel如何保护应用免受CSRF攻击?(原理和示例)

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 指令即可插入隐藏字段:

  @csrf
  
  

渲染后等价于:

Laravel如何保护应用免受CSRF攻击?(原理和示例)

MGX

MetaGPT推出的自然语言编程工具

Laravel如何保护应用免受CSRF攻击?(原理和示例) 163

查看详情 Laravel如何保护应用免受CSRF攻击?(原理和示例)

AJAX 请求如何携带 token

前端 javaScript 发起 AJAX 请求时,需手动设置 X-CSRF-TOKEN 请求头:

  • 先从 meta 标签中读取 token(Laravel 默认在 app.blade.php 中注入):
  • 然后在 js 中统一设置 axiosjquery

// 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中文网其它相关文章!

text=ZqhQzanResources