2008-09-26 2 views
86

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

ответ

32

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

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

2

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

+0

Могу ли я спросить, почему я проголосовал? – gizmo 2008-09-26 11:08:01

+2

Возможно, потому что хранилище на стороне сервера никоим образом не гарантирует уникальность. Уникальность - это одно - если есть столкновение, оно будет сталкиваться независимо от того, где хранится сессия. – 2008-09-26 11:29:50

+0

Не я, я ценю ваш ответ (как и другие). - Jalov – Jalov 2008-09-26 11:32:45

3

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

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

+2

... но если вы всего лишь один сервер php в банке нескольких, нет никакой гарантии, что у сервера достаточно знаний, чтобы знать, был ли еще использован sesssionID. – djsadinoff 2008-09-26 11:03:26

+0

Да, это очень хороший момент. – 2008-09-26 11:06:02

11

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

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

59

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

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

поиск «php_session_create_id» в the code для фактического алгоритма они используют.

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

Update:

По PHP 5.4.0 session.entropy_file по умолчанию в/DEV/urandom или /DEV/arandom, если он доступен. В PHP 5.3.0 эта директива остается пустым по умолчанию. PHP Manual

5

Размер session_id
Предположим, что seesion_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 с большой вероятностью.

10

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

  1. IP-адрес клиента
  2. Текущее время
  3. РНР линейного генератор конгруэнтность - псевдо генератор случайных чисел (ПСЧ)
  4. ОС конкретной случайный источник - если операционная система имеет случайный источник доступный (например,/DEV/urandom)

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

Цель с генерацией идентификации сеанса заключается в следующем:

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

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

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

Смежные вопросы