Коли і чому я повинен використовувати session_regenerate_id ()?


95

Чому і коли слід використовувати session_regenerate_id()функцію в php? Чи повинен я завжди користуватися ним після використання session_start()? Я читав, що я повинен використовувати його для запобігання фіксації сеансу, чи це єдина причина?


тому що після початку сеансу створюється is, а на іншій сторінці, коли ви починаєте сесію, є змінні: -
HaRsH

@HaRsH Oo? Session_regenerate_id видаляє старий ідентифікатор сеансу та створює новий, щоб уникнути захоплення сеансу за допомогою XSS, наприклад. Це не впливає на видимість змінних SESSION в інших документах.
Xatenev

так, я знаю, що я не впливаю на іншу змінну, але якщо ви не почнете сеанс на цій сторінці, змінна не буде присутня на цій сторінці в основному php
HaRsH,

1
Але мова йде про session_regenerate_id, а не про session_start ...
Xatenev

1
Я пропоную прочитати RFC там, де це було запропоновано: wiki.php.net/rfc/precise_session_management
jankal

Відповіді:


96

Що таке session_regenerate_id()?

Як сказано в назві функції, це функція, яка замінить поточний ідентифікатор сесії новим та збереже інформацію про поточний сеанс.

Що це робить?

Це в основному допомагає запобігти атакам фіксації сеансу. Атаки фіксації сеансу - це випадки, коли зловмисний користувач намагається використати вразливість у системі для фіксації (встановлення) ідентифікатора сеансу (SID) іншого користувача. Роблячи це, вони отримають повний доступ як початковий користувач і зможуть виконувати завдання, які в іншому випадку потребують автентифікації.

Щоб запобігти таким атакам, призначте користувачеві новий ідентифікатор сеансу, використовуючи його session_regenerate_id()під час успішного входу (або для кожного X запиту). Тепер лише він має ідентифікатор сеансу, а ваш старий (фіксований) ідентифікатор сеансу вже не дійсний.

Коли слід використовувати session_regenerate_id()?

Як зазначає symbecean у коментарях нижче, ідентифікатор сеансу повинен бути змінений при будь-якому переході в стані автентифікації та лише при переході аутентифікації.

Подальше читання:


2
І що додається, якщо хакер здійснить 20-й дзвінок? Ідентифікатор сесії змінено, і він єдиний, хто володіє сесією;))
fred727

@ fred727 Якщо хакеру пощастить здійснити 20-й дзвінок, тоді користувач матиме недійсний ідентифікатор і більше не буде автентифікований. Без регенерації і хакер, і користувач будуть автентифіковані.
Bradmage

також може бути корисним виклик session_regenerate_id під час зберігання конфіденційної інформації в сеансах (так не тільки під час аутентифікації)
Адам

Чи можна зафіксувати сеанс, якщо інформація про сесію відсутня у файлі cookie? Я зберігаю інформацію про сеанс у файлах на своєму сервері, чи потрібно відновлювати ідентифікатор?
Гонсало

"для фіксації (встановлення) ідентифікатора сеансу (SID) іншого користувача" .... це слід замінити на "для фіксації (встановлення) ідентифікатора сеансу (SID) на комп'ютері іншого користувача, а потім використовувати його після його автентифікації "
Бухгалтер م

25

Ви повинні використовувати session_regenerate_id(), щоб зупинити викрадення сесії та фіксацію сеансу .

З цієї відповіді Security.SE :

Викрадення сесії стосується викрадення сеансового файлу cookie. Цього найлегше досягти, якщо спільно використовувати локальну мережу з іншими комп’ютерами. Наприклад, у Starbucks. Приклад ... користувач із сеансом Y переглядає веб-сайт Джеймса у Starbucks. Я слухаю їх мережевий трафік, потягуючи латте. Я беру користувача з файлами cookie сеансу Y для веб-сайту Джеймса і налаштовую свій браузер на їх використання. Тепер, коли я переходжу на сайт Джеймса, на сайт Джеймса.

З цієї веб-сторінки :

Фіксація сеансу - це техніка атаки, яка примушує ідентифікатор сеансу користувача до явного значення. Залежно від функціональності цільового веб-сайту, можна використати ряд методів для "виправлення" значення ідентифікатора сеансу. Ці методи варіюються від міжсайтових сценаріїв до створення веб-сайту попередньо зробленими HTTP-запитами. Після виправлення ідентифікатора сеансу користувача зловмисник буде чекати, поки цей користувач увійде в систему. Щойно користувач зробить це, зловмисник використовує заздалегідь визначене значення ідентифікатора сеансу, щоб прийняти ту саму ідентифікацію в мережі.

Коли використовувати

Коли користувач редагує / оновлює деякі важливі вхідні дані (зміна паролів, облікових даних, забутих паролів тощо), які можуть порушити безпеку сайту або політику конфіденційності.

Дивитися також:

Посібник з безпеки PHP: сеанси

Фіксація сеансу (приємне читання)


22

Думаю, питання сесійного отруєння висвітлено досить добре.

Відповісти на запитання "Коли мені це використовувати?" Важливо відступити назад і розглянути, що робить ваша програма під час сеансу. Або, інакше кажучи, це ключове питання безпеки, на яке потрібно відповісти

Якби хтось влаштував цю сесію, що б він отримав?

Якщо все, що ви робите, - це відстежувати анонімні дані в іншому випадку (користувач заходить на сайт, а ви використовуєте їх для відстеження їх відвідувань), тоді мало причин для регенерації сеансу. Викрадач не здобув би нічого цінного, захопивши той сеанс.

