Разработка сайта для Вашего бизнеса. Веб дизайн. Дизайн логотипа, фирменного стиля, рекламная фотография . Комплексный рекламный креатив.

Ralex. We do the work.
На рынке с 1999го года. Средняя ценовая категория. Ориентация на эффективность решений.
Ознакомтесь с нашим портфолио
Узнайте больше о услугах
Свяжитесь с нами:
E-mail: [email protected]
Tel: (044) 587 - 84 - 78
Custom web design & дизайн и разработка сайта "под ключ"
Креативный, эффективный дизайн. Система управления сайтом (СУС).
Custom flexible разработка систем электронной коммерции
Система e-commerce разрабатывается под индивидуальные потребности. Гибкая функциональность.
Search Engine Optimzation & оптимизация под поисковые системы (SEO)
Постоянная оптимизация и мониторинг сайта в поисковых системах. Достигаем результата быстро и эффективно
Custom logo design & дизайн логотипа и фирменного стиля
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.
профессиональная рекламная фотография
креативно, смело, качественно
Custom logo design & рекламный креатив. дизайн рекламы
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.

Програмування з використанням PHP і MySQL в розробці Web-додатків: Частина 3. Рішення завдання аутентифікації відвідувачів Web-сайту. Технології зберігання паролів

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

Наша взаимовыгодная связь https://banwar.org/

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

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

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

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

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

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

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

Інтернет - середовище анонімна, але іноді потрібно мати дані про відвідувачів сайту. Однак ці дані можуть бути незначні, якщо вони отримані без особистої участі самих відвідувачів. Так, на стороні сервера без участі користувача може бути отримана інформація про версії Web-браузера, версії і тип операційної системи. Можна дізнатися інформацію про дозвіл і колірній палітрі монітора, визначити розмір вікон браузера. Крім загальних даних, можливе отримання ip-адреси і місця його «прописки» - географічне розташування. Але вся ця інформація не дає можливості встановити особисті дані самого користувача, які потім можна використовувати для зворотного зв'язку з ним. Це може знадобитися для виключення необхідності введення кожен раз зареєстрованим користувачем своїх даних при зверненні до різних сервісів сайту. Наприклад, при подібному підході клієнту не доведеться кожного разу вказувати відомості про себе для доставки товарів з інтернет-магазину додому.

Запитавши і отримавши таку інформацію про користувача, її потрібно з ним зв'язати і використовувати при його подальших відвідуваннях. У таких випадках застосовують аутентифікацію - пропозиція відвідувачеві сайту підтвердити свою особистість. При цьому мається на увазі введення їм унікального імені та пароля. Розглянемо простий приклад реалізації контролю доступу аутентіфіціруемого користувача на сайт.

Реалізація контролю доступу

Скрипт в прикладі виводить одну з трьох можливих сторінок (областей). Якщо файл завантажується без необхідних параметрів про відвідувача, то виводиться форма для заповнення даних (малюнок 3). При введенні «правильних» даних відображається секретна область, в іншому випадку - повідомлення з пропозицією піти.

Малюнок 3.
&lt;? Php // Короткі імена змінних @ $ name = $ _POST [ 'name']; @ $ Password = $ _POST [ 'password']; if (empty ($ name) || empty ($ password)) {// Введення Відвідувачем імені та пароля?> <h1> Введіть своє ім'я користувача та пароль </ h1> Ця область є секретною. <Form method = "post" action = "secret.php"> <table border = "1"> <tr> <th> Ім'я користувача </ th> <td> <input type = "text" name = "name" > </ td> </ tr> <tr> <th> Пароль </ th> <td> <input type = "password" name = "password"> </ td> </ tr> <tr> <td colspan = "2" align = "center"> <input type = "submit" value = "Увійти"> </ td> </ tr> </ table> </ form> &lt;? php} else if ($ name == 'user' && $ password == 'pass') {// ім'я користувача і пароль вірні echo '<h1> Ви в секретній області </ h1>'; echo 'Вітаємо вас :-)'; } Else {// ім'я і пароль користувача не вірні echo '<h1> Ідіть - Ви не зареєстровані! </ H1>'; echo 'Ви не дозволено тут перебувати.'; }?>

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

  1. У ньому підтримується тільки одна комбінація імені користувача та пароля, що зберігається в самому сценарії.
  2. Дані в сценарії зберігаються в незахищеному вигляді.
  3. Сценарій захищає тільки одну область.
  4. Пароль з форми передається у вигляді відкритого тексту.

