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令牌:
- 从页面的meta标签或Cookie中获取令牌(通常后端会将令牌存入Cookie,或渲染到页面的
<meta name="csrf-token" content="xxx">标签中); - 在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
相关产品推荐
相关产品推荐

