Материал предоставлен https://it.rfei.ru

НТТР-аутентификация

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

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

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

Пользователи при вводе в браузер URL-адреса или при переходе по ссылке видят окно с требованием пройти аутентификацию «Требуется аутентификация», в котором выводится приглашение заполнить два поля: для имени пользователя и пароля (на рисунке показано, как это выглядит в браузере Firefox).

Приглашение войти в систему в режиме НТТР-аутентификации

Код, обеспечивающий аутентификацию, показан в примере.

Пример. РНР-аутентификация

<?php
if (isset($_SERVER['PHP_AUTH_USER']) &&
    isset($_SERVER['PHP_AUTH_PW' ]))
{
echo "Добро пожаловать, пользователь: " . $_SERVER['PHP_AUTH_USER']
" , имеющий пароль: " . $_SERVER['PHP_AUTH_PW'];
   }
else
{
   headerCWWW-Authenticate: Basic realm="Restricted Section");
   header('HTTP/1.0401 Unauthorized');
   die("Пожалуйста, введите имя пользователя и пароль");
}
?>

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

Если какое-нибудь из значений отсутствует, значит, пользователь еще не прошел аутентификацию, и появляющееся окно с приглашением, показанное на рисунке выше, отображается с выдачей следующего заголовка, составной частью которого является имя защищенного раздела — Basic realm:

WWW-Authenticate: Basic realm="Restricted Section"

Если пользователь заполнит поля, PHP-программа будет запущена снова с самого начала. Но если пользователь щелкнет на кнопке Отмена (Cancel), программа перейдет к следующим двум строкам, которые отправят следующий заголовок и сообщение об ошибке:

HTTP/1.0401 Unauthorized

Инструкция die выведет следующий текст: «Пожалуйста, введите имя пользователя и пароль» (см. следующий рисунок).

Результат щелчка на кнопке Отмена (Cancel)

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

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

Пример. PHP-аутентификация с проверкой вводимой информации

<?php
$username = 'admin';
$password = 'letmein';

if (isset($_SERVER['PHP_AUTH_USER']) &&
   isset($_SERVER['PHP_AUTH_PW']))
{

if ($_SERVER['PHP_AUTH_USER'] = $username &&
    $_SERVER['PHP_AUTH_PW'] == $password)
    echo "Регистрация прошла успешно";
else die("Неверная комбинация имя пользователя-пароль");
}
  else
  {
    Header('WWW-Authenticate: Basic realm="Restricted Section"');
    header('HTTP/1.0401 Unauthorized');
    die ("Пожалуйста, введите имя пользователя и пароль");
  }
?>

Кстати, обратите внимание на формулировку сообшения об ошибке: «Неверная комбинация имя пользователя-пароль». В ней не сообщается, что именно было введено неправильно: имя пользователя, пароль или же и то, и другое — чем меньше информации попадет к потенциальному взломщику, тем лучше.

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

Удаление cookieСохранение имен пользователей и паролей