• Главная
  • Карта сайта
Не найдено

Програмування з використанням PHP і MySQL в розробці Web-додатків: Частина 12. Базова ідентифікація засобами PHP і засобами apache

  1. Серія контенту:
  2. Цей контент є частиною серії: Програмування з використанням PHP і MySQL в розробці Web-додатків
  3. Базова аутентифікація
  4. Використання базової аутентифікації в PHP
  5. Малюнок 1.
  6. Використання базової аутентифікації на сервері apache за допомогою файлів .htaccess
  7. Реалізація системи єдиної реєстрації
  8. висновки
  9. Ресурси для скачування

Програмування з використанням PHP і MySQL в розробці Web-додатків

Серія контенту:

Цей контент є частиною # з серії # статей: Програмування з використанням PHP і MySQL в розробці Web-додатків

https://www.ibm.com/developerworks/ru/library/?series_title_by=**auto**

Слідкуйте за виходом нових статей цієї серії.

Цей контент є частиною серії: Програмування з використанням PHP і MySQL в розробці Web-додатків

Слідкуйте за виходом нових статей цієї серії.

В попередніх статтях були розглянуті основні технології з підготовки СУБД, створення базового варіанту сайту, розглянуті питання, що стосуються створення CMS. У цій статті будуть розглянуті технології використання ідентифікації користувачів на сайті засобами PHP і засобами apache, які будуть застосовуватися в подальших більш широких і масштабних проектах. В кінці буде зроблена спроба показу єдиної, прозорої для користувача, системи реєстрації.

Базова аутентифікація

На сьогоднішній день в мережі Інтернет базова аутентифікація користувачів є однією з найпоширеніших завдань. Вбудованою можливістю аутентифікації володіє протокол HTTP. При використанні цього підходу сценарії або веб-браузери запитують аутентифікацію у веб-браузера. Після чого, як правило, веб-сервер виводить діалогове вікно, що дозволяє вести користувачеві свої реєстраційні дані. Веб-браузер зберігає відомості аутентифікації до тих пір, поки відкрито його вікно, а веб-сервер запитує нові відомості аутентифікації при кожному новому запиті користувача. Навіть при такій формі взаємодії браузер не відповідає кожен раз, маючи потрібну інформацію в пам'яті. Він автоматично відправляє всі необхідні відомості без втручання користувача. Саме це властивість протоколу HTTP і називають базовою аутентифікацією (basic authentication). Базову аутентифікацію можна включати засобами PHP або за допомогою механізмів, якими володіє веб-сервер apache. У цій статті будуть розглянуті методи, які передбачають залучення PHP, сервера apache і IIS.

При базовій аутентифікації ім'я користувача і пароль передаються у вигляді відкритого тексту. Такий спосіб не можна назвати безпечним. З приходом протоколу HTTP1.1 з'явився більш досконалий спосіб. Він називається аутентифікацією за допомогою дайджесту (digest authentication). При цьому використовується механізм хешування (як правило, MD5) для приховування подробиць виконання транзакцій. Даний тип аутентифікації підтримується практично всіма веб-серверами і майже всіма сучасними веб-браузерами. На жаль, версія стандарту, яка використовується в Microsoft Internet Explorer і Microsoft IIS не сумісна з продуктами інших компаній.

Незважаючи на кращі механізми реалізації, цей вид аутентифікації все одно залишається небезпечним. І базова і дайджест аутентифікації забезпечують низький рівень безпеки. Використання будь-якого з цих методів не дає користувачеві повної впевненості в тому, що він працює саме з тим сайтом, на який розраховує. Обидва методи дозволяють зломщикові повторити той же запит до сервера. А в разі базової аутентифікації, при передачі пароля у відкритому вигляді, будь-який досвідчений зломщик здатний перехопити пакети і імітувати запити користувача. У загальному випадку, рівень безпеки при використанні базової аутентифікації порівнянний з таким, при використанні протоколів ftp або telnet, що звичайно, не відповідає ніяким вимогам сьогоднішнього дня.

