好奇的会话行为(文件名字符串长度)

22

我今天注意到我的网站会话文件中有一些文件名比其余文件的名称明显要小,例如:

标准会话文件:

  sess_0020cc255681808f78c08b67cd88cbcea13f45ee7629754ed82ccb8b010cf83d2b353b7136847f2876d99f3297a5def5bcc62b433d6d56d7f1b301f82c833aad

(5 + 128字符文件长度)

异常会话文件:

  sess_629aca24e094f17d02b3d105ebe9e5d4

这个网站非常繁忙,有很多的流量(每月约22k访问者)。查看会话文件夹,这些非常短命名的会话文件只占 ~1%(实际上是0.92%)。我在去年(2015年)重新设计这个网站之前曾经阅读过很多关于会话的知识,并且根据那些知识,在我的 php.ini 中设置如下:

session.cookie_httponly=1
session.use_only_cookies=1
session.cookie_secure=1
session.entropy_file=/dev/urandom
session.hash_function=whirlpool
session.session.use_trans_sid=0
session.entropy_length=32

编辑(附加内容):

session.hash_bits_per_character = 4

session.sid_length在使用PHP 5.6.2版本时未定义(不可定义)。

根据我的了解,这应该通常是可以的。我看过很少关于如何确保最小文件长度的话题,虽然我读过关于使用session.entropy_length的各种内容,但这似乎并没有明显地适用于此问题。

我唯一不确定如何使用和需要使用的是熵长度值。

我的问题

  • 什么导致1%的会话只有5+32个字符长?
  • 如何设置所有会话都是相同长度的(5+128个字符)?

我意识到下面的问题我可以尝试并查看结果因为它不会造成任何伤害,但是如果上面提供的解决方案确实是使用session.entropy_length的预期用途,那将是有用的。关于熵长度实际上的应用几乎没有文献记录。

  • 增加会话熵长度值会改善这个问题吗? [NO]

我认为目前可能存在一个小潜在问题,即会话名称冲突,而且似乎有很多会话文件非常长,但还是有明显的少数相对微不足道。

更新

从评论中,也许值得我在此总结一些细节:

  • 问题不在于我的浏览器(!!)
  • 这是使用PHP 5.6.2版本
  • LAMP堆栈在[单个]WHM服务器上运行。
  • 如果运行PHP-cli,则只能由服务器主机运行,尽管我真的怀疑他们是否在运行它。我很了解他们,也是一个不错的客户。
  • 我已经检查并确认网站htaccess文件没有对PHP的任何方面进行更改。
  • 服务器运行的错误日志非常少(过去一周有14个错误,来自9k的访问量,所有错误都是404,来自机器人尝试入侵Wordpress【该站点不是Wordpress】)。
  • PHP通过suPHP运行(版本目前未知),我也正在考虑更新suphp,但我不认为这会直接与此问题相关。
  • 根据Ryan Vincent的建议,我将设置通知,当制作长度小于128字符的会话时(并希望从哪个地址发出)。
  • 会话文件存储文件夹在PHP.ini中定义,因此如果使用外部PHP.ini,则会话可能出现在其他文件夹中,如/temp

2
可能使用php-cli,带有不同的php.ini。 - Luca Rainone
@Aif PHP是通过suphp运行的,它托管在单个服务器上。我不确定您所说的htaccess是什么意思,但我确实密切关注htaccess文件。我还没有尝试过您提到的时间相关性,但错误日志条目非常少(与访问者计数相比),我认为这并没有什么帮助(例如,在过去的7天中,有2组服务器错误日志,都是来自爬行WordPress登录的404...(这不是WP网站) - Martin
@RyanVincent 这是个好主意,我会深入研究。我越来越认为问题很特别,可能与我的设置有关(即解决方法不会很明显),但我似乎无法确定具体是什么。 - Martin
@RyanVincent 我的会话生成只是使用标准方法,在 PHP 5.6.2 中,所以我认为这个问题应该被规避了,尽管这个评论值得注意,因为它涉及到我的会话 ID 长度比较检查 :-) - Martin
1
我尝试使用此处提供的设置生成了10000多个会话ID(我在循环中使用session_regenerate_id)。但是,我只得到了128个字符的哈希值。您可以使用以下PHP代码创建自己的情况:session_id(md5("something")); - Chris Lear
显示剩余13条评论
2个回答

