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

Laravel:Axios登录无需CSRF令牌?是否有风险及解决方法?

问题解答

安全风险分析

这肯定存在CSRF攻击风险。CSRF攻击的本质是攻击者借助用户已登录的浏览器会话,诱导用户发起伪造的请求到目标站点。如果登录接口不校验CSRF令牌,攻击者可以构造恶意页面,通过脚本自动发送POST请求——虽然登录需要账号密码,但一旦用户被钓鱼获取了凭证,或者凭证已被窃取,这种无校验的接口会让攻击变得毫无阻碍;更严重的是,如果后续其他敏感操作接口(比如修改密码、个人信息变更)也采用这种逻辑,整个系统的安全边界会被彻底突破。

问题原因

核心是后端对不同类型请求的CSRF校验逻辑不一致:

  • 后端大概率只针对application/x-www-form-urlencoded或multipart/form-data类型的表单请求(即传统HTML表单提交的格式)开启了CSRF校验;
  • Axios默认发送的是application/json格式的请求,后端没有对该Content-Type的请求做CSRF令牌校验,因此直接放行;
  • 也有可能后端的校验逻辑仅检查表单请求体中的特定字段(如_csrf),但JSON请求中没有该字段,后端却未强制校验令牌的存在性。

修复方案

后端核心修复

  • 统一校验规则:所有来自浏览器的非安全请求(POST/PUT/DELETE等),无论请求格式是表单还是JSON,都必须校验CSRF令牌;
  • 完善令牌校验逻辑:从请求头(如X-CSRF-Token)、请求体或Cookie中获取令牌,与服务器端存储的有效令牌对比验证;
  • 若使用开发框架(如Spring Boot、Express),检查框架的CSRF配置,确保覆盖所有请求类型,而非仅针对表单请求。

前端配合调整

Axios请求时主动携带CSRF令牌:

  1. 从页面的meta标签或Cookie中获取令牌(通常后端会将令牌存入Cookie,或渲染到页面的<meta name="csrf-token" content="xxx">标签中);
  2. 在Axios请求中通过请求头携带令牌,示例代码:
// 从meta标签获取CSRF令牌
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
axios.post("/login", { email: this.email, password: this.password }, {
  headers: {
    'X-CSRF-Token': csrfToken
  }
}).then((res) => {
  window.location.href = "/dashboard";
});

确保所有前端发起的非安全请求都遵循该令牌携带规则。

内容的提问来源于stack exchange,提问作者Hillcow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:36:29