Вирішення цих питань реалізується застосуванням декількох технологій. Перша з них - зберігати паролі в базі даних, а не в скрипті. Таке рішення ускладнить сценарій, але дозволить швидко проводити аутентифікацію великого числа користувачів з хорошою швидкістю. Нижче наводиться сценарій з використанням СУБД MySQL.

&lt;? Php // введення в роботу коротких імен змінних $ name = $ HTTP_POST_VARS [ 'name']; $ Password = $ HTTP_POST_VARS [ 'password']; if (! isset ($ HTTP_POST_VARS [ 'name']) &&! isset ($ HTTP_POST_VARS [ 'password'])) {// введення пароля та імені?> <h1> Введіть своє ім'я </ h1> Це секретна сторінка. <Form method = "post" action = "secretdb.php"> <table border = "1"> <tr> <th> Ваше ім'я </ th> <td> <input type = "text" name = "name" > </ td> </ tr> <tr> <th> Пароль </ th> <td> <input type = "password" name = "password"> </ td> </ tr> <tr> <td colspan = "2" align = "center"> <input type = "submit" value = "Log In"> </ td> </ tr> </ table> </ form> &lt;? php} else {// з'єднання з СУБД mysql $ mysql = mysql_connect ( 'localhost', 'webauth', 'webauth'); if (! $ mysql) {echo 'Немає з'єднання з базою даних.'; exit; } // вибір необхідної БД $ mysql = mysql_select_db ( 'auth'); if (! $ mysql) {echo 'База даних не обрана.'; exit; } // запит про базу даних для вибірки збігу $ query = "select count (*) from auth where name = '$ name' and pass = '$ password'"; $ Result = mysql_query ($ query); if (! $ result) {echo 'Не можу виконати запит.'; exit; } $ Count = mysql_result ($ result, 0, 0); // трасування результату echo "<br> name = $ name"; echo "<br> password = $ password"; echo "<br> result = $ result"; echo "<br> count = $ count"; if ($ count> 0) {// ім'я і пароль вірні echo '<h1> Ви в секретній області! </ h1>'; echo 'Тут ви дізнаєтеся всі секрети.'; } Else {// ім'я і пароль не вірні echo '<h1> Ідіть або буде викликана міліція! </ H1>'; echo 'Ви не авторизовані для перегляду цього ресурсу.'; }}?>

SQL-код, який реалізує базу даних, що бере участь в роботі скрипта, має вигляд:

create database auth; use auth; create table auth (name varchar (10) not null, pass varchar (30) not null, primary key (name)); insert into auth values ​​( 'user', 'pass'); insert into auth values ​​( 'testuser', 'test123'); grant select, insert, update, delete on auth. * to webauth @ localhost identified by 'webauth';

SQL-код, представлений в прикладі, створює базу даних auth, переходить до неї, а потім створює таблицю з полями name і pass (рисунок 1). В поля заносяться дані у вигляді записів user, pass, testuser і test123, що представляє собою попарно облікові записи і паролі, з якими можна потрапити в секретну область і побачити, що захищається інформацію. Потім користувачеві webauth @ localhost задаються привілеї select, insert, update, delete на базу auth і задається пароль webauth. Справа в тому, що з'єднання з базою і всі дії, визначені заданими правами з скрипта, будуть здійснюватися від імені користувача webauth @ localhost.

Малюнок 1.
Малюнок 2.

