我正在使用Laravel 5.4,并且我的路由在api中间件中。我发现需要将我的路由转移到web中间件,但是由于我正在创建RESTful API,因此需要它们保留在api中间件中。你有什么建议如何在api中间件中使用csrf?
CSRF保护可以防止攻击先前经过身份验证的用户(通常使用会话设置状态)https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)。
Restful API没有状态https://en.wikipedia.org/wiki/Representational_state_transfer,因此没有会话可供攻击。因此,在restful API中,CSRF保护是对每个请求进行用户身份验证。如果您只对第一个请求进行身份验证,并在后续请求中使用会话,则不是在创建restful API,而应使用Web中间件。
编辑: 如果没有任何状态,您将如何将CSRF令牌传递给客户端?
您可以在任何路由组中使用任何中间件,包括自定义中间件。Laravel为我们提供了非常方便的方式。只需打开App\Http
命名空间中的Kernel.php
文件。找到可能位于第28行附近的protected $middlewareGroups
代码,并像下面那样更改代码以允许在API路由中启用Csrf
保护:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
\App\Http\Middleware\VerifyCsrfToken::class,
],
];
请确保您的 Web 中间件组包含以下行,并使用相同版本的干净 Laravel 安装验证内容。
\App\Http\Middleware\VerifyCsrfToken::class,
并验证路由是否使用了Web中间件。 运行 php artisan route:list
命令,并注意中间件列。
\App\Http\Middleware\VerifyCsrfToken::class
添加到您的API中间件组中。 - Sandeesh
routes/web.php
),你可能只是从那里将其删除了。 - apokryfos