Насколько уникален идентификатор сессии php - PullRequest
89 голосов
/ 26 сентября 2008

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

Ответы [ 8 ]

64 голосов
/ 26 сентября 2008

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

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

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

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

Обновление:

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

36 голосов
/ 26 сентября 2008

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

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

12 голосов
/ 04 декабря 2014

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

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

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

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

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

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

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

11 голосов
/ 26 сентября 2008

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

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

5 голосов
/ 14 июня 2012

Размер идентификатора сеанса
Предположим, что 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 тысяч миллиардов. Следовательно, 128-битный размер session_id должен быть достаточно большим. Как упоминалось в других комментариях, session_manager также может проверять, что новый session_id еще не существует.

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

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

3 голосов
/ 26 сентября 2008

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

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

2 голосов
/ 26 сентября 2008

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

0 голосов
/ 23 июля 2018
<?php
session_start();
$_SESSION['username']="username";
?>

<!DOCTYPE html>
<html>
<head>
    <title>Update</title>
</head>
<body>

<table border="2">
    <tr>
        <th>Username</th>
        <th>Email</th>
        <th>Edit</th>
    </tr>
<?php
     $conn=mysqli_connect("localhost","root","","telephasic");
     $q2="select * from register where username = '".$_SESSION['username']."'";
     $run=mysqli_query($conn, $q2);
     while($row=mysqli_fetch_array($run))
     {
         $name=$row[1];
         $email=$row[2];
     ?>

    <tr>
        <td><?php echo $name; ?></td>
        <td><?php echo $email; ?></td>
        <td><a href="edit.php"> Edit </a></td>
    </tr>
 <?php } ?>
 </table> 
 </body>

если ваше имя пользователя отличается или уникально, вы можете использовать этот код для сеанса

...