Подтвердить что ты не робот

Любопытное поведение сеанса (длина строки имени файла)

Сегодня я заметил, что в моих файлах сеансов для сайта есть несколько файлов с именами файлов, которые значительно меньше остальных, например:

Стандартный файл сеанса:

  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.
4b9b3361

Ответ 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

Снимок экрана сгенерированного файла введите описание изображения здесь