如何在Laravel 6中防范会话劫持非法登录?
Laravel 6 会话劫持防范方案
针对你遇到的会话劫持问题,可以通过以下关键配置和代码调整来防范:
启用HTTPS并强制Secure Cookie
确保网站使用HTTPS协议,修改session.php或.env文件,将SESSION_SECURE_COOKIE设为true:'secure' => env('SESSION_SECURE_COOKIE', true),这样会话Cookie只会通过HTTPS传输,避免明文被截获。
设置SameSite Cookie属性
在session.php中配置same_site为lax或strict,限制Cookie跨站传输:'same_site' => env('SESSION_SAME_SITE', 'lax'),strict模式完全禁止跨站请求携带Cookie,安全性更高;lax模式允许部分安全的跨站请求(如链接跳转)。开启Session加密
修改session.php中的encrypt配置为true,对会话数据加密存储:'encrypt' => true,即使会话ID被窃取,攻击者也无法解密会话中的用户身份信息。
绑定会话到客户端标识
在用户登录时,将客户端的User-Agent和IP地址存入会话,后续请求验证一致性:- 在
LoginController的authenticated方法中添加:protected function authenticated(Request $request, $user) { session(['client_fingerprint' => md5($request->userAgent() . $request->ip())]); } - 创建验证中间件(如
VerifySessionFingerprint):public function handle($request, Closure $next) { $currentFingerprint = md5($request->userAgent() . $request->ip()); if (session('client_fingerprint') !== $currentFingerprint) { auth()->logout(); $request->session()->invalidate(); return redirect('/login')->withErrors(['session' => '会话验证失败,请重新登录']); } return $next($request); } - 将该中间件注册到路由中,应用到后台/admin路由组。
- 在
缩短会话生命周期
把session.php中的lifetime缩短,减少会话被劫持的有效时间:'lifetime' => 30, // 单位:分钟开启浏览器关闭时会话失效
修改session.php中的expire_on_close为true:'expire_on_close' => true,用户关闭浏览器后,会话Cookie会被清除,即使之前的会话ID被保存也无法复用。
内容的提问来源于stack exchange,提问作者Insko Malaysia
相关产品推荐
相关产品推荐

