Реферати

Реферат: Сесії в PHP

Соціальні мережі. Кількість соціальних мереж в Інтернету і чисельність їхніх учасників. Форуми і блоги як найбільш розповсюджені форми спілкування за допомогою Web-технологій. Реєстрація користувачів, обліковий дані, сеанс роботи в середовищі мережі. Види пошуку інформації.

Формування основ світогляду молодших школярів. Сутність, функції і критерії сформованості наукового світогляду. Особливості формування основ світогляду в молодших школярів. Зміст, методи й оцінка ефективності роботи вчителя по формуванню наукового світогляду в школярів.

Участь Казахстану в інтеграційних процесах. Міжнародна економічна інтеграція - процес господарського і політичного об'єднання країн на основі розвитку стійких взаємозв'язків і поділу праці. Роль Казахстану в міжнародному інтеграційному процесі, його участь у митному союзі і ШОС.

Регіональний аспект міжнародних відносин Єгипту й Ізраїлю в 90-х рр. XX - початку XXI вв.. Збройне протистояння між ізраїльською армією і палестинцями наприкінці 90-х. Напруженість між Каїром і Тель-Авівом, причини, наслідку. Оснащення армії, розвиток воєнної промисловості Ізраїлю. Підписання єгипетсько-ізраїльського мирного договору.

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

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

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

- index.php -

<?php

$а = "Мене задали на index.php";?

>

< html > < body >

<?php

echo $a;?

>

< /body > < /html >

- dothings.php -

< html > < body >

<?php

echo $a;?

>

< /body > < /html >

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

Розробники web-сайтов, недовго думаючи, стали використати cookie для зберігання глобальних змінних на стороні клієнта. Процес виглядав приблизно так: користувач приходить на головну сторінку сайта, робить якісь дії, і вся інформація, пов'язана з цим користувачем, яка може зажадатися на інших сторінках сайта, буде зберігатися у нього в браузере у вигляді cookie. Цей метод меет досить серйозні мінуси, через яких від PHP в свій час відвернулося немало розробників. Наприклад, нам треба авторизувати користувача, щоб дозволити йому доступ до закритих (або належним тільки йому) розділів сайта. Придеться < кидати > користувачу cookie, який буде служить його подальшим ідентифікатором на сайте. Такий підхід стає дуже громіздким і не зручним, як тільки сайт починає збирати все більше і більше відомостей про поведінку користувача, адже всю інформацію, що посилається користувачу, бажано кодувати, щоб її не можна було підробити. Ще зовсім недавно підробкою cookie можна було < повалити > не один чат, а часом і пробратися в чужу пошту. До того ж є ще на світі дивні люди, у яких браузер cookie не підтримує.

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

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

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

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

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

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

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

session_start();

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

<? php

session_start();?

>

< html >

< head >

< /head >.

..

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

- index.php -

<?php

// відкриваємо сесію

session_start();

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

$а = "Мене задали на index.php";

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

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

// беззнака $

session_register("a");?

>

< html >

< body >

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

Пройдемо, подивимося що < а href="dothings.php > там: < /а >

< /body >

< /html >

- dothings.php -

<?php

// відкриваємо сесію

session_start();?

>

< html >

< body >

<?php

echo $a;?

>

< /body >

< /html >

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

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

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

Мене задали на index.php

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

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

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

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

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

Приклади

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

Авторизація Користувача

Питання по авторизації користувачів за допомогою РНР-сесій постійно задаються в конференціях по web-програмуванню. Механізм авторизації користувачів в системі за допомогою сесій досить хороший з точки зору безпеки (див. розділ < Безпека > нижче).

Наш приклад буде складатися з трьох файлів: index.php, authorize.php і secretplace.php. Файл index.php містить форму, де користувач введе свій логин і пароль. Ця форма передасть дані файлу authorize.php, який у разі успішної авторизації допустить користувача до файла secretplace.php, а в іншому випадку видасть повідомлення про помилку.

Приступимо: - index.php -

< html >

< head >

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

< /head >

< body >

< form action="authorize.php" method="post" >

Логин: < input type="text" name="user_name" > < br >

Пароль: < input type="password" name="user_pass" > < br >

< input type="submit" name="Submit" >

< /form >

< /body >

< /html >

- authorize.php -

<?php

// відкриваємо сесію

session_start();

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

if($Submit){

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

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

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

падениидатьдоступпользователю...

if($user_name=="cleo")(&& ($user_pass=="password")){

$logged_user = $user_name;

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

session_register("logged_user");

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

"header( Location: secretplace.php");

exit;

}

}

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

>

< html > < body >

Ви ввели невірний пароль!

