HTTP-аутентификация

Простой способ защиты веб-страницы заключается в использовании HTTP-аутентификации с проверкой имени пользователя и его пароля в специальном диалоговом окне.

Только после ввода правильных данных будет предоставлен доступ к защищаемой странице. Вы можете предоставить такой доступ ограниченному количеству пользователей или только себе!

С помощью РНР мы считываем имя пользователя и его пароль, которые он ввел в окне диалога аутентификации. Они сохранены в суперглобальном массиве $_SERVER. Суперглобальная переменная $_SERVER['PHP_AUTH_USER'] содержит имя пользователя. Переменная $_SERVER['PHP_AUTH_PW'] содержит пароль. На основании обработки результатов можно принять решение либо о предоставлении этому пользователю доступа к защищенной странице, либо об отклонении запроса.

Если данные были введены неправильные, то выводится сообщение о том, что пользователь пытается получить доступ к защищенной странице.

Необязательно запрашивать и имя и пароль, можно обойтись, например, только паролем.

НТТР-аутентификация включает обмен информацией между браузером и веб-сервером с использованием НТТР-заголовков.

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

Работа с HTTP-заголовками в PHP

НТТР-заголовки тщательно следят за тем, какая информация и как проходит в прямом и обратном направлении между браузером и веб-сервером. Индивидуальный НТТР-заголовок чаще всего состоит из пары "имя/значение", которая определяет конкретные сведения - такие, например, как формат содержания веб-страницы. Определенная группа НТТР-заголовков посылается на сервер как часть запроса веб-страницы, а затем другая группа возвращается сервером как часть ответа на этот запрос.

Используя РНР, вы можете очень легко работать с заголовками, присланными сервером, что дает возможность выполнять задачи, управляемые заголовками, к которым относится и НТТР-аутентификация. Встроенная функция header() может быть использована в РНР-сценарии для передачи заголовка с сервера браузеру.


header('content-туре: text/html');

Функция header() немедленно отправляет НТТР-заголовок с сервера и должна вызываться до того, как само содержание страницы будет отправлено браузеру. Это требование является очень строгим. Если хотя бы один символ или даже пробел будет отослан до отправки НТТР-заголовка, браузер отбросит его и выведет сообщение об ошибке. Поэтому вызов функции должен предшествовать любому НТМL-коду в РНР-сценарии:


<?php
    header('content-туре: text/html');
?>

Нельзя вставлять пробел перед тегом <?php, а внутри тега уже можно.

Примеры с заголовками.

Пример с HTTP-заголовком места расположения location header переадресовывает текущую страницу на заданную.


header('Location: http://www.yoursite.com/page.php');

Можно переадресовать текущую страницу на сразу, а через пять секунд с помощью заголовка обновления refresh header:


<?php
    header('Refresh:5; url=http://www.yoursite.com/page.php');
    echo 'Через 5 секунд вы будете перенаправлены на другую страницу';
?>

Заголовок формата содержания позволяет контролировать тип формата содержания, передаваемого сервером. Например, мы хотим объявить, что содержание выводится в формате обычного текста вместо HTML:


header('Content-Type: text/plain');
echo '<b>Этот текст</b> не будет выделен жирным шрифтом';

Вернёмся к аутентификации.

Чтобы инициировать аутентификацию, требуются два НТТР-заголовка, которые выполняют две специфические задачи:

HТТР/1.1 401 unauthorized - заголовок даёт браузеру понять, что пользователю не предоставляется доступ к защищённой странице.

WWW-Authenticate: Basic rеаlm="Какой-то текст" - заголовок просит браузер попытаться аутентифицировать пользователя, предложив ему ввести имя и пароль. Basic realm (Защищенная область) является идентификатором конкретной аутентификации и появляется в окне диалога аутентификации.

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

Если пользователь введёт правильные данные, то откроется нужная страница.

Если пользователь введёт неправильное имя или пароль и нажмёт кнопку "Войти", сервер сообщит браузеру, что необходимо запросить данные повторно. И так будет продолжаться до тех пор, пока не введут правильные данные или не нажмут кнопку "Отмена".

Если пользователь нажмет кнопку "Отмена", чтобы прекратить аутентификацию, сервер отправит браузеру страницу с сообщением об отклонении запроса на доступ, и ничего больше. Сообщение об отклонении запроса на доступ контролируется РНР-кодом, который тесно связан с НТТР-заголовками. Этот код выводит сообщение и немедленно прекращает выполнение сценария.

Предположим, доступ к странице разрешен пользователю с именем user и паролем pass. Напишем следующий код:


<?php
    // Имя пользователя и его пароль для аутентификации
    $username = 'user';
    $password = 'pass';
    
    if(!isset($_SERVER['PHP_AUTH_USER']) || 
       !isset($_SERVER['PHP_AUTH_PW']) ||
       ($_SERVER['PHP_AUTH_USER'] != $username) ||
       ($_SERVER['PHP_AUTH_PW'] != $password)) {
           // Имя пользователя не действительны для отправки HTTP-заголовков,
           // подтверждающих аутентификацию
           header('HTTP/l.1 401 Unauthorized');
           header('WWW-Authenticate: Basic rеаlm="Страница аутентификации"'); 
           exit('Извините, вы должны ввести правильные имя и пароль');
       }
?>

Напомню, что код должен размещаться в начале страницы. Теперь у вас будет выводиться диалоговое окно.

Этот кусок кода удобно сохранить в отдельном файле, например, auth.php и размещать в нужных страницах сайта через reqiure_once('auth.php'). При этом область безопасности у них едина, поэтому вводить данные нужно только один раз. На другой странице с этой же аутентификацией заново пароль вводить не придётся. Просто укажите одно и то же значение basic realm HTTP-заголовков аутентификации для всех страниц сайта.

Продолжение следует.

Реклама