Найбільш безпечним способом захисту транзакцій в Інтернет може вважатися комбінування базової аутентифікації з протоколом SSL і цифровими сертифікатами. Хоча багато ситуацій допускають застосування більш швидких і щодо незахищених методів, наприклад, таких, як базова аутентифікація в її первісному виконанні. Крім того, базова автентифікація дозволяє захистити іменовані області та вимагає від користувачів введення потрібного імені і пароля. Таких областей на одному сервері може бути кілька, причому різні набори файлів і папок на одному сервері можуть належати різним іменованих областях, де кожна зі своїм ім'ям і паролем.

Використання базової аутентифікації в PHP

В основі використання базової аутентифікації лежать змінні середовища сервера. Знаючи це, треба мати на увазі, що сценарій PHP повинен визначати тип сервера і вести себе так, як, якби він використовувався в якості модуля сервера apache або ISAPI-модуля сервера IIS. Наведений нижче сценарій буде однаково добре виконуватися на обох веб-серверах.

&lt;? Php // Якщо використовується сервер IIS, буде потрібно встановити змінні середовища if (substr ($ SERVER_SOFTWARE, 0, 9) == 'Microsoft' &&! Isset ($ PHP_AUTH_USER) &&! Isset ($ PHP_AUTH_PW) && substr ($ HTTP_AUTHORIZATION, 0, 6) == 'Basic') {list ($ PHP_AUTH_USER, $ PHP_AUTH_PW) = explode ( ':', base64_decode (substr ($ HTTP_AUTHORIZATION, 6))); } // Замініть цей оператор if запитом до бази даних або чимось подібним if ($ PHP_AUTH_USER! = 'User' || $ PHP_AUTH_PW! = 'Pass') {// Відвідувач ще не надав потрібну інформацію, або його // ім'я користувача і пароль неправильні header ( 'WWW-Authenticate: Basic realm = "Realm-Name"'); if (substr ($ SERVER_SOFTWARE, 0, 9) == 'Microsoft') header ( 'Status: 401 Unauthorized'); else header ( 'HTTP / 1.0 401 Unauthorized'); echo '<h1> Негайно залишіть цю сторінку! </ h1>'; echo 'Ви не дозволено переглядати цей ресурс.'; } Else {// Відвідувач надав вірну інформацію echo '<h1> Ви на місці! </ H1>'; echo '<p> Це місце і є те, в яке Ви хотіли потрапити!. &lt;/ p>'; }?>

Код працює наступним чином. Якщо користувач не передав інформацію про аутентифікації, то йому надається відповідний запит. Якщо інформація користувача не вірна, то для нього відображається повідомлення про відмову в доступі. Якщо ж він надав вірну пару пароль + облікове ім'я, то буде показано вміст захищається сторінки. Відмінність цього інтерфейсу від розглянутих раніше полягає в тому, що тут немає визначається програмістом HTML-форми для введення даних. Діалогове вікно для аутентифікації виводить сам браузер (див. Рис. 1).

Малюнок 1.
Програмування з використанням PHP і MySQL в розробці Web-додатків   Серія контенту:   Цей контент є частиною # з серії # статей: Програмування з використанням PHP і MySQL в розробці Web-додатків   https://www

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

При необхідності захисту багатьох сторінок на веб-сайті, даний код потрібно буде помістити в початок кожної з них або автоматично вставити його на початку кожного файлу каталогу.

Використання базової аутентифікації на сервері apache за допомогою файлів .htaccess

Результат, описаний вище можна отримати і без використання PHP сценаріїв. Внутрішні механізми сервера apache надають безліч технологій використання механізму аутентифікації. Один з найпростіших - це використання модуля mod_auth, робота якого полягає в порівнянні текстової пари ім'я + пароль з їх аналогами, що зберігаються на сервері. Для виведення екрану, схожого на попередній приклад, потрібно створити два HTML-файлу. Один для вмісту сторінки, інший для повідомлення про відмову в доступі. Створення виразної і інформативною сторінки для відображення повідомлення про помилку або відмову в доступі є хорошим стилем програмування. З огляду на, що така сторінка буде відображатися в разі невдалої спроби увійти в закриту зону, може бути корисним в повідомленні розмістити інформацію про можливу реєстрації. Корисною може виявитися можливість перевизначення пароля і відправка його по електронній пошті. Нижче приводиться код реалізує деякі обговорювані позиції.

Повідомлення про вдалу аутентифікації:

