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