如何在mysql表中生成引用会话的唯一会话密钥?

时间:2012-11-17 21:23:14

标签: php mysql

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

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

3 个答案:

答案 0 :(得分:1)

您正在寻找编写自己的会话处理程序以绕过会话cookie上的PHP的Cookie过期问题。这非常简单,如果正确完成,则会进行相当优化。

第1步:生成会话ID

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

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

第2步:存储和检索数据

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

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

使用会话ID为用户Cookie,然后就完成了!

<强>注意事项

  • 从不永远使用userID作为会话ID。 Cookie非常容易操作。您希望cookie值是随机的并且与用户完全分离。它应该毫无意义。
  • 您需要编写清理代码以不时清理会话表。执行此操作的一种好方法是跟踪上次使用会话的时间 - 并相应地删除。

答案 1 :(得分:0)

最好的方法是使用一些哈希函数,实际上PHP也会通过生成会话ID来使用它。 你可以使用这样的东西:

md5(microtime());

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

但是对于唯一性,如果没有存储这样的哈希,你总是需要查看表格(但当然概率非常低)。

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

答案 2 :(得分:0)

您可以使用MySQL的UUID()

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

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