Материал: Опорник

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

3 Настройка сесій

Перш ніж почати працювати з сесіями, слід розібратися в тому, як коректно настроювати їх обробку інтерпретатором PHP. Сама робота з сесіями в PHP підтримується за умовчанням. Це значить, що встановлювати ніяких додаткових елементів не потрібно. А ось знати, що записане в настройках цього модуля, корисно, щоб уникнути помилок при роботі з ним.

Настройки PHP, у тому числі і для роботи з сесіями, прописуються у файлі php.ini. Звернемося до цього файлу.

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

Параметр session.save_path в php.ini, визначає, де на сервері зберігатимуться дані сесії . Через нього частіше за все виникають проблеми для Windows-серверів, тому що за умовчанням значення session.save_path встановлено в /tmp. І якщо в кореневій директорії серверу такої папки немає, то при запуску сесій видаватиметься помилка.

Сервер може обробляти велику кількість сесій одночасно, і всі їх тимчасові файли зберігатимуться в директорії, заданій параметром session.save_path. Якщо система погано працює з папками великого розміру, то зручно використовувати піддиректорії. Для цього, окрім назви папки, в значення параметра додають ще і число, що визначає глибину вкладеності піддиректорій в цій папці: N;/dir. Це значення потрібно обов'язково узяти в лапки, оскільки крапка з комою є одним з символів коментарів у файлі настройок PHP. Всі директорії і піддиректорії для зберігання даних сесії потрібно створити самостійно.

Наприклад: 2;/Temp визначає, що змінні сесій зберігатимуться в папках вигляду с:\Temp\0\a\, с:\Temp\0\b\ і т.п.

Зберігання даних на стороні клієнта здійснюється за допомогою cookies. Роботу PHP з cookies можна налаштувати, зокрема, за допомогою параметрів session.use_cookies, session.cookie_lifetime і т.п.

Параметр session.use_cookies визначає, чи використовувати cookies при роботі з сесіями. За умовчанням ця опція включена (тобто приймає значення "1" ).

Параметр session.cookie_lifetime задає тривалість життя cookies в секундах. За умовчанням це "0", тобто дані в cookies вважаються правильнимм до закриття вікна браузера.

Окрім цих параметрів, корисними можуть виявитися session.name, визначаючий ім'я сесії, session.auto_start, дозволяючий автоматично запускати сесії, session.serialize_handler, задаючий спосіб кодування даних сесії, і параметр session.cache_expire, що визначає, через скільки хвилин застаріває документ в кеші.

Ім'я сесії session.name за умовчанням встановлюється як PHPSESSID і використовується в cookies як ім'я змінної, в якій зберігається ідентифікатор сесії. Автоматичний запуск сесій за умовчанням відключений, але його можна задати, зробивши значення session.auto_start рівним "1". Для кодування даних сесії за умовчанням використовується php. Застарівання даних, збережених в кеші, відбувається через 180 хвилин.

Існує ще безліч настройок, з якими можна познайомитися в документації або безпосередньо у файлі настройок php.ini. На наш погляд, знайомства з перерахованими вище параметрами достатньо для роботи з сесіями в PHP. Отже приступимо.

4 Робота з сесіями

4.1 Створення сесії

Перше, що потрібно зробити для роботи з сесіями (якщо вони вже налаштовані адміністратором серверу), це запустити механізм сесій. Якщо в настройках серверу змінна session.auto_start встановлена в значення "0" (якщо session.auto_start=1, то сесії запускаються автоматично), то будь-який скрипт, в якому потрібно використовувати дані сесії, повинен починатися з команди

session_start();

Одержавши таку команду, сервер створює нову сесію або відновлює поточну, грунтуючись на ідентифікаторі сесії, переданому за запитом. Як це робиться? Інтерпретатор PHP шукає змінну, в якій зберігається ідентифікатор сесії (за умовчанням це PHPSESSID) спочатку в cookies, потім в змінних, переданих за допомогою POST- і GET-запитів. Якщо ідентифікатор знайдений, то користувач вважається ідентифікованим, проводиться заміна всіх URL і виставляння cookies. В протилежному випадку користувач вважається новим, для нього генерується новий унікальний ідентифікатор, потім проводиться заміна URL і виставляння cookies.

Команду session_start() потрібно викликати у всіх скриптах, в яких належить використовувати змінні сесії, причому до виведення яких-небудь даних в браузер. Це зв'язано з тим, що cookies виставляються тільки до виведення інформації на екран.

Одержати ідентифікатор поточної сесії можна за допомогою функції session_id().

Для наочності сесії можна задати ім'я за допомогою функції session_name([ім’я_сесії]). Робити це потрібно ще до ініціалізації сесії. Одержати ім'я поточної сесії можна за допомогою цієї ж функції, викликаної без параметрів: session_name();

Приклад 12.2. Створення сесії

Перейменуємо наш файл index.html, щоб оброблялися php-скрипти, наприклад в Index.php, створимо сесію і подивимося, який вона одержить ідентифікатор і ім'я.

<?

session_start();

// створюємо нову сесію або відновлюємо поточну