<Html> <body> <h1> Ви на місці! </ H1> <p> Я вважаю, ви щасливі бачити цю секретну сторінку. </ P> </ body> </ html>

Повідомлення про помилку аутентифікації

<Html> <body> <h1> Негайно залишіть цю сторінку! </ H1> <p> Ви не дозволено переглядати цей ресурс. </ P> </ body> </ html>

файл .htaccess

ErrorDocument 401 /chapter16/rejection.html AuthUserFile /home/book/.htpass AuthGroupFile / dev / null AuthName "Realm-Name" AuthType Basic require valid-user

Наведений файл .htaccess управляє доступом до файлів і підкаталогів каталогу, в якому він розміщений. У лістингу приведений приклад такого файлу. Він забезпечує включення базової аутентифікації в каталозі розміщення. Тут можуть бути встановлені різні параметри, проте в прикладі всі рядки належать до аутентифікації.

Реалізація системи єдиної реєстрації

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

Схематично це можна було уявити так. Клієнт виконує запит до одного з серверів (до магазину). Якщо він не входить в систему, то сценарій повинен його туди направити (для реєстрації), але на інший сервер (сервер єдиної аутентифікації). В параметрах перенаправлення повинна бути прихована змінна, що містить зашифрований запит на авторизацію, який підтверджує той факт, що клієнтський запит надійшов з першого сервера. На сервері аутентифікації клієнтом заповнюється форма із запитом на авторизацію з ім'ям і паролем. Сервер аутентифікації обробляє запит і перенаправляє користувача назад, на перший магазин. Отримуючи потрібний cookie-файл, клієнт завершує процес входу. При наступних спробах входу на або Вам хтось продає, використовує цей же сервер аутентифікації, запити йдуть вже по найкоротшому шляху і процес стає прямим, а користувач впізнаваним. Наведений нижче клас використовує два виду сполучення - запити і відповіді, які передаються не як cookie-файли, а як параметри рядка запиту.

class SingleSignOn {protected $ cypher = 'blowfish'; protected $ mode = 'cfb'; protected $ key = 'choose a better key'; protected $ td; protected $ glue = '|'; protected $ clock_skew = 60; protected $ myversion = 1; protected $ client; protected $ server; protected $ userid; public $ originating_uri; public function __construct () {$ this-> td = mcrypt_module_open ($ cypher, '', $ mode, ''); } Protected function _encrypt ($ plaintext) {$ iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($ td), MCRYPT_RAND); mcrypt_generic_init ($ this-> td, $ this-> key, $ iv); $ Crypttext = mcrypt_generic ($ this-> td, $ plaintext); mcrypt_generic_deinit ($ this-> td); return $ iv. $ crypttext; } Protected function _decrypt ($ crypttext) {$ ivsize = mcrypt_get_iv_size ($ this-> td); $ Iv = substr ($ crypttext, 0, $ ivsize); $ Crypttext = substr ($ crypttext, $ ivsize); mcrypt_generic_init ($ this-> td, $ this-> key, $ iv); $ Plaintext = mdecrypt_generic ($ this-> td, $ crypttext); mcrypt_generic_deinit ($ this-> td); return $ plaintext; } Public function generate_auth_request () {$ parts = array ($ this-> myversion, time (), $ this-> client, $ this-> originating_uri); $ Plaintext = implode ($ this-> glue, $ parts); $ Request = $ this -> _ encrypt ($ plaintext); header ( "Location: $ client-> server? request = $ request"); } Public function process_auth_request ($ crypttext) {$ plaintext = $ this -> _ decrypt ($ crypttext); list ($ version, $ time, $ this-> client, $ this-> originating_uri) = explode ($ this-> glue, $ plaintext); if ($ version! = $ this-> myversion) {throw new SignonException ( "version mismatch"); } If (abs (time () - $ time)> $ this-> clock_skew) {throw new SignonException ( "request token is outdated"); }} Public function generate_auth_response () {$ parts = array ($ this-> myversion, time (), $ this-> userid); $ Plaintext = implode ($ this-> glue, $ parts); $ Request = $ this -> _ encrypt ($ plaintext); header ( "Location: $ this-> client $ this-> originating_uri? response = $ request"); } Public function process_auth_response ($ crypttext) {$ plaintext = $ this -> _ decrypt ($ crypttext); list ($ version, $ time, $ this-> userid) = explode ($ this-> glue, $ plaintext); if ($ version! = $ this-> myversion) {throw new SignonException ( "version mismatch"); } If (abs (time () - $ time)> $ this-> clock_skew) {throw new SignonException ( "response token is outdated"); } Return $ this-> userid; }} Protected function _encrypt ($ plaintext) {$ iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($ td), MCRYPT_RAND); mcrypt_generic_init ($ this-> td, $ this-> key, $ iv); $ Crypttext = mcrypt_generic ($ this-> td, $ plaintext); mcrypt_generic_deinit ($ this-> td); return $ iv. $ crypttext; } Protected function _decrypt ($ crypttext) {$ ivsize = mcrypt_get_iv_size ($ this-> td); $ Iv = substr ($ crypttext, 0, $ ivsize); $ Crypttext = substr ($ crypttext, $ ivsize); mcrypt_generic_init ($ this-> td, $ this-> key, $ iv); $ Plaintext = mdecrypt_generic ($ this-> td, $ crypttext); mcrypt_generic_deinit ($ this-> td); return $ plaintext; }

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