Однак багато сайтів пропонують логіни. Логін змінює багато речей. Я можу отримати доступ до свого профілю. Я можу змінити налаштування. Отже, викрадач може захотіти отримати доступ до мого облікового запису, особливо якщо звичайні користувачі та користувачі адміністратора використовують сеанси для управління входом. Тому, коли люди заходять на мій сайт і входять в систему, я відновлюю сеанс. Це додає додатковий рівень безпеки, через який мій нещодавно увійшов користувач рідше захоплюється.

Кожного разу, коли ми додаємо важливі дані до сеансу, вам слід подумати про регенерацію ідентифікатора сеансу. Якщо вам потрібно загартувати вашу програму проти фіксації, випадкова регенерація може бути корисною, але я НІКОЛИ не регенерую за кожним запитом. За замовчуванням PHP зберігає сесії у файлах на локальному диску. Ви додаєте багато дискового вводу-виводу, щоб пом'якшити відносно невеликий вектор атаки. Якщо вам дійсно потрібна більша безпека, я б пропонував регулярно переходити до повного HTTPS, а не до регенерації (HTTPS робить фіксацію дуже важкою).


2
HTTPS нічого не змінює при фіксації.
келунік

4
Але це ускладнює нюхаючі атаки, які можуть бути використані для отримання ідентифікатора сесії.
demonkoryu

моя програма php виходить із системи за лічені секунди, я використовую регенерацію, чи існує обмеження кількості файлів сеансів, які можна створити, чи є обмеження на регенеровані ідентифікатори, які можуть спричинити вихід?
sqlchild

Як правило, ні. Можливо, ви захочете опублікувати окреме запитання про це
Machavity

16

Чому я повинен використовувати session_regenerate_id?

Ви повинні використовувати його, щоб запобігти фіксації сеансу .

Коли слід використовувати session_regenerate_id?

Щоразу, коли змінюється стан автентифікації, це головним чином при вході та виході.

Приклад

Боб сидить за загальнодоступним комп’ютером і, переглядаючи stackoverflow.com, відкриває там новий сеанс. Ідентифікатор сеансу зберігається у файлі cookie (із httpOnlyпозначкою для запобігання доступу через javascript). Уявімо, що у Stack Overflow завжди було ввімкнено HTTPS, а також встановлено secureпрапор для файлу cookie.

Як ми можемо вкрасти сесію зараз?

Боб записує ідентифікатор сеансу. Він залишає комп’ютер, не закриваючи браузер. Тепер Аліса підходить до цього комп’ютера і бачить, що переповнення стека вже завантажено. Зараз вона входить в систему.

Зараз ми на етапі, де ви повинні використовувати session_regenerate_id. Якщо ви не створите тут новий ідентифікатор сеансу під час входу, Боб може використати попередній сеанс, який він записав, для доступу до сеансу Аліси і буде ввійти як Аліса зараз.


Але до того моменту, коли session_regenerate_id()виданий, Аліса зможе отримати доступ до облікового запису bobs? це так?
Акам

2
@akam - Пізно, але варто відповісти ... 1. Боб не виходить, Аліса може використовувати свій логін - 2. Боб виходить, Аліса не входить, Аліса може використовувати ідентифікатор сеансу, але немає активного входу для доступу до своїх даних - 3. Боб виходить, Аліса входить, Боб використовує ідентифікатор сеансу, є активний логін, Боб отримує доступ до даних Аліси. Але якщо бути конкретним: залежність від безпеки сценаріїв ідентифікатора сеансу не обов’язково означає, що ви можете отримати доступ до даних користувача, який вийшов з системи, але загалом це можливо і високий ризик.
codekandis

15

Ви можете використовувати його для кращої безпеки.

Таким чином ви створюєте ідентифікатори сеансу для одноразового використання.

Припустимо, ваш ідентифікатор сеансу користувача = 3

Якийсь хакер зламав вашого клієнта та отримав їх session_id. Тож хакер може використовувати цей файл cookie для використання їх сеансу.

Якщо у вас є код типу

session_start();
session_regenerate_id();

ви можете змінювати їх сеанс кожного разу, коли вони використовують ваш веб-сайт.

Тепер хакер отримує sessionid = 3

але ви змінили сеанс після того, як він використав цей ваш

користувач має sessionid = 4 // auth

хакер має сесію = 3 // нуль

Але є невеликий сенс, що можна сказати, що ви використовуєте метод регенерації, а ваш клієнт просто увійшов на веб-сайт і закрив браузер або неактивний. Ваш клієнт має sessionid = 4, і якщо хакер отримає файли cookie в цій частині, він буде мати такий самий sessionid.

Як пояснювалося вище, таким чином ви можете захистити свого клієнта від обнюхування даних в один бік, але все одно це не вирішить цю проблему назавжди.

Але це буде набагато безпечніше, якщо ви використовуєте SSL enc.

Вибачте за погану англійську.


12

Простий варіант використання:

// User visits a webshop
$shopcart = new Cart();

Запускається сеанс і робиться запис у базі даних. Візитна картка користувача ідентифікується за ідентифікатором сеансу.

// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);

За кожним доданим товаром робиться запис у моїй таблиці кошика. Також визначається ідентифікатором сеансу.

// User saves cart in order to use it later
$shopcart->save();

Користувач вирішив зберегти свій кошик. Зараз він прикріплюється до його ідентифікатора користувача.

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();

Ідентифікатор сесії регенерується, і тепер користувач може почати спочатку створення іншої візитки.


4

session_regenerate_id (): Не вдається відновити ідентифікатор сеансу - сеанс неактивний

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.