Скрипт працює наступним чином. Якщо не введені облікові запис або пароль, то користувачеві пропонується форма для їх введення (рисунок 3). Форма пропонує ввести ім'я та пароль, і при натисканні на "Log in" відправляє введене методом post на вхід скрипту secretdb.php. Якщо дані введені, то робиться спроба встановити з'єднання з базою даних. У разі невдачі виводиться повідомлення «Немає з'єднання з базою даних». При вдалому поєднанні робиться спроба вибору необхідної бази; якщо це не вийшло, виводиться повідомлення «База даних не обрана», якщо все пройшло добре, але запит до бази не пройшов, то буде висновок «Не можу виконати запит». В альтернативному випадку робиться вибірка за випадковим збігом імені та пароля. Якщо такий збіг є ($ count> 0), то друкується вміст секретної області, якщо збігів немає, то виводиться повідомлення: «Ідіть або буде викликана міліція! Ви не авторизовані для перегляду цього ресурсу ».

Малюнок 3.

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

У PHP є кілька таких функцій. Одна з найстаріших і найменш захищених - це crypt (). Є і більш надійні алгоритми, реалізовані в таких функціях, як md5 (). Якщо не потрібна сумісність зі старими версіями PHP, то можна використовувати алгоритми Secure Hash Algorithm (SHA-1).

PHP-функція sha1 () реалізує строгий односпрямований хеш-алгоритм. Прототип функції має вигляд:

string sha1 (string str [, bool raw_output])

Отримуючи на вхід рядок, функція повертає псевдослучайную 40-символьний рядок. Якщо в якості параметра raw_output передати true, то функція поверне 20-символьний рядок двійкових даних.

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

