ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Сесії в PHP
         

     

    Інформатика, програмування

    Сесії в PHP

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

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

    -- index.php -

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

    ?>

    echo $ a;

    ?>

    - dothings.php -

    echo $ a;

    ?>

    Якщо виконати ці два скрипта, то на першій сторінці ми побачимо напис "Мене поставили на 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 () бажано викликати на самому початку сторінки, наприклад так:

    session_start ();

    ?>

    ...

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

    -- index.php -

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

    session_start ();

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

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

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

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

    // без знаку $

    session_register ( "a ");

    ?>

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

    Пройдемо, подивимося що

    Логін:

    Пароль:

    - authorize.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;

    )

    )

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

    ?>

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

    -- secretplace.php -

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

    session_start ();

    /*

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

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

    відкривається його на сторінку index.php

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

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

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

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

    */

    if (! isset ($ logged_user )){

    header ( "Location: index.php ");

    exit;

    )

    ?>

    Привіт, , ти на секретній сторінці!!! :)

    Безпека

    Отже, ми вміємо передавати ідентифікатор від однієї сторінки (PHP-скрипта) до іншої (до наступного виклику з нашого сайту), а значить ми можемо розрізняти всіх відвідувачів сайту. Так як ідентифікатор сесії - це дуже велике число (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 -

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

    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;

    )

    )

    )

    ?>

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

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

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

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

    -- secretplace.php V2 -

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

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

    unset ($ logged_user);

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

    session_start ();

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

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

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

    session_register ($ logged_user);

    /*

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

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

    відкривається його на сторінку index.php

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

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

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

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

    */

    if (! isset ($ logged_user )){

    header ( "Location: index.php ");

    exit;

    )

    ?>

    Привіт, , ти на секретній сторінці!!! :)

    Підсумки

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

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

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

    $ _SESSION [ 'counter'] = 12;

    echo $ counter;

    ?>

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

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://phpcell.webhost.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status