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

时间:2016-09-26 13:33:26

标签: php session

我今天注意到,在我的网站会话文件中,有一些文件名显着小于其余文件,例如:

标准会话文件:

  sess_0020cc255681808f78c08b67cd88cbcea13f45ee7629754ed82ccb8b010cf83d2b353b7136847f2876d99f3297a5def5bcc62b433d6d56d7f1b301f82c833aad
     

(5 + 128个字符文件长度)

特殊会话文件:

  sess_629aca24e094f17d02b3d105ebe9e5d4
     

(5 + 32字符文件长度)

这个站点非常繁忙并且有很多流量(约22k访问者pcm),查看会话文件夹有~1%(实际上是0.92%)这些非常短的命名会话文件。

在去年(2015年)实施此网站重新设计之前,我在过去的read up会议中有很多,并且从那以后,我现在已经在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的各种内容,但这似乎并不适用于此问题。

entropy_length值是我唯一不确定其使用和需要的值。

我的问题

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

我意识到以下问题我可以尝试并查看它不会造成任何伤害,但如果上述解决方案 {{1 ,知道这会很有用。关于什么是entropy_length实际上是非常实用的文献似乎很少。

我认为session name collision目前可能存在一个小问题,而且看起来如此之多,以至于如此多的会话文件如此奇妙地长,但是一个值得注意的少数群体相对较小。

更新

从评论中可以看出一些细节值得我总结一下:

  • 我的浏览器(!!)
  • 的问题是
  • 这是使用PHP版本5.6.2
  • [单个] WHM服务器上的LAMP堆栈。
  • 如果运行PHP-cli,它可能/只会由服务器主机运行,尽管我真的怀疑它们正在运行它。我很了解他们,所以我是一个体面的客户....
  • 我已检查并确认网站session.entropy_length文件未对PHP的任何方面进行任何更改
  • 服务器运行时只有很少的错误日志(我上周有14个错误,9k次访问错误,所有404个错误来自机器人刮板试图入侵Wordpress [该网站不是wordpress]。)
  • PHP是通过suPHP运行的(目前版本未知),我也在考虑更新suphp,但我怀疑这与这个问题直接相关。
  • 来自Ryan Vincents的建议我会在短于128级的会话时设置通知(并希望从哪个地址开始)
  • 会话文件存储文件夹在PHP.ini中定义,因此如果使用外部PHP.ini,那么我希望会话出现在htaccess等其他文件夹中。

2 个答案:

答案 0 :(得分:5)

如果您的网站与您描述的一样受欢迎,则很可能是黑客/黑客攻击。黑客将定期访问网站并使用捕获的(在这种情况下)欺骗会话ID,他们将欺骗正常的32字节十六进制。

如果修改cookie“PHPSESSID”以包含任何文本,PHP会选择它并创建具有该ID的会话以及相应的sess_ [sessionId]文件。从我的测试(你可以自己尝试)PHP将使用任何长度的ID并接受并使用它,无论ini设置。

好消息是,如果您执行session_id(),那么它将返回欺骗性ID,以便您可以

  • 拒绝
  • 蜜罐,或
  • 使用有效会话重新创建

但这不会停止正在创建的会话文件。

或者创建自己的会话处理系统并避免session_start();然后您可以在使用之前手动验证session_id格式。

答案 1 :(得分:0)

在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,它提供了使用不同类型算法的索引

对于5 + 128字符长,您可以使用sha512whirlpool算法生成会话ID。检查哈希方法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

生成的文件的屏幕截图 enter image description here