Как уникальный идентификатор сессии в PHP


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

8 87

8 ответов:

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

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

это не очень уникальный, как поставляется. В конфигурации по умолчанию это результат хэша различных вещей, включая результат 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 сессии.entropy_file по умолчанию /dev / urandom или в /dev/случайное, если это доступно. В PHP 5.3.0 эта директива остается по умолчанию пусто. руководство PHP

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

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

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

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

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

цель с генерацией идентификации сеанса к:

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

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

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

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

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

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

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

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

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

<?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>

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