Сесії в php

У різноманітних конференціях, присвячених програмуванню мене в першу чергу завжди цікавлять такі розділи, як "Web-програмування" та "Скрипти". Здебільшого, питання про PHP в таких форумах досить прості, що вимагають лише загального розуміння PHP, проте, найбільш часто задається питання за моїми спостереженнями, це: "Що таке сесії в PHP і з чим / як їх можна їсти?". Хотілося б роз'яснити це питання раз і назавжди.

З самого початку PHP все взяли на ура, але як тільки на цій мові стали створювати достатньо великі проекти, розробники зіткнулися з новою проблемою - в PHP було відсутнє поняття глобальних змінних! Тобто, виконувався якийсь скрипт, посилав згенерувала сторінку клієнту, і все ресурси, що використовуються цим скриптом знищувалися. Спробую проілюструвати: припустимо є дві сторінки одного сайту, index.php і dothings.php. Вихідні тексти до цих сторінках виглядають так:

$ A = "Мене поставили на index.php";

Якщо виконати ці два скрипта, то на першій сторінці ми побачимо напис "Мене поставили на index.php", а друга сторінка буде порожньою.

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

Як працювати з сесіями?

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

"Warning: open (/ var / state / php / sess_6f71d1dbb52fa88481e752af7f384db0, O_RDWR) failed: No such file or directory (2)".

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

Будь-скрипт, який буде використовувати змінні (дані) з сесій, повинен містити наступну сходинку:

Ця команда говорить серверу, що дана сторінка має потребу у всіх змінних, які пов'язані з даним користувачем (браузером). Сервер бере ці перемнние (з файлу, або з БД) і робить їх доступними. Дуже важливо відкрити сесію до того, як будь-які дані будуть надсилатися користувачеві; на практиці це означає, що функцію session_start () бажано викликати на самому початку сторінки, наприклад так:

Після початку сесії можна задавати глобальні змінні. Це елементарно: викликаємо функцію session_register ( 'var_name'); і змінна $ var_name стає доступною на всіх сторінках, що використовують сесію. Для прикладу покорписав програмку, наведену на початку статті:

// задаємо значення змінної

$ A = "Мене поставили на index.php";

// реєструємо змінну з відкритою сесією

// важливо: назви змінних передаються функції session_register ()

Все ОК. Сесію завантажили!

При запуску цих файлів (в логічній послідовності звичайно), перший скрипт (index.php) видасть наступний результат:

Все ОК. Сесію завантажили! Пройдемо, подивимося що там:

А другий (dothings.php) ось це:

Мене поставили на index.php

Змінна $ a тепер доступна на всіх сторінках даного сайту, які запустили сесії.

Інші корисні функції для роботи з сесіями:

session_unregister (string) - сесія <забывает> значення заданої глобальної змінної;

session_destroy () - сесія знищується (наприклад, якщо користувач покинув систему, натиснувши кнопку <выход>);

session_set_cookie_params (int lifetime [, string path [, string domain]]) - за допомогою цієї функції можна встановити, як довго буде <жить> сесія, задавши unix_timestampопределяющій час <смерти> сесії. За замовчуванням, сесія <живёт> до тих пір, поки покупець не закриє вікно браузера.

Тепер звернемося до практичного застосування механізму сесій. Давайте розглянемо пару досить простих і в той же час корисних прикладів.

Введи пароль, смертний

Логін:

пароль:

// дані були відправлені формою?

// перевіряємо дані на правильність. в даному випадку я

// вписав своє ім'я користувача та пароль прямо в код, доцільніше

// було б перевірити логін / пароль в базі даних і при сов-

// запам'ятовуємо ім'я користувача

// і переправляємо його на <секретную> сторінку.

Вітання, , ти на секретній сторінці. )

Отже, ми вміємо передавати ідентифікатор від однієї сторінки (PHP-скрипта) до іншої (до наступного виклику з нашого сайту), а значить ми можемо розрізняти всіх відвідувачів сайту. Так як ідентифікатор сесії - це дуже велике число (128 біт), шансів, що його вдасться підібрати перебором, практично немає. Тому зловмисникові залишаються наступні можливості:

на комп'ютері користувача варто <троян>, який краде номера сесій;

зловмисник відловлює трафік між комп'ютером користувача і сервером. Звичайно, є захищений (зашифрований) протокол SSL, але ним користуються не всі;

до комп'ютера нашого користувача підійшов сусід і стягнув номер сесії.

Такі ситуації, засновані на тому, що хтось щось у когось стягне, в загальному, не входять до компетенції програміста. Про це повинні дбати адміністратори і самі користувачі.

Файл authorize.php - спроба підбору пароля за допомогою стороннього скрипта;

Отже, в нашій програмі явно видно дві <дыры>, одна маленька і не особливо помітна, а ось друга - просто величезна, через яку більшість хакерів і лізе туди, куди не треба.

як <залатать> дірку номер 1?

// повний шлях до кореневої директорії де розташовані скрипти

// якщо користувач прийшов з будь-якої сторінки нашого сайту

// то він начебто наш.

// Змінна $ HTTP_REFERER завжди доступна за замовчуванням

// зі значення у змінній $ SERVER_ROOT

// дані були відправлені формою?

Схожі статті