api 端点未在 Sanctum 上执行 CSRF 令牌验证 - CSRF 令牌不匹配

laravel

1个回答

写回答

1347923899

2025-06-21 06:20

+ 关注

Laravel
Laravel

CSRF 令牌验证是一种常见的安全机制,用于防止跨站请求伪造攻击。然而,当我们在使用 Sanctum 这个流行的 Laravel 包时,有时会遇到一个问题:api 端点未在 Sanctum 上执行 CSRF 令牌验证,导致 CSRF 令牌不匹配的错误。本文将探讨这个问题的背景、原因,并提供解决方案。

在开始之前,让我们先了解一下什么是 CSRF 攻击。CSRF(Cross-Site Request Forgery)跨站请求伪造是一种利用用户已登录的身份执行非法操作的攻击方式。攻击者通过构造一个针对目标网站的请求,并诱使用户在另一个网站上触发该请求,从而实现攻击目的。为了防止这种攻击,我们通常会在表单中添加一个 CSRF 令牌,并验证该令牌的有效性。

Sanctum 是 Laravel 框架中的一款用于构建 API 的身份验证工具。它通过为每个会话生成一个 CSRF 令牌,并将其存储在会话中或通过 API 返回给客户端来保护应用程序免受 CSRF 攻击。然而,有时候我们可能会忽略某些 API 端点的 CSRF 令牌验证,这就会导致令牌不匹配的错误。

问题背景:未在 Sanctum 上执行 CSRF 令牌验证

在 Sanctum 中,默认情况下,所有的 API 端点都应该经过 CSRF 令牌验证。然而,有时我们可能会遗漏某些端点的验证,导致令牌不匹配的错误。这种情况可能发生在以下几种情况下:

1. 忘记在 API 路由中添加 EnsureFrontendRequestsAreStateful 中间件,该中间件用于验证 CSRF 令牌。

2. 在前端请求中未包含有效的 CSRF 令牌。

解决方案:执行 CSRF 令牌验证

要解决 API 端点未执行 CSRF 令牌验证的问题,我们需要执行以下步骤:

1. 确保在 API 路由中添加 EnsureFrontendRequestsAreStateful 中间件。在 Laravelapi 中间件组中,将 EnsureFrontendRequestsAreStateful 添加到中间件栈中,如下所示:

php

use Illuminate\Http\Request;

use Illuminate\Support\FaCADes\Route;

Route::middleware('api')->group(function () {

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {

return $request->user();

});

});

2. 在前端请求中包含有效的 CSRF 令牌。在发送请求时,确保将 CSRF 令牌作为请求头或请求参数之一发送到后端。你可以通过以下代码将 CSRF 令牌添加到请求头中:

Javascript

axIOS.defaults.headers.common['X-CSRF-TOKEN'] = document.querySelector('Meta[name="csrf-token"]').getAttribute('content');

或者,你可以将 CSRF 令牌作为请求参数发送:

Javascript

axIOS.get('/api/user?token=' + document.querySelector('Meta[name="csrf-token"]').getAttribute('content'));

CSRF 令牌验证是一种重要的安全机制,用于防止跨站请求伪造攻击。然而,在使用 Sanctum 这个流行的 Laravel 包时,我们可能会遇到 api 端点未执行 CSRF 令牌验证的问题,导致令牌不匹配的错误。为了解决这个问题,我们需要确保在 API 路由中添加 EnsureFrontendRequestsAreStateful 中间件,并在前端请求中包含有效的 CSRF 令牌。

希望本文对你了解 CSRF 令牌验证以及解决 Sanctum 中 CSRF 令牌不匹配的问题有所帮助。通过正确实施 CSRF 令牌验证,我们可以有效保护我们的应用程序免受 CSRF 攻击的威胁。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号