当你有一个非常复杂的数据库时,如何有效地管理会话


How to manage session effectively when you have a very complicated database

我有一个用户门户帐户。我用两个不同的用户名在两个不同的标签中登录。

当我在同一用户帐户的两个选项卡中执行硬刷新(ctl+f5)时,它在两个选项卡中都打开。可以是这两个用户名中的任意一个。我能做些什么来解决这个问题?

会话的机制使用cookie。cookie在选项卡之间共享

如果你想让两个不同的用户在一个浏览器会话中登录,你可以在cookie中禁用存储会话id: PHP session without cookies

也可以使用浏览器的特性。

  • PHP的会话。基本用法。
  • PHP的会话。传递会话ID。

你不能用两个不同的用户在同一个浏览器上登录同一个网站。你最好使用两个不同的浏览器

一个选项是避免会话cookie。将PHPSESSID变量添加到查询字符串中,或者将其放在路径中并使用URL重写或PATH_INFO将/x/y.php/925235a...等转换为/x/y.php?PHPSESSID=925235a...。你可以让PHP为你做第一个。

注意,为了使其工作,您需要输入类似

的内容
ini_set('session.use_cookies', false);

或类似的,在调用session_start()之前。然后PHP不会发送会话cookie;在大多数情况下,它会透明地重写页面中的url以包含会话ID,因此您可以免费获得第一个选项。

这种方法的最大缺点是它使您的用户容易受到称为"会话固定"的攻击。如果我给你一个已经有会话ID的URL,你点击它并登录到这个网站,你已经为我登录了我的会话,我现在可以以你的身份访问这个网站。解决这个问题的一种方法是,当有人登录时切换到一个新的会话……但如果你的应用程序是一个购物车,让人们登录购买东西可能会很烦人。

第二大错误:如果用户访问的链接没有会话ID, PHP将无法识别他们。(用户可以使用"返回"按钮回到他们拥有会话ID的位置,但这在可用性方面很糟糕。)您必须确保会话ID出现在每个链接或URL中。幸运的是,PHP会为你重写其中的大部分,但是你用JS生成的任何链接,你必须自己做。