Контакти

Чистий auth php. HTTP Встановлення захисту на сторінку за допомогою MySQL і PHP. Приклад #2 Приклад Digest HTTP-автентифікації

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

Закрити таку сторінку можна кількома способами, що взаємодоповнюють один одного:

  1. Захист паролем (логін/пароль) за допомогою змінних $_SERVER["PHP_AUTH_USER"]і $_SERVER["PHP_AUTH_PW"].
  2. Захист по IPадресою клієнта за допомогою змінної $_SERVER["REMOTE_ADDR"].
  3. Захист по MACадресу в локальних мережах (додатково до захисту IP).

Розберемо спочатку перший спосіб, який є основним. Він дозволяє закрити доступ до сторінки за логіном та паролем, таким чином доступ можуть отримати тільки люди. знаючі логінта пароль. До того ж їх можна розділяти за цією ознакою та видавати відповідно різну інформаціюдля кожного. Реалізується за допомогою видачі спеціальних полів у заголовку протоколу HTTP. Створимо функцію auth_send():

" ,"

Помилка автентифікації

" ,"

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

" ,""; exit; ); ?>

Цю функцію повідомляє браузеру про те, що для доступу потрібна авторизація за логіном та паролем. І видає також сторінку в HTMLдля користувача.

" ,"

Ласкаво просимо!

" ,"

Ви зайшли за логіном ",$auth_user," та паролю ",$auth_pass,".

" ,"

"; ?>

Код перевірки логіну та пароля не надто складний у даному випадку, тому що реалізований для однієї людини. Логіка роботи проста, якщо немає змінної $_SERVER["PHP_AUTH_USER"]і $_SERVER["PHP_AUTH_PW"]або їх значення не збігаються з потрібними, то викликаєте функцію auth_send(). Не забувайте, що в ній наприкінці викликається exitтому виконання програми припиняється.

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

Ваш IP не знайдено!!!"; exit; ); ?>

Тут у рядку $allowed_ipsчерез пропуск вказано IPадреси, яким дозволено доступ. Далі отримуємо масив за допомогою explode()і робимо пошук адреси клієнта з $_SERVER["REMOTE_ADDR"]. Я для пошуку застосував функцію array_search(), так як невірняка її код реалізований на Сі буде працювати дещо швидше, ніж те, що ми можемо написати на PHPза допомогою циклів forабо foreach. Але швидкість тут не головне:)

І останній ступінь захисту це перевірка MACадреси. Вона відноситься до розряду параноїдальних і її варто використовувати, якщо ви отримуєте доступ з локальної мережіта дані, які ви захищаєте дійсно дуже важливі. Я поки що реалізував цю перевірку тільки на системі Linux, Через відносну простоту реалізації. Але Ви можете спробувати її реалізувати під будь-яку іншу платформу. Пишемо функцію:

Як лінуксоїди вже зрозуміли вона заснована на ARPтаблиці системи, доступ до якої можна отримати за допомогою файлу /proc/net/arp. Функція шукає по рядках необхідний IPадресу і повертає її MACадреса:

Ваш IP=192.168.10.15 та MAC=00:04:31:E4:F8:37

В системі Windowsможливо також є якісь способи отримати MACпростіше, але з тих, що реально працюють, це висновок ARPтаблиці системи командою:

C:\WINDOWS\>arp -a Інтерфейс: 192.168.10.15 on Interface 0x1000003 Адреса IP Фізична адреса Тип 192.168.10.1 00-50-22-b0-6a-aa динамічний 192.168.10.-9 e8 динамічний 192.168.10.3 00-04-61-9e-26-09 динамічний 192.168.10.5 00-0f-38-6a-b1-18 динамічний

Реалізувати захист на основі цієї адреси Ви зможете самі, якщо Вам це дійсно треба:) Але пам'ятайте, що якщо у Вас в мережі некероване обладнання без можливості прив'язування MACадреси до порту, цей захист може не спрацювати, тому що можна підробити всі Ваші ідентифікаційні дані, що використовуються для захисту (логін, пароль, IP та MAC адреса).



