PHP 会话 ID 字符串的长度是多少?

Posted

技术标签:

【中文标题】PHP 会话 ID 字符串的长度是多少?【英文标题】:What is the length of a PHP session id string? 【发布时间】:2012-08-27 18:45:10 【问题描述】:

我正在 mysql 数据库中创建一个表来保存一些会话数据,包括session_id。存储session_id 字符串的VARCHAR 的长度应该是多少?

【问题讨论】:

【参考方案1】:

通过常规的php安装长度总是26(例如:psprdaccghmmre1oo2eg0tnpe6)

【讨论】:

【参考方案2】:

我不知道我的应用程序将用于何处,然后我将其设置为: VARCHAR(127) 并希望它对未知的 MySQL 用户有帮助。

【讨论】:

如果未知的意思是未知,你可以考虑将它设置为TEXT,它会根据需要收缩和扩展,否则你的表中会有很多空白空间,即便如此,它可能会以 128 长度值失败。 @GustavoPinent VARCHAR 比 TEXT 快。 @TichomirMitkov 是的,他必须在安全灵活的 TEXT 和快速的 VARCHAR 之间做出决定【参考方案3】:

@sachleen 回答不完整。 有关会话 ID 长度的更多详细信息,请参阅here。

总结:

128-bit digest (MD5)  
4 bits/char: 32 char SID    
5 bits/char: 26 char SID    
6 bits/char: 22 char SID

160-bit digest (SHA-1)
4 bits/char: 40 char SID    
5 bits/char: 32 char SID    
6 bits/char: 27 char SID

以及用于检查会话 id 的示例正则表达式:

preg_match('/^[a-zA-Z0-9,-]22,40$/', $sessionId)

【讨论】:

很好的答案,对我来说是一个难题。【参考方案4】:

取决于session.hash_function 和session.hash_bits_per_character。

查看session_id 页面了解更多信息。

你设置的 session.hash_bits_per_character 越高,你的 session_id 将成为每个字符使用更多位。可能的 值为 4、5 或 6。

当使用 sha-1 进行散列时(通过设置 ini_set('session.hash_function', 1) 以下会话字符串 长度由三个 session.hash_bits_per_character 产生 设置:

4 - 40 个字符的字符串

5 - 32 个字符的字符串

6 - 27 个字符的字符串

【讨论】:

所以 40 个字符是一个安全的集合,如果我想节省一些字节,我必须检查 php 配置,对吧? 检查 php.ini 以查看设置。 40 个字符是 SHA-1 哈希函数的结果,每个字符 4 位。您可以通过echo strlen(session_id()); 查看长度并相应地制作您的数据库字段。 作为参考,如果您使用 MD5 哈希函数和每个字符 4 个哈希位,则 session_id 长度也将为 32。这让我今天扯了几个小时的头发。 @GustavoPinent 字符数没有安全隐患,只有具有其固有哈希大小的哈希函数。您如何对该哈希进行编码只是传输或存储系统需要什么序列化的问题。从理论上讲,您可以使用简单的位域将 SHA1 编码为 20 个字节。不幸的是,cookie 和 URI(通用传输)仅支持字符,并且根据您可以使用的字符集和字符编码,您将有序列化开销; double with 4 bits/char(这里暗示字符是 8 位长——其他 4 位被浪费了)。 从 PHP 7.1.0 开始,有 session.sid_length 而不是 session.hash_functionsession.hash_bits_per_character【参考方案5】:

这取决于这些配置设置: session.hash_functionsession.hash_bits_per_character

会话 ID 长度越短,发生冲突的可能性就越大,但这也很大程度上取决于 ID 生成算法。给定默认设置,会话 ID 的长度应该适合大多数应用程序。对于更高安全性的实现,您可以考虑查看 PHP 如何生成其会话 ID 并检查它是否在密码学上是安全的。如果不是,那么您应该使用加密安全的随机源推出自己的算法。

【讨论】:

碰撞几率完全取决于散列函数、使用的熵和流量。使用更安全的散列函数将产生更大的会话 ID 字符串,因此,如果这就是您所说的较短会话 ID 长度具有更高碰撞机会的意思,那么您是正确的,但通过使用每个字符更高的位深度来缩短该长度不会有任何影响。 128 个字符长的会话 ID 对通用 Web 应用程序来说是否过大?

以上是关于PHP 会话 ID 字符串的长度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何在开始会话之前计算会话ID的长度

PHP会话不承认用户ID

php哪个函数能取得字符串长度

php中的session_id详解

会话的默认生命周期是多少?

我的会话 ID 中的下划线