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

45

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

6个回答

40

此取决于session.hash_functionsession.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配置,对吗? - Gustavo
检查php.ini以查看设置是什么。 40个字符是SHA-1哈希函数的结果,每个字符4位。 您可以使用echo strlen(session_id());查看长度,并相应地调整数据库字段。 - sachleen
3
参考资料,如果您使用MD5哈希函数和每个字符4位哈希值,则session_id长度也将为32。这让我今天烦恼了几个小时。 - sevenseacat
2
@GustavoPinent 字符数没有安全方面的影响,只有哈希函数及其内在哈希大小。如何编码该哈希仅涉及传输或存储系统所需的序列化方式。理论上,你可以使用简单的位域将 SHA1 编码为仅 20 字节。不幸的是,cookie 和 URI(常见的传输方式)仅支持字符,并且取决于你可以使用哪个字符集和字符编码,你将会有序列化开销;每个字符双倍使用 4 位(这里隐含了字符长度为 8 位——另外 4 位被浪费)。 - tne
2
从PHP 7.1.0开始,使用session.sid_length代替session.hash_functionsession.hash_bits_per_character。请参考session.sid_length - Marten Koetsier

35

@sachleen的回答不够完整。
关于会话ID长度的更详细信息在这里描述。

摘要:

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)

3
非常好的回答,对我来说就像是一张缺失的拼图。 - Lajos Arpad

3

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

较短的会话ID长度具有更高的碰撞几率,但这也很大程度上取决于ID生成算法。在默认设置下,会话ID的长度应该适用于大多数应用程序。对于更高安全性的实现,您可以考虑查看PHP生成其会话ID的方式,并检查是否具有加密安全性。如果没有,那么您应该使用具有密码学安全随机源的自己的算法。


3
碰撞的机会完全由哈希函数、熵和交通量来决定。使用更安全的哈希函数将生成更大的会话 ID 字符串,因此如果您所说的缩短会话 ID 长度会增加碰撞的机会,那么您是正确的,但是通过使用每个字符的更高位深度来缩短长度将不会产生影响。 - Jason
1
一个128个字符长的会话ID对于通用的Web应用程序而言是否过度设计? - TheFrost

1

在常规的PHP安装中,长度始终为26(例如:psprdaccghmmre1oo2eg0tnpe6)


1

从PHP 7.1开始,如果使用session_create_id()函数,则默认的会话ID长度为32个字符,但用户可以在php.ini中更改此默认值。

请参阅php.ini设置session.sid_length


-1

我不知道我的应用程序将在哪里使用,所以我将其设置为: VARCHAR(127) 并希望它对未知的MySQL用户非常有用。


1
如果你所说的“unknown”是未知的意思,你可以考虑将其设置为文本,以便根据需要进行收缩和扩展。否则,你的表格中会有很多空白区域,即使这样,它也可能无法处理长度为128的值。 - Gustavo
@GustavoPinent VARCHAR比TEXT更快。 - Tihomir Mitkov
@TichomirMitkov 是的,他将不得不在安全灵活的TEXT和快速的VARCHAR之间做出决定。 - Gustavo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接