echo session_id();

// виводимо ідентифікатор сесії

?>

<html>

<head><title>My home page</title></head>

... // домашня сторіночка

</html>

<?

echo session_name();

// виводимо ім'я поточної сесії. В даному випадку це PHPSESSID

?>

Приклад 12.2. Створення сесії

Якщо виконати те ж саме з файлом authorize.php, то значення змінних (id сесії і її ім'я), що виводяться, будуть такими ж, якщо перейти на нього з index.php і не закривати перед цим вікно браузера (тоді ідентифікатор сесії зміниться).

4.2 Реєстрація змінних сесії

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

session_register(ім’я_змінної1, ім’я_змінної2 ...);

Помітимо, що реєструються не значення, а імена змінних. Зареєструвати змінну достатньо один раз на будь-якій сторінці, де використовуються сесії. Імена змінних передаються функції session_register() без знака $. Всі зареєстровані таким чином змінні стають глобальними (тобто доступними з будь-якої сторінки) протягом даної сесії роботи з сайтом.

Зареєструвати змінну також можна, просто записавши її значення в асоціативний масив $_SESSION, тобто написавши

$_SESSION['ім’я_змінної'] = 'значення_змінної';

В цьому масиві зберігаються всі зареєстровані (тобто глобальні) змінні сесії.

Доступ до таких змінних здійснюється за допомогою масиву $_SESSION['ім’я_змінної'] (або $HTTP_SESSION_VARS['ім’я_змінної'] для версії PHP 4.0.6 і більш ранніх). Якщо ж в настройках php включена опція register_globals, то до сесійних змінних можна звертатися ще і як до звичайних змінних, наприклад так: $ім’я_змінної.

Якщо register_globals=off (відключені), то користуватися session_register() для реєстрації змінних, переданих методами POST або GET, не можна, тобто це просто не працює. І взагалі, не рекомендується одночасно використовувати обидва методи реєстрації змінних $_SESSION і session_register(). (Починаючи з версією PHP 5.3.0 не рекомендується для реєстрації змінних сесії використовувати функцію session_register(); більш того, починаючи з версією PHP 6.0.0, ця функція стане неприступна. Натомість, для реєстрації змінних сесії рекомендується користуватися масивом $_SESSION.)

Приклад 12.3. Реєстрація змінних

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

<?

session_start();

// створюємо нову сесію або відновлюємо поточну

if (!isset($_GET['go'])){

echo "<form>

Login: <input type=text name=login>

Password: <input type=password name=passwd>

<input type=submit name=go value=Go>

</form>";

}else {

$_SESSION['login']=$_GET['login'];

// реєструємо змінну login

$_SESSION['passwd']=$_GET['passwd'];

// реєструємо змінну passwd

// тепер логін і пароль - глобальні змінні для цієї сесії

if ($_GET['login']=="pit" && $_GET['passwd']=="123") {

Header("Location: secret_info.php");

// перенаправляємо на сторінку secret_info.php

}else echo "Невірні дані. Спробуйте ще раз<br>";

}

print_r($_SESSION);

// виводимо всі змінні сесії

?>

Лістинг 12.3a. authorize.php

Тепер, потрапивши на сторіночку secret_info.php, та і на будь-яку іншу сторінку сайту, ми зможемо працювати з введеними користувачем логіном і паролем, які зберігатимуться в масиві $_SESSION. Таким чином, якщо змінити код секретної сторіночки (помітьте, ми перейменували її в secret_info.php) так:

<?php

session_start();

// створюємо нову сесію або відновлюємо поточну

print_r($_SESSION);

// виводимо всі змінні сесії

?>

<html>

<head><title>Secret info</title></head>

<body>

<p>Тут я хочу ділитися секретами з другом Петей.

</body>

</html>

Лістинг 12.3b. secret_info.php

То ми одержимо в браузері на секретній сторінці наступне:

Array ( [login] => pit [passwd] => 123 )

Тут я хочу ділитися секретами з другом Петей.

У результаті одержимо список змінних, зареєстрованих на authorize.php і, власне, саму секретну сторіночку.

Що це нам дає? Припустимо, хакер хоче прочитати секрети Васи і Петі. І він якось взнав, як називається секретна сторіночка (або сторіночки). Тоді він може спробувати просто ввести її адресу в рядку браузера, минувши сторінку авторизації (введення пароля). Щоб уникнути такого проникнення в наші таємниці, потрібно дописати всього пару рядків в код секретних сторіночок:

<?php

session_start();

// створюємо нову сесію або відновлюємо поточну

print_r($_SESSION);

// виводимо всі змінні сесії

if (!($_SESSION['login']=="pit" && $_SESSION['passwd']==123))

// перевіряємо правильність пароля-логіна

Header("Location: authorize.php");

// якщо помилка, то перенаправляємо на сторінку авторизації

?>

<html>

<head><title>Secret info</title></head>

// тут розташовується секретна інформація :)

</html>

Лістинг 12.3c. 2-а версія secret_info.php

Источник: https://tut-files.ru/previewfile/153681