Насколько уникален идентификатор сеанса php

Насколько уникален идентификатор сеанса php? У меня сложилось впечатление от разных вещей, которые я читал, что я не должен полагаться на двух пользователей, которые никогда не получают такой же сеанс. Разве это не GUID?

Ответ 1

Session_id действительно может быть дублирован, но вероятность очень низкая. Если у вас есть сайт с честным трафиком, это может произойти один раз в вашей жизни на веб-сайте и просто раздражает одного пользователя за один сеанс.

Этого не стоит заботиться, если вы не планируете создавать сайт с очень высоким трафиком или услугу для банковской индустрии.

Ответ 2

Это не очень уникально как отправлено. В конфигурации по умолчанию это результат хэша различных вещей, включая результат gettimeofday (который не является ужасно уникальным), но если вы беспокоитесь, вы должны настроить его для привлечения некоторой энтропии из /dev/urandom, например

ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");

найдите "php_session_create_id" в код для фактического алгоритма, который они используют.

Отредактировано для добавления: Там генератор случайных чисел DFA, засеянный pid, смешивается со временем в usec. Это не твердое условие уникальности особенно с точки зрения безопасности. Используйте конфигурацию энтропии выше.

Обновление:

Начиная с PHP 5.4.0 session.entropy_file по умолчанию использует /dev/urandom или /dev/arandom, если он доступен. В PHP 5.3.0 эта директива остается Пусто по умолчанию. Руководство по PHP

Ответ 3

Вы можете установить альтернативную функцию генерации хеширования, если вы хотите настроить способ генерации идентификатора (по умолчанию это 128-битный номер, сгенерированный через MD5). См. http://www.php.net/manual/en/session.configuration.php#ini.session.hash-function

Для получения дополнительной информации о сессиях PHP попробуйте эту отличную статью http://shiflett.org/articles/the-truth-about-sessions, которая также ссылается на другие статьи о фиксации сеанса и захвате.

Ответ 4

Если вы хотите знать, как PHP генерирует идентификатор сеанса по умолчанию, проверьте исходный код Github. Это, конечно, не случайное и основано на хеше (по умолчанию: md5) этих ингредиентов (см. Строку 310 фрагмента кода):

  • IP-адрес клиента
  • Текущее время
  • Генератор линейных конгруэнций PHP - генератор псевдослучайных чисел (PRNG)
  • случайный источник, специфичный для ОС - если ОС имеет доступный случайный источник (например,/dev/urandom)

Если ОС имеет случайный источник, то сила сгенерированного идентификатора для идентификатора сеанса высока (/dev/urandom и другие случайные источники ОС являются (обычно) криптографически безопасными PRNG). Если, однако, это не удовлетворительно.

Целью генерации идентификации сеанса является:

  • минимизировать вероятность генерации двух идентификаторов сеанса с одинаковым значением
  • сделать сложным вычислительное создание случайных ключей и использовать один из них.

Это достигается с помощью подхода PHP к генерации сеанса.

Вы не можете абсолютно гарантировать уникальность, но вероятности настолько низки, что ударяют один и тот же хэш дважды, что, вообще говоря, не стоит беспокоиться.

Ответ 5

Размер session_id
Предположим, что seeion_id равномерно распределен и имеет размер = 128 бит. Предположим, что каждый человек на планете регистрируется один раз в день с постоянной сессией в течение 1000 лет.

num_sesion_ids  = 1000*365.25 *7*10**9 < 2**36
collission_prob < 1 - (1-1/2**82)**(2**36)  ≈ 1 - e**-(1/2**46) 
                ≈ 1/2**46 

Таким образом, вероятность одного или нескольких столкновений меньше одного на 70 тысяч миллиардов. Следовательно, размер session_id размером 128 бит должен быть достаточно большим. Как упоминалось в других комментариях, session_manager также может проверить, что новый session_id еще не существует.

Случайность
Поэтому большой вопрос, на мой взгляд, заключается в том, генерируется ли session_id: s с хорошей псевдослучайностью. На этом вы никогда не можете быть уверены, но я бы рекомендовал использовать хорошо известное и часто используемое стандартное решение для этой цели (как вы, вероятно, уже сделали).

Даже если избежать столкновений из-за проверки, случайности и размера session_id важно, так что хакеры не могут, как-то делать квалифицированные угадывания и находить активные session_id: s с большой вероятностью.

Ответ 6

Я не нашел подтверждения об этом, но я считаю, что php проверяет, существует ли уже идентификатор сеанса, прежде чем создавать его с этим идентификатором.

Проблема с захватом сессии, о которой люди беспокоятся, - это когда кто-то узнает идентификатор сеанса активного пользователя. Это можно предотвратить разными способами, для получения дополнительной информации об этом вы можете увидеть эту страницу на php.net и этот документ о фиксации сеанса

Ответ 7

Нет, идентификатор сеанса не является идентификатором GUID, но два пользователя не должны получать одинаковый идентификатор сеанса, поскольку они хранятся на стороне сервера.