5
如果您的网站像您所描述的那样受欢迎,那么这很可能是黑客/黑客攻击。黑客会经常攻击该网站,并使用已捕获或(在此情况下)伪造的会话ID,它们将以正常的32字节十六进制进行欺骗。
如果您修改cookie "PHPSESSID"以包含任何文本,PHP将捕获它并创建带有该ID和相应sess_[sessionId]文件的会话。从我的测试中可以得知(您可以自己试一试),PHP将接受并使用任何长度的ID,而不考虑ini设置。
好消息是,如果您执行session_id(),它将返回伪造的ID,因此您可以:
  • 拒绝
  • 进行蜜罐攻击,或
  • 重新创建有效的会话
但是这不能阻止会话文件的创建。
或者创建自己的会话处理系统并避免使用session_start();然后您可以在使用之前手动验证session_id格式。

这对我来说听起来非常有道理,所以即使它被证明是错误的,也值得一票支持。 - Chris Lear
感谢您的反馈,我担心从评论中看来,问题似乎越来越像是一个超出常规(即黑客)的问题。我很确定在上面的评论中提到的发现,即“短名称”会话都是空的(或包含最少量、非常平淡的数据,如页面访问计数或引用页面名称)。 - Martin
今天查看了一下,也没有短会话名称,这让我觉得可能是黑客攻击的一种方式,机器人/人已经转向其他网站,可能... - Martin
这是一个有帮助的答案,我现在相当确定这些短会话是伪造的会话,而不是由我的PHP脚本生成的。 - Martin
那是因为他们阅读了StackOverflow的问题并意识到他们需要欺骗128个字符的会话<微笑>。 - Robbie
显示剩余2条评论

1
在php.ini文件中,您可以检查哈希算法。
; Select a hash function for use in generating session ids.
; Possible Values
;   0  (MD5 128 bits)
;   1  (SHA-1 160 bits)
; This option may also be set to the name of any hash function supported by
; the hash extension. A list of available hashes is returned by the hash_algos()
; function.
; http://php.net/session.hash-function
session.hash_function = 0

现在请查看http://php.net/manual/en/function.hash-algos.php,它提供了使用不同类型算法的索引。
为了让Session Id长度达到5 + 128字符,您可以使用sha512whirlpool算法来生成。请检查哈希方法http://php.net/manual/en/function.hash.php的长度。
因此,会话文件名应该是sess_ + session_id
所以在您的php.ini中,您可以设置。
session.hash_function = whirlpool
session.hash_function = sha512

在PHP中,您可以动态设置start_session()函数之前。
ini_set('session.hash_function', 'whirlpool');
ini_set('session.hash_function', 'sha512');

我已经使用ini_set()函数进行了测试,对我来说运行良好,并生成了5+128个字符的会话文件。
我的PHP文件代码:
<?php
ini_set('session.hash_function', 'whirlpool');
session_start();
echo "Session ID: " . session_id();

输出:

Session ID: 0216691c286f2023c6bad823952bcfbdd1cb51980e1981afa28418e887209dcfae3443dc3b59ecaf6201c5d1ea18cd4eb8810de69668a5a366e3c98396ca3786

生成文件的屏幕截图 在此输入图片描述


1
此选项也可以设置为任何哈希函数的名称。OP已经将session.hash_function设置为whirlpool - Daniel W.
@Martin,请你清除浏览器的cookies,因为当前会话可能已经生成,所以PHP不会根据新的配置再次生成会话ID...或者尝试使用私密浏览模式。 - Haresh Vidja
@HareshVidja,你似乎可能误解了,问题不在于我的浏览器,而是服务器设置了异常短的[默认长度]会话文件名。我想找出是什么原因导致了这个问题。 - Martin
在屏幕截图中,第一个文件名在更改哈希函数之前为5+32个字符。更改哈希函数后,它变成了5+128个字符,并带有新的会话ID。 - Haresh Vidja
我已经更新了我的问题,请看底部。 - Martin
显示剩余4条评论

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