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

Curious Session Behaviour (filename string length)

提问人:Martin 提问时间:9/26/2016 最后编辑:CommunityMartin 更新时间:10/7/2016 访问量:976

问:

我今天注意到,在我的站点会话文件中,有几个文件的文件名明显小于其他文件,例如:

标准会话文件:

  sess_0020cc255681808f78c08b67cd88cbcea13f45ee7629754ed82ccb8b010cf83d2b353b7136847f2876d99f3297a5def5bcc62b433d6d56d7f1b301f82c833aad

(5 + 128 个字符的文件大小)

异常会话文件:

  sess_629aca24e094f17d02b3d105ebe9e5d4

(5 + 32 个字符的文件大小)

这个网站非常繁忙,并且有大量的流量(~22k 访问者 pcm),查看会话文件夹有 ~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的各种内容,但这似乎并不明显适用于这个问题。

entropy_length值是我唯一不确定它的用途和需求的值。

我的问题

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

我意识到以下问题,我可以尝试一下,看看它不会造成伤害,但是如果上述解决方案session.entropy_length的预期用途 ,那么了解这一点会很有用。关于entropy_length的实际用途似乎很少。

  • 增加会话熵长值会改善这一点吗?[否]

我认为目前会话名称冲突可能存在一个小的潜在问题,坦率地说,这么多会话文件如此之长,但少数文件相对较小,这看起来是错误的。

更新

从评论中可以看出一些细节,可能值得我在这里总结一下:

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

评论

0赞 CBroe 9/26/2016
不,熵长与此无关。文件名后面的部分只是会话 ID,并且是影响长度的设置。听起来您的会话配置可能在应用程序的某些部分有所不同(可能通过ini_set或类似方式动态设置),或者您正在运行另一个独立的第二个应用程序,该应用程序使用相同的会话临时目录。sess_session.sid_length
0赞 Martin 9/26/2016
@CBroe这是我最初的想法,有一些地方在不同的设置上运行,但我找不到它,一切都使用相同的设置,但我正在深入挖掘。我担心的是,如果某些情况/设置导致“短路”或某种类似的效果,例如,如果会话在午夜时分开始(我读过一些会话 PRNG 使用微时间,尽管我不认为漩涡会这样做)。Whirlpool
0赞 Aif 10/6/2016
应用是部署在一台还是多台服务器上?PHP是如何运行的?您是否检查过 htaccess 指令?您是否尝试在会话文件的创建时间与服务器上的其他事件(如访问者、可用熵、access_log条目error_log条目)之间建立关联?
2赞 Luca Rainone 10/6/2016
可以使用php-cli,使用不同的php.ini
1赞 Chris Lear 10/6/2016
我尝试使用此处给出的设置生成 >10000 个会话 ID。(我在循环中使用)。我只得到了 128 个字符的哈希值。您可以使用以下 php 代码创建您的情况:session_regenerate_idsession_id(md5("something"));

答:

1赞 Haresh Vidja 10/6/2016 #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,它提供了使用不同类型算法的索引

对于长度为 5 + 128 个字符,您可以使用 或 算法生成会话 ID。 检查哈希方法 http://php.net/manual/en/function.hash.php 的长度sha512whirlpool

所以会话文件名应该是sess_ + session_id

所以在你的php.ini

session.hash_function = whirlpool
session.hash_function = sha512

或者在 PHP 中,您可以动态设置 before 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

评论

0赞 Martin 10/6/2016
感谢您的回答,我的 PHP.ini 已经设置了漩涡,并且据我所知,这有效,问题是某些会话 ID 文件名是 32 个字符,而 99% 是 128 个字符,但所有这些都/应该使用哈希函数。whirlpool
1赞 Daniel W. 10/6/2016
“此选项也可以设置为任何哈希函数的名称”OP 已经有了。session.hash_function=whirlpool
0赞 Haresh Vidja 10/6/2016
@Martin,您能否清除浏览器的 cookie,因为当前会话可能已经生成,因此 php 不会使用新配置再次生成会话 ID。或通过隐私浏览进行检查
0赞 Martin 10/6/2016
@HareshVidja您可能误解了,问题在于我的浏览器,问题在于服务器设置了异常短的 [默认长度] 会话文件名。我想知道是什么原因导致的。
0赞 Haresh Vidja 10/6/2016
@Martin,您可以看到我附加的服务器端文件名屏幕截图。文件名的长度也是 5+ 128 个字符。
5赞 Robbie 10/7/2016 #2

如果您有一个像您描述的那样受欢迎的网站,这很可能是黑客/黑客尝试。黑客将经常访问该站点,并使用捕获的或(在本例中)欺骗性的会话 ID,并且他们将以正常的 32 字节十六进制进行欺骗。

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

好消息是,如果您这样做,它将返回欺骗性的 ID,以便您随后可以session_id()

  • 否认
  • 蜜罐,或
  • 使用有效会话重新创建

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

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

评论

0赞 Chris Lear 10/7/2016
这对我来说听起来很有道理,所以即使结果证明是错误的,也要投赞成票
0赞 Martin 10/7/2016
感谢您的反馈,我担心 - 从评论中 - 原因似乎越来越像一个开箱即用的问题(即 hackingz)。我对我在上面的评论中提到的发现持肯定态度,即“短名称”会话都是空的(或包含最少的、非常平淡的数据,例如页面访问计数或引用页面名称)
0赞 Martin 10/7/2016
今天看看它,也没有简短的会话名称,这让我认为它很可能是黑客尝试类型的事情,机器人/人可能已经转移到其他站点,可能......
0赞 Martin 10/12/2016
这是一个有用的答案,我现在相当确定这些简短的会话是欺骗性的会话,而不是由我自己的 PHP 脚本生成的会话。
0赞 Robbie 10/13/2016
这肯定是我的第一个想法 - 检查热门网站(或热门公司的网站)的访问日志确实会发现很多不需要的活动。我preg_match所有会话 ID - 只是针对它进行编码并拒绝任何您认为不正确的内容。