if ($ username == 'user' && $ password == 'pass') {// пароль збігається}

можна записати наступне:

if ($ username == 'user' && sha1 ($ password) == 'обчислене значення sha1 для password') {// паролі збігаються}

Єдине, що потрібно знати до використання функції sha1 () - це те, як виглядала сама рядок пароля.

Для зберігання паролів в базі даних MySQL можна використовувати функцію sha1 () або скористатися MySQL-функцією SHA1 (). При використанні останнього варіанту лістинг SQL-коду трохи видозміниться, а саме:

$ Query = select count (*) from auth where name = '$ name' and pass = sha1 ( '$ password')

Цей запит буде рахувати кількість рядків в таблиці auth, в яких значення поля name збігається зі значенням змінної $ name, а значення поля password співпаде зі значенням, отриманим від застосування функції SHA1 () до змінної $ password. З урахуванням того, що користувачі вибирають унікальні імена і паролі, результатом запиту може бути 1 або нуль. Потрібно пам'ятати, що хеш-функція повертає фіксоване значення в загальному випадку. У разі SHA1 () це 40 символів у вигляді рядка. Тому при проектуванні таблиці потрібно враховувати правильні розміри стовпців по ширині.

Захист декількох областей з даними

Іноді потрібно організувати багаторазове використання механізмів для захисту декількох областей даних, але зробити це буде вже важче, ніж для однієї області. HTTP-протокол не має механізму підтримки станів. Це означає, що не існує автоматичного зв'язку або асоціацію між послідовністю запитів, що надходять від одного і того ж об'єкта. Цим ускладнюється перенесення введених даних користувачем, -таких, як дані аутентифікації, зокрема, між кількома сторінками.

Найбільш простий спосіб захисту декількох сторінок - це використання механізму контролю доступу, який може надати Web-сервер. Можливий самостійний метод створення таких механізмів, але для цього потрібно включити частини приведеного раніше сценарію в код кожної сторінки, яка потребує захисту. За допомогою директив auto_prepend_file і auto_append_file потрібні файли можна помістити в початок і кінець кожного файлу в необхідних каталогах. Файл php.ini підтримує дві опції конфігурації - auto_prepend_file і auto_append_file. Налаштувавши їх потрібним чином, вони вкажуть на ті файли, які необхідні для завантаження до і після кожної сторінки відповідно наведеним операторам. Такі файли будуть вести себе так, як ніби вони включені за допомогою оператора include (). Якщо файл не існує, то буде видаватися попередження. Наприклад, в середовищі Windows їх використання буде мати вигляд:

auto_prepend_file = "C: /www/include/my_folder/my_file.php"

а в середовищі UNIX - відповідно:

auto_prepend_file = "/home/username/include/my_file.php"

При використанні цих директив відпадає необхідність застосування кожного разу операторів, подібних include (), include_once (), require (), require_once ().

Оператори include () і require () забезпечують повторне використання будь-якого типу коду. З їх допомогою завантажують файли прямо в PHP-сценарій. Такий файл може містити PHP-оператори, текст, HTML-дескриптори, PHP-функції або класи. Робота цих операторів схожа на серверні включення (server-side include - SSI), які підтримуються багатьма Web-серверами, а також операторами #include в мовах C і С ++.

Наведемо простий приклад використання такого оператора. Якщо припустити, що є файл з ім'ям use.php, який містить наступний код:

<Php echo 'Це простий PHP оператор. &lt;br /> '; ?>

і файл main.php, який містить код:

<Php echo 'Це головний файл. <br /> '; require ( 'use.php'); echo 'Тут сценарій завершується. , Br /> '; ?>

то при виклику файлу main.php в браузері відіб'ється:

простий PHP оператор. Це головний файл. Тут сценарій завершується.

Таким чином, при виконанні основного сценарію оператор require () замінюється вмістом запитаного файлу, після чого сценарій виконується.

Оператор include () практично нічим не відрізняється від розглянутого вище require (). Відмінність між ними полягає в тому, що при невдалому виконанні конструкція require () видає повідомлення про непоправною помилку, а include () - тільки попередження.

Конструкції виду include_once () і require_once () є варіаціями на тему include () і require (). Суть їх роботи полягає в гарантованому одноразовому включенні необхідного файлу в потік логіки виконання програми. Їх функціональність стає дуже затребуваною в разі використання бібліотечних функцій. Застосування цих операторів захищає логіку виконання програми від випадкового повторення включення однієї і тієї ж бібліотеки, що може привести до перевизначення функції та обов'язково викличе помилку.

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

Багато з наведених питань мають більш елегантне і різнопланове рішення із застосуванням базової аутентифікації протоколу HTTP, базової аутентифікації за допомогою PHP, за допомогою файлу .htaccess сервера Apache і модуля mod_auth_mysql. Ці питання будуть розглянуті в наступних статтях.

висновки

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

Здійснення підтвердження користувачем своєї особистості називається аутентифікацією. У загальному випадку, аутентифікація в Web зводиться до пред'явлення користувачам вимоги вводити свої унікальні імена і паролі. Вона служить для дозволу або заборони доступу до певних ресурсів, областям сайту або сервісів. Можлива необов'язкова аутентифікація або її використання в інших цілях, наприклад для персоналізації сайту.

Розглянуто програмні реалізації питань контролю доступу до ресурсів, що захищаються. Наведено скрипт, який працює спільно з HTML-формою і реалізує такий контроль.

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

Наведено SQL-код для відповідної реалізації такої бази даних, розглянуто його структура, наведені знімки екрана.

Описано нюанси можливого захисту декількох об'єктів (сторінок). Пояснені питання застосування директив auto_prepend_file і auto_append_file і налаштувань файлу php.ini. Описана функціональність роботи операторів include (), include_once (), require (), require_once ().

<< Попередня стаття

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

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

Com/developerworks/ru/library/?
Lt;?
Php // Короткі імена змінних @ $ name = $ _POST [ 'name']; @ $ Password = $ _POST [ 'password']; if (empty ($ name) || empty ($ password)) {// Введення Відвідувачем імені та пароля?
Lt;?
Isset ($ HTTP_POST_VARS [ 'password'])) {// введення пароля та імені?
Lt;br /> '; ?
Br /> '; ?
Категории
  • Биология
  • Математика
  • Краеведению
  • Лечебная
  • Наука
  • Физике
  • Природоведение
  • Информатика
  • Новости

  • Новости
    https://banwar.org/
    Наша взаимовыгодная связь https://banwar.org/. Запустив новый сайт, "Пари Матч" обещает своим клиентам незабываемый опыт и возможность выиграть крупные суммы.


    Наши клиенты
    Клиенты

    Быстрая связь

    Тел.: (044) 587-84-78
    E-mail: [email protected]

    Имя:
    E-mail:
    Телефон:
    Вопрос\Комментарий: