1

我使用 $_SESSION 来存储用户 ID,但我想更改为使用与 SQL 配对的常规 cookie(带有 KEY),这样我可以在用户关闭浏览器时保持用户身份验证。

如何为我的 SESSIONs 表中的每一行创建一个唯一键?

4

3 回答 3

1

您实际上是在寻找编写自己的会话处理程序来绕过 PHP 在会话 cookie 上的 cookie 过期问题。这很简单,如果做得好,也很优化。

第 1 步:生成会话 ID

会话 ID 是唯一的。但是,如果您正在计划永久会话,则必须牢记几件事:您希望会话在每个浏览器中都进行,而不管连接问题如何。因此,您可以通过将会话 ID 映射到导航器的用户代理(不会更改)来欺骗系统。

这允许您减少会话 ID 生成器为两个不同的访问者生成相同 ID 的机会。其余的取决于随机数生成器和散列算法,不过 -md5(microtime().$_SERVER['REMOTE_ADDR'])通常是值得信赖的朋友。

步骤 2:存储和检索数据

存储数据也很简单。您的目标是创建一个至少包含两列的 MySQL 表:会话键(设置为PRIMARY)和数据(最简单形式的序列化数组,存储为TEXT)。

创建会话时,只需插入新行并注意错误。如果出现错误,则该密钥已被使用,因此您需要重新生成另一个。如果该行已成功插入 - 一切都好,您现在有一个用户会话行!从那里你需要做的就是在你认为合适的时候读/写这一行。

使用会话 ID 对用户进行 cookie 处理,您就完成了!

注意事项

  • 永远不要使用用户 ID 作为会话 ID。Cookie 可以很容易地被操纵。您希望 cookie 值是随机的并且与用户完全分离。应该是没有意义的。
  • 您需要不时编写清理代码来清理会话表。做到这一点的一个好方法是跟踪上次使用会话的时间 - 并相应地删除。
于 2012-11-17T21:36:58.480 回答
-1

您可以使用 MySQL 的UUID().

如果你想保持会话活跃,你也可以使用 PHP 的session_set_cookie_params().

不过,SQL 解决方案有一个优势:您可以轻松扩展到更多网络服务器。另一方面,您不能使用 PHP 的$_SESSION数组,您必须自己编写会话处理。

于 2012-11-17T21:47:03.813 回答
-1

最好的方法是使用一些散列函数,实际上 PHP 本身也通过生成会话 id 来使用该函数。你可以使用这样的东西:

md5(microtime());

您可以将更多值组合在一起,例如随机数、用户代理、服务器名称或使用更强大的算法,如 SHA2。

但是为了唯一性,如果没有存储这样的散列,您将始终需要查看表(但概率当然非常低)。

但我只会选择能session_id()完成所有工作的标准。

于 2012-11-17T21:39:18.200 回答