HTTP-авторизация средствами PHP

Эта статья устарела.

Эта статья написана для услуги Виртуальный хостинг, которая считается устаревшей с 1 июня 2019 года.

Актуальную услугу хостинга можно заказать на нашем сайте netangels.ru/hosting

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} [QSA,L]

При запросе через HTTP к файлу sitename.ru/www/index.php, данное правило будет передавать GET-запросом содержимое непустого поля Authorization в параметр authorization. Если мы средствами PHP посмотрим на содержимое переменной $_GET[‘authorization’], то увидем как раз описываемый выше basic-credentials – строку вида:

"Basic dXNlcjpwYXNzd29yZA=="

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

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

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

Заключение

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

Исходные тексты рабочих примеров вы можете найти в Приложении к данной статье.

Приложение. Исходные тексты скрипта

Исходный текст файла .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /
    RewriteCond %{HTTP:Authorization} ^Basic.*
    RewriteRule (.*) index.php?authorization=%{HTTP:Authorization} [QSA,L]
</IfModule>

Исходный текст 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[1]));
        // Проверка корректности введенных реквизитов доступа
        if($user=="user" && $pass=="password")
        {
            $authenticated=1;
        }
    }
}

if($authenticated)
{
    // Авторизация успешно пройдена
    echo("user: ".$user."<br>pass: ".$pass);
}
else
{
    header('WWW-Authenticate: Basic realm="Restricted Area"');
    header('HTTP/1.1 401 Unauthorized');
    echo("Access denied.");
}

Тарифы на php хостинг

С 2003 года
Надежность.
Нам доверяют десятки тысяч компаний и разработчиков
20 лет
Предоставляем услуги профессионального хостинга
35 000
Клиентов доверяют нам размещение своих сайтов
99.99%
Подтвержденный uptime
наших серверов хостинга
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
Наши клиенты
ВК49865