Чому і коли слід використовувати session_regenerate_id()
функцію в php? Чи повинен я завжди користуватися ним після використання session_start()
? Я читав, що я повинен використовувати його для запобігання фіксації сеансу, чи це єдина причина?
Чому і коли слід використовувати session_regenerate_id()
функцію в php? Чи повинен я завжди користуватися ним після використання session_start()
? Я читав, що я повинен використовувати його для запобігання фіксації сеансу, чи це єдина причина?
Відповіді:
session_regenerate_id()
?Як сказано в назві функції, це функція, яка замінить поточний ідентифікатор сесії новим та збереже інформацію про поточний сеанс.
Це в основному допомагає запобігти атакам фіксації сеансу. Атаки фіксації сеансу - це випадки, коли зловмисний користувач намагається використати вразливість у системі для фіксації (встановлення) ідентифікатора сеансу (SID) іншого користувача. Роблячи це, вони отримають повний доступ як початковий користувач і зможуть виконувати завдання, які в іншому випадку потребують автентифікації.
Щоб запобігти таким атакам, призначте користувачеві новий ідентифікатор сеансу, використовуючи його session_regenerate_id()
під час успішного входу (або для кожного X запиту). Тепер лише він має ідентифікатор сеансу, а ваш старий (фіксований) ідентифікатор сеансу вже не дійсний.
session_regenerate_id()
?Як зазначає symbecean у коментарях нижче, ідентифікатор сеансу повинен бути змінений при будь-якому переході в стані автентифікації та лише при переході аутентифікації.
Подальше читання:
Ви повинні використовувати session_regenerate_id()
, щоб зупинити викрадення сесії та фіксацію сеансу .
З цієї відповіді Security.SE :
Викрадення сесії стосується викрадення сеансового файлу cookie. Цього найлегше досягти, якщо спільно використовувати локальну мережу з іншими комп’ютерами. Наприклад, у Starbucks. Приклад ... користувач із сеансом Y переглядає веб-сайт Джеймса у Starbucks. Я слухаю їх мережевий трафік, потягуючи латте. Я беру користувача з файлами cookie сеансу Y для веб-сайту Джеймса і налаштовую свій браузер на їх використання. Тепер, коли я переходжу на сайт Джеймса, на сайт Джеймса.
Фіксація сеансу - це техніка атаки, яка примушує ідентифікатор сеансу користувача до явного значення. Залежно від функціональності цільового веб-сайту, можна використати ряд методів для "виправлення" значення ідентифікатора сеансу. Ці методи варіюються від міжсайтових сценаріїв до створення веб-сайту попередньо зробленими HTTP-запитами. Після виправлення ідентифікатора сеансу користувача зловмисник буде чекати, поки цей користувач увійде в систему. Щойно користувач зробить це, зловмисник використовує заздалегідь визначене значення ідентифікатора сеансу, щоб прийняти ту саму ідентифікацію в мережі.
Коли використовувати
Коли користувач редагує / оновлює деякі важливі вхідні дані (зміна паролів, облікових даних, забутих паролів тощо), які можуть порушити безпеку сайту або політику конфіденційності.
Дивитися також:
Думаю, питання сесійного отруєння висвітлено досить добре.
Відповісти на запитання "Коли мені це використовувати?" Важливо відступити назад і розглянути, що робить ваша програма під час сеансу. Або, інакше кажучи, це ключове питання безпеки, на яке потрібно відповісти
Якби хтось влаштував цю сесію, що б він отримав?
Якщо все, що ви робите, - це відстежувати анонімні дані в іншому випадку (користувач заходить на сайт, а ви використовуєте їх для відстеження їх відвідувань), тоді мало причин для регенерації сеансу. Викрадач не здобув би нічого цінного, захопивши той сеанс.
Однак багато сайтів пропонують логіни. Логін змінює багато речей. Я можу отримати доступ до свого профілю. Я можу змінити налаштування. Отже, викрадач може захотіти отримати доступ до мого облікового запису, особливо якщо звичайні користувачі та користувачі адміністратора використовують сеанси для управління входом. Тому, коли люди заходять на мій сайт і входять в систему, я відновлюю сеанс. Це додає додатковий рівень безпеки, через який мій нещодавно увійшов користувач рідше захоплюється.
Кожного разу, коли ми додаємо важливі дані до сеансу, вам слід подумати про регенерацію ідентифікатора сеансу. Якщо вам потрібно загартувати вашу програму проти фіксації, випадкова регенерація може бути корисною, але я НІКОЛИ не регенерую за кожним запитом. За замовчуванням PHP зберігає сесії у файлах на локальному диску. Ви додаєте багато дискового вводу-виводу, щоб пом'якшити відносно невеликий вектор атаки. Якщо вам дійсно потрібна більша безпека, я б пропонував регулярно переходити до повного HTTPS, а не до регенерації (HTTPS робить фіксацію дуже важкою).
session_regenerate_id
?Ви повинні використовувати його, щоб запобігти фіксації сеансу .
session_regenerate_id
?Щоразу, коли змінюється стан автентифікації, це головним чином при вході та виході.
Боб сидить за загальнодоступним комп’ютером і, переглядаючи stackoverflow.com, відкриває там новий сеанс. Ідентифікатор сеансу зберігається у файлі cookie (із httpOnly
позначкою для запобігання доступу через javascript). Уявімо, що у Stack Overflow завжди було ввімкнено HTTPS, а також встановлено secure
прапор для файлу cookie.
Як ми можемо вкрасти сесію зараз?
Боб записує ідентифікатор сеансу. Він залишає комп’ютер, не закриваючи браузер. Тепер Аліса підходить до цього комп’ютера і бачить, що переповнення стека вже завантажено. Зараз вона входить в систему.
Зараз ми на етапі, де ви повинні використовувати session_regenerate_id
. Якщо ви не створите тут новий ідентифікатор сеансу під час входу, Боб може використати попередній сеанс, який він записав, для доступу до сеансу Аліси і буде ввійти як Аліса зараз.
session_regenerate_id()
виданий, Аліса зможе отримати доступ до облікового запису bobs? це так?
Ви можете використовувати його для кращої безпеки.
Таким чином ви створюєте ідентифікатори сеансу для одноразового використання.
Припустимо, ваш ідентифікатор сеансу користувача = 3
Якийсь хакер зламав вашого клієнта та отримав їх session_id. Тож хакер може використовувати цей файл cookie для використання їх сеансу.
Якщо у вас є код типу
session_start();
session_regenerate_id();
ви можете змінювати їх сеанс кожного разу, коли вони використовують ваш веб-сайт.
Тепер хакер отримує sessionid = 3
але ви змінили сеанс після того, як він використав цей ваш
користувач має sessionid = 4 // auth
хакер має сесію = 3 // нуль
Але є невеликий сенс, що можна сказати, що ви використовуєте метод регенерації, а ваш клієнт просто увійшов на веб-сайт і закрив браузер або неактивний. Ваш клієнт має sessionid = 4, і якщо хакер отримає файли cookie в цій частині, він буде мати такий самий sessionid.
Як пояснювалося вище, таким чином ви можете захистити свого клієнта від обнюхування даних в один бік, але все одно це не вирішить цю проблему назавжди.
Але це буде набагато безпечніше, якщо ви використовуєте SSL enc.
Вибачте за погану англійську.
Простий варіант використання:
// 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();
Ідентифікатор сесії регенерується, і тепер користувач може почати спочатку створення іншої візитки.