Наскільки унікальний ідентифікатор сеансу 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 та інші випадкові джерела ОС є (зазвичай) криптографічно захищеними PRNG ). Якщо ж це не так, то це задовільно.
Метою генерації ідентифікації сеансу є:
Це досягається підходом 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>
якщо ваше ім'я користувача інше або унікальне, ви можете використовувати цей код для сеансу