gpt4 book ai didi

php - Laravel - session 数据在注销/登录后仍然存在,即使对于不同的用户也是如此

转载 作者:可可西里 更新时间:2023-10-31 22:50:01 25 4
gpt4 key购买 nike

今天我在检查由 Laravel 5 创建的 storage/framework/sessions 文件夹中的 session 文件时注意到一些令人不安的事情。

事情是这样的:

  1. 我以用户A登录
  2. 我导航到一个在 session 中存储变量 X 的页面
  3. 我注销了,但没有关闭浏览器。
  4. storage/framework/sessions 中的 session 文件仍然存在,并且浏览器 cookies 还活着。
  5. 我以用户 B 身份登录。
  6. storage/framework/sessions 中的旧 session 文件被删除,新的 session 文件在那里。
  7. 我查看了新的 session 文件 - 惊喜!变量 X 在注销后仍然存在,用户 B 可以访问!

这会导致安全问题,因为现在用户 B 可以访问用户 A 的数据。

在通过 Laravel 源代码进行调试时,我发现在注销/登录过程中, session 存储永远不会被清除。在 Illuminate\Auth\Guard::clearUserDataFromStorage() 方法中只有登录凭据被删除,但所有 session 存储属性仍然存在,然后当 $kernel->terminate($ request, $response); 被调用,这反过来导致 Illuminate\Session\Middleware\StartSession::terminate() 调用 Store::save(),它盲目地将 $this->attributes 保存到新 session 中,而忽略了它现在属于另一个用户的事实。

从一方面来看,这似乎是合乎逻辑的——Laravel 对我的数据没有任何假设,也没有假设我是否希望它与身份验证一起过期。但是,最好将它记录在某个地方,并提供一种解决方案,将一些敏感数据附加到身份验证对象并与其一起过期。

这意味着我作为一名程序员有责任在新用户(或同一用户)登录时从当前 session 中彻底清除所有敏感数据。

注销时清除是不可靠的,因为用户可能永远不会单击注销链接而是等待 session “过期”,这对于 Laravel 仍然不会清除 session 。

还有一件事要记住:我不应该过早清除 session - 必须存在 AntiForgery token ,否则登录表单将始终失败。

我找到了一个论坛主题,它也试图解决一些类似的问题:

http://laravel.io/forum/04-27-2014-how-to-expire-session-data

我对此感到困惑:

I had another go at it today and realised what the problem was: Session::flush() does not delete session data that the app creates, such as the shopping cart details

如果这是真的,那么完全摆脱 session 的唯一方法就是使用 PHP 原生 session_unset()session_destroy() 但我不会想走那条路——如果可能的话,我更愿意找到一个更干净的、类似 Laravel 的解决方案。

我如何告诉 Laravel 我希望在身份验证过期或用户注销时将我的旧 session 数据与用户身份验证数据一起删除?

最佳答案

laravel docs它说你可以:

从 session 中删除项目

Session::forget('key');

从 session 中删除所有项目

Session::flush();

您可以导航到 AuthenticatesAndRegistersUsers.php 特征并重写

   /**
* Log the user out of the application.
*
* @return \Illuminate\Http\Response
*/
public function getLogout()
{
$this->auth->logout();

return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
}

   /**
* Log the user out of the application.
*
* @return \Illuminate\Http\Response
*/
public function getLogout()
{
Session::flush();

$this->auth->logout();

return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
}

我不知道这是否真的有效,但试一试 :)

更新

According to this answer here on Stack Overflow ,您可以将 session 设置为在浏览器关闭时或 XXX 分钟后过期。与上述解决方案一起使用,应该可以解决问题吗?

在 config/session.php 中

   /*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/

'lifetime' => 120,

'expire_on_close' => false

关于php - Laravel - session 数据在注销/登录后仍然存在,即使对于不同的用户也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30728741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com