【问题标题】:PHP Session ID uniqueness (for use in a cookie)PHP 会话 ID 唯一性(用于 cookie)
【发布时间】:2011-07-29 08:58:03
【问题描述】:

我正在编写一个用户系统,用户将使用 Twitter 的 API 登录,然后我会将信息与我让用户输入的一些额外信息一起存储在数据库中。我希望用户能够登录后返回,无需再次登录。我决定获取有关用户的所有相关信息,将其保存到数据库中,然后将会话 ID 和用户 ID 保存到另一个表中。最后,我会在用户的计算机上设置一个包含相同会话 ID 的 cookie,以便他们在整个浏览过程中保持登录状态。然后,如果他们关闭浏览器并稍后重新访问该站点,我会读取该 cookie,并进行比较使用会话表,获取用户 ID,并重建会话(使用新的会话 ID 更新会话表)。

我的问题是,会话 ID 有多随机?用户是否有可能获得与一周内未访问该站点的用户(因此 cookie 仍处于活动状态)分配给他们的相同会话 ID?如果发生这种情况,那么服务器可能会将新用户误认为是旧用户。我真的很想避免使用 IP 地址,因为人们可能会从移动浏览器访问该网站,而 IP 可能随时更改。

对此有什么想法吗?我只是想确保用户 A 和用户 B 在任何时间间隔内都不会获得相同的会话 ID。

【问题讨论】:

    标签: php mysql session


    【解决方案1】:

    虽然同时拥有两个具有相同标识符的活动会话的可能性非常低(取决于 hash function),但您可以向该会话 ID 添加一个额外的(伪)唯一值以获得一个值两个特点。

    您可以使用满足后者的uniqid

    uniqid(session_id(), true)
    

    uniqid 的值基于 microtime 以及来自 lcg_value 的附加伪随机数和更多熵的附加源,它们共同保证了唯一值。

    【讨论】:

      【解决方案2】:

      将当前时间(以微秒为单位)附加到唯一 ID...

      session_id() + microtime();
      

      因此不仅 session_ids 必须相同,而且必须在同一微秒内发生……这使得几乎不可能消失的不可能。保证它 100% 的唯一方法是对照所有现有会话 id 检查这个随机值,如果它已经存在,则重新滚动它。

      【讨论】:

      • 这就是我最终要做的。我已经需要时间来编写脚本,所以我只是将 time() 更改为 microtime(true)。对于我只需要时间戳的操作,我只需要对它进行 floor(),对于会话,我执行 md5(session_id() . $time)。 MD5 只是强制它始终具有 32 个字符的恒定长度。
      • 首先,如果您对某个答案感到满意,请标记一个已接受的答案。其次,关于散列的警告......就像鳄鱼的回答一样, session_id() 函数本身就是一个 MD5 散列,具有 128 位数据。添加 $time 并再次对其进行散列不会增加随机性,因为仍然只有 128 位可用。两个不同的值可以有相同的哈希值。
      • 我明白这一点,但在我看来,MD5 冲突的可能性低于在两周内使用两次相同的 PHP 会话 ID。我的 PHPSESSID 是 26 个字符长,但我不确定每次都那么长,有时可能会更长或更短。会话 id 和 microtime 的 MD5 仅用于将其强制为 32 个字符长度。我可以简单地 md5 会话 ID,但向其中添加微时间只会增加潜在攻击者必须弄清楚的另一件事,即会话 ID 和散列它的微秒。
      【解决方案3】:

      PHP 会话 ID 是一个 MD5 哈希,长度为 128 位。这就像 340,000,000,000,000,000,000,000,000,000,000,000,000 种不同的可能性。两个人得到同一个的几率很小。

      如果您想保证唯一性,请根据序号在他们的 cookie 中添加一些内容。

      【讨论】:

      • 远程,但不为零。要强制产生百万分之一的哈希冲突机会,您只需生成大约 10^16 个哈希。不是微不足道的,但也不是不可能的。
      • 这就是地球上每个人都注册了一亿个帐户。是的,最好确保它是 256 位;-)
      • 以启用 IP 的速度发展,一旦昆虫王国获得连接,我们就会开始遇到这种情况。一只巨大的蚂蚁敲打着巨大的键盘,不仅会写出莎士比亚,还会破解每个人的网上银行会话以启动。
      • 加密哈希函数并不意味着唯一性。给哈希值加上一个(伪)唯一值,得到一个兼有两者特征的值。
      • 不幸的是,MD5 是collisions-prone,如链接所示,这比访问 2^64 范围内的值要容易得多(有可能,请参阅链接)。跨度>
      猜你喜欢
      • 2010-09-13
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 2011-01-15
      相关资源
      最近更新 更多