function check_auth () {try {$ cookie = new Cookie (); $ Cookie-> validate (); } Catch (AuthException $ e) {try {$ client = new SingleSignOn (); $ Client-> process_auth_response ($ _ GET [ 'response']); $ Cookie-> userid = $ client-> userid; $ Cookie-> set (); } Catch (SignOnExcpetion $ e) {$ client-> generate_auth_request (); exit; }

сторінка реєстрації:

&lt;? Php require_once 'Cookie.inc'; require_once 'SingleSignOn.inc'; $ Name = $ _POST [ 'name']; $ Password = $ _POST [ 'password']; $ Request = $ _REQUEST [ 'request']; try {$ signon = new SingleSignOn (); $ Signon-> process_auth_request ($ request); if ($ name && $ password) {$ userid = authenticate ($ name, $ password, $ signon-> client); } Else {$ cookie = new Cookie (); $ Cookie-> validate (); authenticateFromCookie ($ cookie-> userid, $ signon-> client); $ Userid = $ cookie-> userid; } $ Signon-> userid = $ userid; $ Resetcookie = new Cookie ($ userid); $ Cookie-> set (); $ Signon-> generate_auth_reponse (); return; } Catch (AuthException $ e) {?> <Html> <title> SingleSignOn Sign-In </ title> <body> <form name = signon method = post> Username: <input type = "text" name = "name" > <br> Password: <input type = "password" name = "name"> <br> <input type = "hidden" name = "auth_request" value = "&lt;? = $ _REQUEST [ 'request']?> < input type = submit name = submitted value = "Login"> </ form> </ body> </ html> &lt;?} catch (SignonException $ e) {header ( "HTTP / 1.0 403 Forbidden");}?>

У підсумку отримуємо практично повну (без окремих технічних елементів) і витончену систему єдиної реєстрації.

висновки

У статті на реальних прикладах розглянуто питання підготовки проведення базової аутентифікації засобами PHP і засобами веб-сервера apache. Детально розглянуто макет єдиної системи реєстрації, що дозволяє обслуговувати сервера в різних доменах. Наведені скрипти мають хороші коментарі і описову частину, достатню для швидкого засвоєння та подальшої адаптації до існуючих завдань.

далі ми розглянемо ідентифікацію користувачів за допомогою mod_auth_mysql.

Ресурси для скачування

Схожі теми

  • Програмування з використанням PHP і MySQL в розробці Web-додатків. Частина 1 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. Частина 2 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 3 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 4 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 5 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 6 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 7 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 8 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 9 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 10 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 11 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 12 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 13 .
  • Програмування з використанням PHP і MySQL в розробці Web-додатків. частина 14 .

Підпишіть мене на повідомлення до коментарів

Com/developerworks/ru/library/?
Lt;?
Lt;/ p>'; }?
Location: $ client-> server?
Location: $ this-> client $ this-> originating_uri?
REQUEST [ 'request']?
Catch (SignonException $ e) {header ( "HTTP / 1.0 403 Forbidden");}?
Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью