Любопытное поведение сеанса (длина строки имени файла)
Сегодня я заметил, что в моих файлах сеансов для сайта есть несколько файлов с именами файлов, которые значительно меньше остальных, например:
Стандартный файл сеанса:
sess_0020cc255681808f78c08b67cd88cbcea13f45ee7629754ed82ccb8b010cf83d2b353b7136847f2876d99f3297a5def5bcc62b433d6d56d7f1b301f82c833aad
(длина файла длиной 5 + 128 символов)
Исключительный файл сеанса:
sess_629aca24e094f17d02b3d105ebe9e5d4
(длина файла длиной 5 + 32 символа)
Этот сайт очень занят и имеет много трафика (~ 22 тыс. посетителей в формате 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
EDIT (дополнительные):
session.hash_bits_per_character = 4
session.sid_length
undefined (undefinable), поскольку эта сборка использует PHP 5.6.2
Что, насколько я знаю, должно быть в целом прекрасным. Я прочитал очень немного других тем о том, как обеспечить минимальную длину файла, хотя я читал разные вещи об использовании session.entropy_length
, но это не означает, Очевидно, что это относится к этой проблеме.
Значение entropy_length является единственным, что я не уверен в его использовании и необходимости.
Мои вопросы
- Что заставляет 1% сеансов иметь длину всего 5 + 32 символа?
- Как установить его так, чтобы все сеансы имели одинаковую длину (5 + 128 chrs)
Я понимаю следующий вопрос, который я могу попробовать и вижу, поскольку это не наносит вреда, но если указанное решение предназначено для session.entropy_length
, это было бы полезно знать, Кажется мало литературы вокруг того, что entropy_length фактически - практично - для.
Я думаю, что в настоящее время может возникнуть небольшая потенциальная проблема с конфликтом имен сеансов, и он откровенно ошибается, так как так много файлов сеансов настолько удивительно длинны, но заметное меньшинство являются относительно маленькими.
Обновление
Из комментариев есть некоторые детали, которые могут стоить мне обобщить здесь:
- Проблема не в моем браузере (!!)
- Это использование PHP версии 5.6.2
- LAMP stack на сервере [single] WHM.
- Если PHP-cli запущен, он может/будет запускаться только хостами сервера, хотя я действительно сомневаюсь, что они его запускают. Я их хорошо знаю и достойный клиент, поэтому...
- Я проверил и подтвердил, что файлы сайта
htaccess
не вносят никаких изменений в какой-либо аспект PHP
- Сервер работает с очень небольшим количеством журналов ошибок (у меня 14 ошибок с прошлой недели, с посещений 9k, ошибок всех 404s от скребок робота, пытающихся взломать Wordpress [сайт не является wordpress].)
- PHP запускается через suPHP (неизвестная версия в настоящее время), я также рассматриваю обновление suphp, но я сомневаюсь, что это напрямую связано с этой проблемой.
- Из предложения Райана Винценса я настрою уведомление, когда будет сделано более короткое время сеанса 128chr (и, надеюсь, с какого адреса)
- Папка хранения файлов сеанса определена в PHP.ini, поэтому, если используется внешний PHP.ini, я ожидаю, что сеансы появятся в других папках, таких как
/temp
.
Ответы
Ответ 1
Скорее всего, это будут попытки хакеров/взломов, если у вас есть сайт, который так популярен, как вы описываете. Хакеры будут регулярно попадать на сайт и использовать захваченные или (в данном случае) поддельные идентификаторы сеансов, и они будут обманывать нормальный 32-байтовый гекс.
Если вы измените файл cookie "PHPSESSID", чтобы содержать какой-либо текст вообще, PHP выбирает его и создает сеанс с этим идентификатором и соответствующий файл sess_ [sessionId]. Из моего тестирования (и вы можете попробовать его сами) PHP будет использовать любую длину идентификатора и принять его и использовать, независимо от настроек ini.
Хорошей новостью является то, что если вы выполните session_id()
, тогда он вернет поддельный идентификатор, чтобы вы могли
- отказать
- honey-pot, или
- воссоздать с действующим сеансом
НО это не остановит создаваемый файл сеанса.
Альтернативно создайте свою собственную систему обработки сеанса и избегайте session_start()
; то перед использованием вы можете вручную проверить формат session_id.
Ответ 2
В файле php.ini вы можете проверить hash algo
; 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 символов вы можете использовать алгоритм sha512
или whirlpool
для генерации идентификатора сеанса. Проверить длину хэш-метода 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
Снимок экрана сгенерированного файла
![введите описание изображения здесь]()