Chr*_*ris 7 php security session laravel laravel-5.3
更新版本的Laravel(正确)使用POST注销会话.这样做的原因是GET/HEAD只应用于被动操作以符合HTTP.
使用csrf令牌进行POST也可以防止恶意用户/站点将您从会话中注销:https://security.stackexchange.com/questions/62769/must-login-and-logout-action-have-csrf-protection
但是,如果会话已超时,并且用户单击注销(触发POST到注销路由),则会收到令牌不匹配错误.这是有道理的 - 令牌不匹配,因为会话已过期.
我可以根据请求变量捕获特定的TokenMismatchException,如果是的话,以他们的快乐方式继续它们(到登出的重定向路径,比如说"home"或"/").像这样:
public function render($request, Exception $e)
{
if ($e instanceof TokenMismatchException && $request->getRequestUri() === '/logout') {
return redirect('/');
}
return parent::render($request, $e);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果我这样做,首先是令牌的重点是什么?以及如何在会话过期时注销用户,同时保持使用带有CSRF令牌的POST注销的预期结果?
对于 Laravel 5.7,请参阅下面的更新
检查身份验证的中间件应该在检查 CSRF 令牌有效性的中间件之前运行。
这样,当会话过期时,您永远不会首先进行 CSRF 检查,因为您已经在身份验证中间件中检查了会话过期并重定向到那里的登录页面。
这不会影响有效会话注销的 CSRF 保护,因为有效会话将通过身份验证中间件。
默认情况下,Laravel 中间件首先运行 CSRF 检查。但是,重新排序它们以另一种方式工作应该很容易。
对于 Laravel 5.7:
在 Laravel 5.7 中,Illuminate\Foundation\Http\Kernel该类有一个新字段:
/**
* The priority-sorted list of middleware.
*
* This forces non-global middleware to always be in the given order.
*
* @var array
*/
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Auth\Middleware\Authenticate::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
];
Run Code Online (Sandbox Code Playgroud)
出现在此字段中的中间件类始终按它们出现的顺序运行。该字段的默认设置如上所示。(Laravel 入门项目对此列表只有一个更改:\App\Http\Middleware\Authenticate::class而不是\Illuminate\Auth\Middleware\Authenticate::class。)
如果您将 CSRF 中间件添加到列表(身份验证中间件下方的任何位置),则应确保它始终按您想要的顺序运行。
| 归档时间: |
|
| 查看次数: |
3055 次 |
| 最近记录: |