Вчимося робити просту аутентифікацію користувачів на сайті. На сайті можуть бути сторінки тільки для авторизованих користувачів і вони будуть повноцінно функціонувати, якщо додати до них блок аутентифікації. Щоб створити, потрібна база даних MySQL. Вона може мати 5 колонок (мінімум), а може і більше, якщо ви хочете додати інформацію про користувачів. Назвемо базу даних "Userauth".

Створимо в ній такі поля: ID для підрахунку числа користувачів, UID для унікального ідентифікаційного номеракористувача, Username для імені користувача, Email для його адреси електронної поштита Password для пароля. Ви можете використовувати для авторизації користувача і вже наявну базу даних, тільки, як і у випадку з новою базою даних, створіть в ній наступну таблицю.

Код MySQL

CREATE TABLE `users` (`ID` int (11) NOT NULL AUTO_INCREMENT, `UID` int (11) NOT NULL, `Username` text NOT NULL, `Email` text NOT NULL, `Password` text NOT NULL, PRIMARY KEY (`ID`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Тепер створимо файл "sql.php". Він відповідає за підключення до бази даних. Цей код, по-перше, створює змінні для сервера та користувача, коли він підключається до сервера. По-друге, він вибере базу даних, у разі "USERAUTH". Цей файл потрібно підключити до "log.php" і "reg.php" для доступу до бази даних.

Код PHP

//Ваше ім'я користувача MySQL$pass = "redere"; //пароль $conn = mysql_connect ($server, $user, $pass); //з'єднання з сервером$ db = mysql_select_db ("userauth", $ conn); //Вибір бази даних if (!$db) ( //якщо не може вибрати базу даних echo "Вибачте, помилка:(/>"); //Показує повідомлення про помилку exit(); //Дозволяє працювати іншим скриптам PHP } ?>

Далі сторінка входу, хай вона називається "login.php". По-перше, вона перевіряє введені дані про наявність помилок. Сторінка має поля для імені користувача, пароля, кнопку надсилання та посилання для реєстрації. Коли користувач натисне кнопку «Вхід», форма буде оброблена кодом із файлу "log.php", а потім відбудеться вхід до системи.

Код PHP

0) { //якщо є помилки сесії$err = "

"; //Start a table foreach ($_SESSION["ERRMSG"] as $msg) ( //Розпізнавання кожної помилки$err .= " "; //запис їх у змінну) $err .= "
" . $msg . "
"; //закриття таблиці unset ($_SESSION["ERRMSG"]); //Видалення сесії } ?> форма входу
Ім'я користувача
Пароль
Реєстрація


Потім пишемо скрипт для входу до системи. Назвемо його "log.php". Він має функцію для очищення вхідних даних від ін'єкцій SQL, які можуть зіпсувати ваш скрипт. По-друге, він отримує дані форми та перевіряє їх на правильність. Якщо вхідні дані правильні, скрипт надсилає користувача на сторінку авторизованих користувачів, якщо ні – встановлює помилки та надсилає користувача на сторінку входу.

Код PHP

//початок сесії для запису function Fix($str) ( //очистка полів $str = trim($str); if (get_magic_quotes_gpc()) ( $str = stripslashes ($str); ) //масив для збереження помилок$errflag = false; //прапор помилки $username = Fix($_POST["username"]); //Ім'я користувача$password = Fix($_POST["password"]);//пароль ) //перевірка пароля if ($password == "") ( $errmsg = "Password missing"; //помилка $errflag = true ; //піднімає прапор у разі помилки ) //якщо прапор помилки піднято, направляє назад до форми реєстрації //записує помилки session_write_close(); //закриття сесії //перенаправлення exit(); ) //запит до бази даних$qry = "SELECT * FROM `users` WHERE `Username` = "$username" AND `Password` = "" . md5 ($password) . """; $result = mysql_query ($qry); //перевірка, чи був запит успішним (чи є дані щодо нього) if (mysql_num_rows ($result) == 1) ( while ($row = mysql_fetch_assoc ($result))) ( $_SESSION["UID"] = $row["UID"]; //отримання UID з бази даних та розміщення його в сесію$_SESSION["USERNAME"] = $username; //встановлює, чи збігається ім'я користувача із сесійним session_write_close(); //закриття сесії header("location: member.php"); //перенаправлення) ) else ( $_SESSION["ERRMSG"] = "Invalid username or password"; //помилка session_write_close(); //закриття сесії header("location: login.php"); //перенаправлення exit(); ) ?>

Зробимо сторінку реєстрації, назвемо її "register.php". Вона схожа на сторінку входу, тільки має на кілька полів більше, а замість посилання на реєстрацію – посилання на login.php на випадок, якщо користувач вже має обліковий запис.

Код PHP

0) { //якщо є помилки сесії$err = "

"; //початок таблиці foreach ($_SESSION["ERRMSG"] as $msg) ( //встановлює кожну помилку$err .= " "; //записує їх у змінну) $err .= "
" . $msg . "
//кінець таблиці unset ($_SESSION["ERRMSG"]); //знищує сесію } ?> Форма регістрації
Ім'я користувача
E-mail
Пароль
Повтор пароля
У мене є обліковий запис


Тепер зробимо скрипт реєстрації у файлі "reg.php". У нього буде включено "sql.php" для підключення до бази даних. Використовується та сама функція, що й у скрипті входу для очищення поля введення. Встановлюються змінні для можливих помилок. Далі – функція створення унікального ідентифікатора, який ніколи раніше не надавалися. Потім витягуються дані з форми реєстрації та перевіряються. Відбувається перевірка, що адреса електронної пошти вказана у потрібному форматі, а також, чи правильно вказано пароль. Потім скрипт перевіряє, чи немає у базі даних користувача з таким самим ім'ям, і, якщо є, повідомляє про помилку. І, нарешті, код додає користувача до бази даних.

Код PHP

//початок сесії для запису function Fix($str) ( //очистка полів $str = @trim($str); if (get_magic_quotes_gpc()) ( $str = stripslashes ($str); ) return mysql_real_escape_string($str); ) $ errmsg = array (); //масив для зберігання помилок$errflag = false; //прапор помилки $UID = "12323543534523453451465685454";//унікальний ID $username = Fix($_POST["username"]); //Ім'я користувача$email = $_POST["email"]; //Email $password = Fix($_POST["password"]);//пароль $rpassword = Fix($_POST["rpassword"]);//повтор пароля //перевірка імені користувача if ($username == "") ( $errmsg = "Username missing"; //помилка $errflag = true ; //піднімає прапор у разі помилки) //перевірка Email if(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@+(\.+)*(\.(2,3) ))$", $email)) ( //має відповідати формату: [email protected]$errmsg = "Invalid Email"; //помилка $errflag = true; //піднімає прапор у разі помилки } //перевірка пароля if ($password == "") ( $errmsg = "Password missing"; //помилка $errflag = true ; //піднімає прапор у разі помилки } //перевірка повтору пароля if ($rpassword == "") ( $errmsg = "Repeated password missing";//помилка $errflag = true ; //піднімає прапор у разі помилки } //перевірка валідності пароля if (strcmp($password, $rpassword) != 0) ( $errmsg = "Passwords do not match";//помилка $errflag = true ; //піднімає прапор у разі помилки } //перевірка, чи вільне ім'я користувача if ($username != "") ( $qry = "SELECT * FROM `users` WHERE `Username` = "$username""; //запит до MySQL $result = mysql_query ($qry); if ($result) ( if (mysql_num_rows ($result) > 0) ( //якщо ім'я вже використовується$errmsg = "Username already in use"; //повідомлення про помилку$errflag = true; //піднімає прапор у разі помилки) mysql_free_result ($result); ) //якщо дані не пройшли валідацію, направляє назад до форми реєстрації if ($errflag) ( $_SESSION["ERRMSG"] = $errmsg; //повідомлення про помилку session_write_close(); //закриття сесії header("location: register.php"); //перенаправлення exit(); ) //додавання даних у базу$qry = "INSERT INTO `userauth`.`users`(`UID`, `Username`, `Email`, `Password`) VALUES("$UID","$username","$email","" . md5 ($password) ."")"; $result = mysql_query ($qry); //перевірка, чи був успішним запит на додавання if ($result) ( echo "Дякую Вам за реєстрацію, " .$username . ". Будь ласка, заходьте сюди"; exit (); ) else ( die ("Помилка, зверніться пізніше"); ) ?>

Ще потрібно зробити скрипт для виходу користувача із системи. Він припиняє сесію для користувача з цим унікальним ідентифікатором та ім'ям, а потім перенаправляє користувача на сторінку входу до системи.

Код PHP

І, нарешті, скрипт "auth.php" можна використовувати, щоб зробити сторінки доступними лише авторизованих користувачів. Він перевіряє дані входу та, якщо вони вірні, дозволяє користувачеві переглядати сторінки, а якщо ні, просить авторизуватися. Крім того, якщо хтось спробує зламати сайт створивши одну із сесій, її буде перервано, як у загальному випадку.

Код PHP

Одна з умов у коді вище є предметом питання у .

Наступний код потрібно вставити на сторінку для авторизованих користувачів, вона називається, наприклад, "member.php", а у Вас може називатися як завгодно.

Код PHP

Вам дозволено доступ до цієї сторінки. Вийти ( )

Аутентифікація користувачів готова!

Ця стаття застаріла.

Ця стаття написана на послуги Віртуальний хостинг, яка вважається застарілою з 1 червня 2019 року.

Актуальну послугу хостингу можна замовити на нашому сайті

HTTP-авторизація засобами PHP

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

Для встановлення справжності HTTP забезпечує простий механізм "виклик-відповідь" (challenge-response), який може використовуватися сервером для виклику (challenge) клієнтського запиту, а клієнтом для надання розпізнавальної інформації (authentication information). Найбільш поширеною схемою авторизації є " Базова схемавстановлення справжності" (Basic Authentication Scheme).

"Базова" схема встановлення автентичності полягає в тому, що агент користувача (браузер) повинен підтвердити свою справжність за допомогою ідентифікатора користувача (імені користувача) та пароля для кожної захищеної області (realm). Сервер обслуговує запит, якщо він може перевірити правильність ідентифікатора користувача та його пароля для цієї захищеної області. Жодних додаткових розпізнавальних параметрів у цій схемі не передбачено.

Після отримання запиту на ідентифікацію, сервер відповідає викликом (challenge), подібним до наступного:

WWW-Authenticate: Basic realm="Restricted Area" HTTP/1.1 401 Unauthorized

Тут "Restricted Area" - рядок, призначений сервером, який ідентифікує захищену область запитуваного URI (Request-URI). Говорячи простою мовою- Ім'я захищеної області.

Далі, щоб отримати права доступу, агент користувача (браузер) відправляє на сервер ідентифікатор користувача (ім'я користувача) та пароль, розділені одним символом двокрапки (":"), всередині base64-кодованого рядка рекомендацій (credentials):

Basic-credentials = "Basic" basic-cookie

Тут

  • basic-cookie -- base64-кодований рядок, що містить user-pass
  • user-pass - рядок виду "userid:password"
  • userid - текст, який не містить символів ":"
  • password - текст

Зверніть увагу, що ім'я користувача та пароль є чутливими до регістру. Тобто, наприклад, User і user - два різні імені користувача.

HTTP-авторизація та PHP

Можливо вам вже доводилося використовувати Basic-схему авторизації спільно з PHP і вам відомо, що суть методу зводиться до того, щоб отримати від веб-сервера змінні PHP_AUTH_USER і PHP_AUTH_PW , що визначають відповідно ім'я користувача та пароль, та якимось чином обробити їх усередині PHP -Скрипта. Але зауважимо, що цей спосіб ефективний лише тоді, коли PHP функціонує як модуль веб-сервера Apache. На нашому хостингу PHP працює в режимі CGI/FastCGI і описаний вище метод не працюватиме, оскільки змінні PHP_AUTH_USER і PHP_AUTH_PW не будуть передаватися всередину скрипта.

Однак існує спосіб, який дозволяє обійти це обмеження та передати значення імені користувача та пароля, які вводить користувач, всередину PHP-скрипту. Для цього використовуються засоби mod_rewrite - модуля веб-сервера Apache. Правила, які ми будемо використовувати, мають такий вигляд:

RewriteCond %(HTTP:Authorization) ^Basic.* RewriteRule (.*) index.php?authorization=%(HTTP:Authorization)

За запитом через HTTP до файлу sitename.ru/www/index.php, це правилобуде передавати GET-запит вміст непустого поля Authorization в параметр authorization. Якщо ми засобами PHP подивимося на вміст змінної $_GET["authorization"], то побачимо описуваний вище basic-credentials - рядок виду:

Preg_match("/^Basic\s+(.*)$/i", $_GET["authorization"], $user_pass); list($user,$pass)=explode(":",base64_decode($user_pass));

Таким чином ми отримаємо дві змінні - $user і $pass, що містять відповідно ім'я користувача та пароль. Тепер, як згадувалося вище, їх потрібно лише якось обробити - наприклад, порівняти з аналогічними змінними з бази даних або з файлу з обліковими записами користувачів.

Висновок

Розглянутий у цій статті метод успішно працюватиме не тільки на нашому хостингу, але і скрізь, де PHP працює в режимі CGI/FastCGI і як веб-сервер використовується Apache + mod_rewrite.

Вихідні тексти робочих прикладів можна знайти в Додатку до цієї статті.

Додаток. Початкові тексти скрипту

Початковий текст файлу.htaccess

RewriteEngine on RewriteBase / RewriteCond %(HTTP:Authorization) ^Basic.* RewriteRule (.*) index.php?authorization=%(HTTP:Authorization)

Початковий текст PHP-скрипту

$authenticated=0; if(isset($_GET["authorization"])) ( if(preg_match("/^Basic\s+(.*)$/i", $_GET["authorization"], $user_pass)) ( list($user ,$pass)=explode(":",base64_decode($user_pass)); // Перевірка коректності введених реквізитів доступу if($user=="user" && $pass=="password") ( $authenticated=1; ) ) ) if($authenticated) ( // Авторизація успішно пройдено echo("user: ".$user."
pass: ".$pass); ) else ( header("WWW-Authenticate: Basic realm="Restricted Area""); header("HTTP/1.1 401 Unauthorized"); echo("Access denied."); ) Буквально вчора я вирішив приступити до розробки особистого кабінетуодного безіменного сайту. Переді мною постало питання з приводу зовнішнього виглядуформи авторизації, мені, відверто, не хотілося займатися дизайном форми, робити підказки, та й в цілому приділяти величезну увагу формі. Я здуру кинувся шукати готові рішення, побачив досить несмачні форми. Думав підшукати якийсь готовий компонент, готове розширення, але здебільшого вони розчарували мене. Блукаючи форумами, мені здалося цікавим розіграти карту з HTTP Authentication: Basic. Я вирушив читати мануал, раніше був недостатньо обізнаний про даному способі. Далі й почалися проблеми.

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

RewriteCond %(HTTP:Authorization) ^Basic.* RewriteRule (.*) index.php?authorization=%(HTTP:Authorization)

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

Hello ($_SERVER["PHP_AUTH_USER"]).

"; echo"

Ви ввели пароль ($_SERVER["PHP_AUTH_PW"]).

"; } ?>

Чудово працює, а переді мною була мета реалізувати авторизацію за допомогою використання вже існуючих кодових слів, що розташовані в таблиці.

get("user") === null) ( $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select("*"); $query->from ("#__beda_users"); $query->where("codeword = ".$query->quote($_SERVER["PHP_AUTH_PW"]))); if($res = $db->setQuery($query)-> loadAssoc()) ( $session->set("user", $res); ) else ( header("WWW-Authenticate: Basic realm="My Realm""); header("HTTP/1.0 401 Unauthorized"); ) ) else ( //Нам би сюди ) ) ?>

Працює, значення змінюються, сесія створюється. Чудово, алеу випадку з кліком на відміну, значення начхати хотіли, що ти скасував, після оновлення сторінки, повертаються на місце. Я вирішив, що боротися слід з цим через unset. Я додав рядок.

If($res = $db->setQuery($query)->loadAssoc()) ( $session->set("user", $res); ) else ( unset($_SERVER["PHP_AUTH_USER"], $_SERVER ["PHP_AUTH_PW"]); header("WWW-Authenticate: Basic realm="My Realm"");

Я намагався впоратися з цими змінними, але все глибше йшов у нікуди. Влаштовував і перевірку існування сесії, але марно. До того ж мені потрібно було зробити завершення сесії, що зі слів форумчан мало можливе. Докопав до істини використання адреси виду login: [email protected]/. Чудово, змінні змінилися $_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]. На жаль, це не стало моїм остаточним рішенням, оскільки після закінчення часу сесії $_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]продовжували виконувати. Як і після примусового надання $session->set("user", null). Я в нестямі від гніву, але знав, що не пробачу собі, якщо дозволю відступитися. Я написав окрему умову для перевірки на логаут.

If($_SERVER["PHP_AUTH_USER"]=="logout")( $session->set("user", null); header("Refresh: 0;URL="); ) if(!isset($_SERVER[ "PHP_AUTH_PW"])) ( header("WWW-Authenticate: Basic realm="My Realm""); ($session->get("user") === null) ( $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select("*"); $query->from("#__beda_users"); $query->where("codeword = ".$query->quote($_SERVER["PHP_AUTH_PW"]))); if($res = $db->setQuery( $query)->loadAssoc()) ( $session->set("user", $res); ) else ( unset($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"]); header("WWW -Authenticate: Basic realm="My Realm""); header("HTTP/1.0 401 Unauthorized");

Умова спрацювала, але після перезавантаження сторінки, коли з'являється вікно з вимогою ввести Ім'я користувачаі пароль, воно їх прийняло, та після оновлення сторінки, він запропонував мені ще раз ввести пароль, натисніть «Скасувати», $_SERVER["PHP_AUTH_USER"] буде logout. Оновлю значення, він надасть їх. А натисніть на відміну від поверне колишні значення. Біда.

Зрештою, остаточне рішення виглядає так.

$session = JFactory::getSession(); function http_auth($session)( $session->set("user", null); unset($_SERVER["PHP_AUTH_PW"], $_SERVER["PHP_AUTH_USER"])); header("WWW-Authenticate: Basic realm=" Auth""); header("HTTP/1.0 401 Unauthorized"); : 0;URL="); ) if($session->get("user") === null)( if(!isset($_SERVER["PHP_AUTH_PW"]))( http_auth($session); ) else ( $pw = $_SERVER["PHP_AUTH_PW"]; $db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select("*"); $query->from ("#__beda_users"); $query->where("codeword = ".$query->quote($pw)); if($res = $db->setQuery($query)->loadAssoc())( $session->set("user", $res); ) else ( http_auth($session); ) ) ) else ( if(!isset($_SERVER["PHP_AUTH_PW"]))( http_auth($session); ) )

Щоб надіслати браузеру клієнта повідомлення "Authentication Required", що у свою чергу призведе до появи діалогового вікна для введення імені користувача та пароля. Після того як клієнт ввів своє ім'я та пароль, скрипт буде викликаний повторно, але вже з визначеними змінними PHP_AUTH_USER , PHP_AUTH_PW і AUTH_TYPE , які містять ім'я користувача, пароль і тип аутентифікації. Ці змінні можна знайти в масиві $_SERVER і $HTTP_SERVER_VARS . В даний час підтримується лише "Basic"-автентифікація. Також ви можете ознайомитись з більш детальним описомфункції header() .

Приклад фрагмента скрипта, який змушує клієнта авторизуватись для перегляду сторінки:

Приклад HTTP-автентифікації

if (!isset($_SERVER ["PHP_AUTH_USER"])) (
header ( "WWW-Authenticate: Basic realm="My Realm"");

echo "Текст, який надсилається в тому випадку,
якщо користувач натиснув кнопку Cancel"
;
exit;
) else (
echo
"

Hello ($_SERVER["PHP_AUTH_USER"]).

" ;
echo "

Ви ввели пароль ($_SERVER["PHP_AUTH_PW"]).

"
;
}
?>

Примітка щодо сумісності:Будьте особливо уважні під час вказівки HTTP-заголовків. Для того, щоб гарантувати максимальну сумісність із найбільшою кількістю різних клієнтів, слово "Basic" має бути написано з великої літери "B", регіон (realm) повинен бути взятий у подвійний (не одинарні!) лапки, і рівно одна пробіл повинен передувати коду 401 у заголовку HTTP/1.0 401 .

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

Ви можете переглянути особливості роботи браузера Internet Explorer. Він дуже вимогливий до параметра заголовків, що передаються. Вказівка ​​заголовка WWW-Authenticateперед відправкою статусу HTTP/1.0 401 є невеликою хитрістю.

Починаючи з PHP 4.3.0, для того, щоб запобігти написанню будь-ким скрипту, що розкриває пароль до сторінки, яка використовує зовнішню автентифікацію, змінні PHP_AUTH не встановлюються у випадку, якщо дана сторінкавикористовує зовнішню автентифікацію та встановлений безпечний режим. Незважаючи на це, змінна REMOTE_USER може використовуватися для автентифікації користувача, що пройшов зовнішню автентифікацію. Таким чином, ви завжди можете скористатися змінною $_SERVER["REMOTE_USER"] .

Примітка: PHP використовує вказівку директиви AuthType для вказівки того, використовується зовнішня автентифікація чи ні.

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

І Netscape Navigatorта Internet Explorer очищають кеш аутентифікації поточного вікна для заданого регіону (realm) при отриманні від сервера. Це може використовуватися для реалізації примусового виходу користувача та повторного відображення діалогового вікна для введення імені користувача та пароля. Деякі розробники використовують це для обмеження авторизації за часом або надання кнопки "Вихід".

Приклад HTTP-автентифікації з примусовим введенням нової париЛогін: Пароль

function authenticate () (
header ( "WWW-Authenticate: Basic realm="Автоматичне тестування системи"");
header ("HTTP/1.0 401 Unauthorized");
echo "Ви повинні ввести коректний логін та пароль для отримання доступу до ресурсу \n";
exit;
}

If (!isset($_SERVER ["PHP_AUTH_USER"]) ||
($_POST [ "SeenBefore" ] == 1 && $_POST [ "OldAuth" ] == $_SERVER [ "PHP_AUTH_USER" ]))) (
authenticate ();
}
else (
echo
"

Ласкаво просимо: ($_SERVER["PHP_AUTH_USER"])
" ;
echo "Попередній логін: ($_REQUEST["OldAuth"])";
echo "

\n";
echo "\n";
echo "\n";
echo "\n";
echo "

\n" ;
}
?>

Ця поведінка не регламентується стандартами HTTP Basic-аутентифікації, отже ви не повинні залежати від цього. Як показали тести, браузер Lynx не очищає кеш авторизації при отриманні від сервера статусу 401, і, натиснувши послідовно "Back", а потім "Forward", можна відкрити таку сторінку, за умови, що необхідні атрибути авторизації не змінилися. Однак, користувач може натиснути клавішу "_", щоб очистити кеш аутентифікації.

Також слід зауважити, що до версії PHP 4.3.3, HTTP-автентифікація не працювала на серверах під керуванням Microsoft IIS, якщо PHP було встановлено як CGI-модуль, через деякі обмеження IIS. Для того, щоб досягти коректної роботи в PHP 4.3.3+, ви повинні відредагувати конфігураційну налаштування IISпід назвою "Directory Security". Клацніть на написі "Edit" і встановіть опцію "Anonymous Access", усі інші поля мають залишитися невідзначеними.

Ще одне обмеження, якщо ви використовуєте IIS за допомогою ISAPI: змінні PHP_AUTH_* не визначені, але в той же час доступна змінна HTTP_AUTHORIZATION . приклад коду, який ви могли б використовувати: list($user, $pw) = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6))));

Примітка щодо IIS:Для того, щоб HTTP-автентифікація коректно працювала в IIS, у конфігурації PHP опція cgi.rfc2616_headers повинна бути встановлена ​​значенням 0 (за замовчуванням).

Увага:У випадку, якщо використовується захищений режим, UID поточного скрипту буде додано до realm-частина заголовка WWW-Authenticate.



<<< Назад Зміст Вперед >>>
Є ще питання чи щось незрозуміло - ласкаво просимо на наш


Сподобалася стаття? Поділіться їй