< /body > < /html >

- secretplace.php -

<?php

// відкриваємо сесію

session_start();

/*

просто зайти на цю сторінку не можна... якщо

ім'я користувача не зареєстроване, то

перенаправляти його на сторінку index.php

для введення логина і пароля... тут насправді

можна багато чого зробити, наприклад запам'ятати

IP користувача, і після третьої спроби отримати

доступ до файлів, його закрити.

*/

"if(!isset($logged_user)){

header( Location: index.php");

exit;

}?

>

< html >

< body >

Привіт, <? php echo $logged_user;? >, ти на секретній сторінці!!!: )

< /body >

< /html >

Безпека

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

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

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

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

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

Проте, PHP дуже часто можна < обдурити >. Давайте розглянемо можливі точки злому в програмі авторизації користувача:

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

Файл secretplace.php - спроба обдурити програму шляхом вписування значень змінної $logged_user в адресному рядку браузера, наприклад так:

http://www.yoursite.ru/secretplace.php?logged_user=hacker

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

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

Не будемо писати тонни коду по блокуванню IP-адреси і т. п., а просто перевіримо, звідки приходить запит, а точніше з якої сторінки прийшов запит, якщо це буде будь-яка сторінка з нашого сайта, то все нормальне, а у всіх інших випадках пускати не будемо. Подкорректируем файл authorize.php:

- authorize.php V2 -

<?php

// відкриваємо сесію

session_start();

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

$"SERVER_ROOT = http://localhost/test1/";

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

// то він на зразок наш...

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

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

// функція eregi() перевіряє, чи починається адреса сторінки, що посилається

// зі значення в змінної $SERVER_ROOT

if(eregi("^$SERVER_ROOT",$HTTP_REFERER)){

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

if($Submit){

// далеевсекакраньше

if($user_name=="cleo")(&& ($user_pass=="password")){

$logged_user = $user_name;

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

session_register("logged_user");

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

"header( Location: secretplace.php");

exit;

}

}

}?

>

< html > < body >

Ви ввели невірний пароль!

< /body > < /html >

Як позбутися від < діри > номер 2?

Передбачимо, у вас є сайт, де кожний смертний може зареєструватися щоб додавати повідомлення в форум. Природно, в форумі у деяких користувачів (админов, модераторов), можливостей більше ніж у інших, вони, наприклад, можуть видаляти повідомлення інших користувачів. Рівень доступу користувача ви зберігаєте в сесії, в змінної $user_status, де $user_status = 10 відповідає повному доступу до системи. Зловмиснику, що Прийшов на сайт досить зареєструватися штатним образом, а потім дописати в адресному рядку браузера? user_status=10. Ось і завівся у вас на форумі новий админ!

У принципі, будь-яку змінну скрипта можна задати через адресний рядок, просто дописавши після повної адреси до скрипту знак питання і назву змінної з її значенням. Давайте поправимо наш код, щоб цього уникнути:

- secretplace.php V2 -

<?php

// прибираємо все зайве з адресного рядка

// функція unset() < звільняє > змінну

unset($logged_user);

// відкриваємо сесію

session_start();

// і коректуємо зіпсовані перменние.

// Важливо: в цьому випадку, змінна реєструється не як нова

// змінна, а як вже існуюча, а тому знак $ не опускається

session_register($logged_user);

/*

просто зайти на цю сторінку не можна... якщо

ім'я користувача не зареєстроване, то

перенаправляти його на сторінку index.php

для введення логина і пароля... тут насправді

можна багато чого зробити, наприклад запам'ятати

IP користувача, і після третьої спроби отримати

доступ до файлів, його перекрити.

*/

"if(!isset($logged_user)){

header( Location: index.php");

exit;

}?

>

< html >

< body >

Привіт, <? php echo $logged_user;? >, ти на секретній сторінці!!!: )

< /body >

< /html >

Підсумки

Механізм сесій - досить вдала особливість мови PHP. Сесії рости, дуже гнучкі у використанні. До речі, є одна, мало де документована можливість сесій PHP (доступна починаючи з версії 4.0.3) - в сесіях можна зберігати не тільки змінні, але і об'єкти.

Додавання від 14.12.2001

З виходом в світло PHP 4.1.0 - робота з сесіями значно полегшилася. Всі змінні сесій стали доступні з глобального масиву _SESSION['var_name']. Саме приємне напевно в тому, що при привласненні якого-небудь значення будь-якому полю масиву, змінна з таким же ім'ям автоматично реєструється, як змінна сесії, на пр:

<?

$_SESSION[' counter'] = 12;

echo $counter;?

>

виведетнаекранброузерачисло 12.