Безпека сесій, PHP
Безпека веб-сайтів ґрунтується на управлінні сесіями. Коли користувач підключається до безпечного сайту, він надає облікові дані, як правило, у формі імені користувача та пароля. Веб-сервер не має уявлення про те, який користувач уже увійшов до системи та як він переходить від сторінки до сторінки. Механізм сесій дозволяє користувачам не вводити пароль щоразу, коли вони хочуть виконати нову дію або перейти до нової сторінки.
Після автентифікації користувача веб-сервер надає йому ідентифікатор сесії. Цей ідентифікатор зберігається в браузері і підставляється щоразу, коли потрібна автентифікація. Це дозволяє уникнути повторюваних процесів введення логіну/паролю. Все це відбувається у фоновому режимі та не завдає дискомфорту користувачеві. Уявіть, якби ви вводили ім'я та пароль щоразу, коли переглядали нову сторінку!
Ідентифікатор сесії є рядком символів або цифр. Сервер пам'ятає, що ідентифікатор сеансу (SID) було дано користувача і дозволяє отримати доступ. Як наслідок, ID сесії має велике значення для ідентифікації, тому хакери протягом багатьох років шукали шляхи обходу автентифікації.
То як отримати ID сесії? Є низка методів, що використовуються для отримання ідентифікатора. Найбільш очевидним є атаки на сервер. Сервер десь зберігає SID і іноді це є загальнодоступне для читання місце. Наприклад, на деяких хостингах клієнтських користувачів використовується папка /tmp і кожен користувач може переглядати ID сеансів.
Наступний спосіб, який використовується для крадіжки сесії ідентифікатора є вгадування. Прогнозування відбувається тоді, коли атакуючих переконується у зв'язку між ідентифікаторами сеансів. Наприклад,деякі веб-системи використовують збільшення ID кожного разу, коли користувач входить до системи. Знаючи одну сесію хакер може визначити іншу. Інший метод, атака "грубою силою" (brute force attack). Це простий, але потенційно ефективний метод визначення ідентифікатора сесії. Хакер перебирає всі можливі ідентифікатори сесій, поки не випадково не зустріне допустимий. Але це не є серйозною вразливістю, оскільки зазвичай SID генерується рандомно і перебір може тривати досить тривалий час.
Що робити, щоб пом'якшити атаки?
2. Встановіть термін дії сесії. Після певного періоду бездіяльності користувач автоматично відключається від сесії. Таким чином, сесія буде доступна лише деякий час, що зменшує ризик перехоплення.
4. Завжди вибирайте довгий ID сесії. Багато нападів відбуваються тому що SID є занадто коротким або його легко передбачити. Ідентифікатор повинен складатися із псевдо-випадкових символів, складених за допомогою ГСЛ. Наприклад, при використанні 32-символьного ідентифікатора сесії, який містить літери алфавіту та цифри від 0 до 9, кількість можливих ідентифікаторів дорівнює 2.27е57! Це еквівалентно 190 бітному паролю і досить надійно для більшості веб-застосунків, що використовуються сьогодні.
5. Уважно ставтеся до критичних ситуацій. Сервер повинен повторно перевіряти користувача під час спроби виконання важливих операцій. Наприклад, повторити введення пароля під час спроби змінити його.
6. Надійно закривайте сесії. При закритті сесії видаляйте ідентифікатор на сервері, а не покладайтеся на сторону клієнта. Видаляйте SID під час виходу.
7. Завжди запобігайте кешуванню сторінок з конфіденційною інформацією на стороні клієнта. Використовуйте HTTP для встановлення терміну, коли сторінка некешується. Це змусить браузер відмовитись від вмісту сторінки з кешу.
8. Завжди вимагайте повторної аутентифікації після зазначеного періоду, навіть якщо сесія як і раніше активна. Інакше у разі захоплення сесії зловмисник може тримати з'єднання відкритим досить довго.
9. Можна виконувати інші види перевірок. Наприклад, можна перевірити SSL сертифікат клієнта і т.п.
В цілому, веб-програми залишаться більш-менш захищеними з виконанням цих вимог. Використовуєте поради, описані в цій статті, або придумаєте щось своє.