Насколько уникален идентификатор сеанса php? Из разных вещей, которые я читал, у меня сложилось впечатление, что я не должен полагаться на то, что два пользователя никогда не получат один и тот же идентификатор сеанса. Разве это не GUID?
90
Он не очень уникален в том виде, в котором он был доставлен. В конфигурации по умолчанию это результат хеширования различных вещей, включая результат gettimeofday (который не очень уникален), но если вы беспокоитесь, вы должны настроить его для получения некоторой энтропии из / dev / urandom, например
ini_set("session.entropy_file", "/dev/urandom"); ini_set("session.entropy_length", "512");
ищите "php_session_create_id" в коде для фактического алгоритма, который они используют.
Отредактировано для добавления: есть генератор случайных чисел DFA, засеянный pid, смешанный со временем в usecs. Это не обязательное условие уникальности, особенно с точки зрения безопасности . Используйте конфигурацию энтропии выше.
Обновить:
источник
Если вы хотите узнать, как PHP генерирует идентификатор сеанса по умолчанию, посмотрите исходный код на Github . Это определенно не случайно и основано на хеш-коде (по умолчанию: md5) этих ингредиентов (см. Строку 310 фрагмента кода):
Если ОС имеет доступный случайный источник, тогда сила сгенерированного идентификатора для того, чтобы быть идентификатором сеанса, высока ( / dev / urandom и другие случайные источники ОС (обычно) криптографически безопасные ГПСЧ ). Если, однако, этого не происходит, то это удовлетворительно.
Целью генерации идентификатора сеанса является:
Это достигается подходом 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
Предположим, что 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 тысяч миллиардов. Следовательно, 128-битный размер session_id должен быть достаточно большим. Как упоминалось в других комментариях, 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>
если ваше имя пользователя отличается или уникально, вы можете использовать этот код для сеанса
источник