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

StackOverflow https://stackoverflow.com/questions/138670

  •  02-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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 Session.Entropy_file по умолчанию /dev /urandom или /dev /arandom, если он доступен.В PHP 5.3.0 эта директива по умолчанию остается пустой. Руководство по PHP

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

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

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

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

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

Это достигается за счет подхода 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 который также ссылается на другие статьи о фиксации и перехвате сеанса.

Размер 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 с большой вероятностью.

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

Проблема перехвата сеанса, которая беспокоит людей, заключается в том, что кто-то узнает идентификатор сеанса активного пользователя.Это можно предотвратить разными способами, дополнительную информацию об этом вы можете посмотреть эта страница на 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>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top