提问人:Martin 提问时间:9/26/2016 最后编辑:CommunityMartin 更新时间:10/7/2016 访问量:976
好奇会话行为(文件名字符串长度)
Curious Session Behaviour (filename string length)
问:
我今天注意到,在我的站点会话文件中,有几个文件的文件名明显小于其他文件,例如:
标准会话文件:
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.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 的长度sha512
whirlpool
所以会话文件名应该是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
评论
whirlpool
session.hash_function=whirlpool
如果您有一个像您描述的那样受欢迎的网站,这很可能是黑客/黑客尝试。黑客将经常访问该站点,并使用捕获的或(在本例中)欺骗性的会话 ID,并且他们将以正常的 32 字节十六进制进行欺骗。
如果您修改 cookie “PHPSESSID” 以包含任何文本,PHP 会选取它并使用该 ID 创建一个会话,以及相应的 sess_[sessionId] 文件。根据我的测试(你可以自己尝试),PHP 将使用任何长度的 ID 并接受它并使用它,无论 ini 设置如何。
好消息是,如果您这样做,它将返回欺骗性的 ID,以便您随后可以session_id()
- 否认
- 蜜罐,或
- 使用有效会话重新创建
但这不会停止创建会话文件。
或者,创建自己的会话处理系统并避免;然后,您可以在使用前手动验证session_id格式。session_start()
评论
sess_
session.sid_length
Whirlpool
session_regenerate_id
session_id(md5("something"));