Аутентификация и авторизацияvна PHP

Contents
Introduction
Аутентификация
Авторизация
Предопределённые переменные
Basic HTTP Аутентификация
Обзор Digest Аутентификации
Form Based Аутентификация

Предопределённые PHP переменные

php.net

Basic HTTP Authentication

To создать проверку пользователя во всплывающем окне достаточно следующего кода:

<?php // www.aredel.com lesson $username = 'eth1.ru'; $password = 'heihei.ru'; if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="Andrei"'); }

Тем не менее, желательно добавить немного функционала:

<?php $username = 'eth1.ru'; $password = 'heihei.ru'; if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="Andrei"'); header('HTTP/1.0 401 Unauthorized'); echo 'Введите логин и пароль, чтобы получить доступ к странице'; exit; } else { echo "<p>Привет {$_SERVER['PHP_AUTH_USER']}.</p>"; echo "<p>Вы ввели пароль {$_SERVER['PHP_AUTH_PW']} .</p>"; } if ($_SERVER['PHP_AUTH_USER'] !== $username || $_SERVER['PHP_AUTH_PW'] !== $password ) { header('HTTP/1.0 401 Unauthorized'); echo 'Имя пользователя или пароль введены неверно\n'; exit; }

Работать такой код будет довольно убого - если ввести пароль неверно не будет второй попытки. Придётся закрывать вкладку, идти в историю браузера и удалять там соответствующие данные.

В Firefox это Library → History → Clear Recent History → Active Logins

В Chrome это Passwords and other sing-in data (в Clear browsing data → Advanced)

В Safari это Clear History

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

Примечание о совместимости

Пожалуйста, будьте осторожны при кодировании строк заголовка HTTP.

To гарантировать максимальную совместимость со всеми клиентами, ключевое слово "Basic" должно быть написано с прописной буквой "B", строка realm должна быть заключена в двойные (а не одинарные) кавычки, и ровно один пробел должен предшествовать коду 401 в строке заголовка HTTP/1.0 401. Параметры аутентификации должны быть разделены запятыми, как показано в приведенном выше примере дайджеста.

Очистить глобальные переменные

Очистить значения переменных $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] можно с помощью функции unset()

unset($_SERVER['PHP_AUTH_USER']); unset($_SERVER['PHP_AUTH_PW']);

HTTP Digest Authentication

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

Аналогичный метод используется в рамках VoIP-протокола SIP для аутентификации сервером обращения со стороны клиента, т.е. оконечного терминала.

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

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

Это более продвинутый вариант HTTP Аутентификации.

RFC

Можно использовать следующие опции ( полный список в RFC )

domain - домен

Необязательный список URI (через пробел), которые защищены данным запросом на аутентификацию.

algorithm

Указывает на алгоритм, используемый для создания дайджеста.

opaque

base64 или HEX строка которую генерирует сервер. Клиент должен вернуть opaque неизменённым.

nonce - Уникальное HEX число или base64 число, которое сервер генерирует вместе с каждый 401 запросом.

Помогает серверу бороться с атаками повторного воспроизведения (replay attack)

nonce должен быть в одинарных кавычках (не в двойных)

nonce-count - HEX число, содержащее количество запросов, которые клиент отправил с nonce в запросе.

stale

От английского stale - устаревший.

Флаг, который показывает на то, что предыдущий запрос от клиента был отклонён из за того, что значение nonce было несвежим.

Сервер должен ставить флаг stale в TRUE (регистронечувствительный) если пароль и имя пользователя верные и только nonce устарел.

В этом случае клиент может попытаться отправить ещё один зашифрованный запрос не запрашивая у пользователя ввод пароля.

Если сервер отказал в соединении а stale поставлен в FALSE, либо любое значение кроме TRUE, либо вообще отсутствует, значит клиент должен запросить логин и пароль снова.

qop - Quality of Protection

Опция для HTTP Digest Authentication. Может принимать значения "auth" или "auth-int". Влияет на то как создается хэш.

Если поставить в "auth" будет использоваться только запрошенный URI. Если в "auth-int" то также будет использовано тело запроса.

rfc2617

cnonce - Уникальный id сгенерированный клиентом. Это число помогает клиенту и серверу подтвердить, что у них есть известный общий секрет. Необходимо когда сервер отправляет qop. Не должно посылаться если сервер не использовал qop директиву.

Обзор Digest Аутентификации

  1. Клиент шлёт GET на сервер.

  2. Сервер шлёт обратно HTTP 401 Unauthorized с набором (дайджестом) опций.




  3. Пользователь вводит свои учётные данные

  4. Генерируется Authorization Header:

    HA1 = MD5 хэш из имени пользователя, пароля и строки realm.

    HA2 = MD5 хэш из метода аутентификации и запрошенного URI

    Response = MD5 хэш из HA1, HA2, nonce, nonce-count, cnonce и qop

    Клиент отправляет новый запрос на основе сгенерированных данных




  5. Сервер проверяет пришедшие данные. Если всё верно возвращает HTTP 200 OK, если неверно HTTP 403 Forbidden

Некоторые опции необязательны, поэтому гарантировать определённый уровень безопасности нельзя.

HTTP Digest Аутентификация уязвима для атак посредника (MITM) так как сервер не может проверить идентичность клиента.

Невозможно использовать более сложные алгоритмы хэширования паролей, такие как bcrypt

Другие статьи
Блокировка PHP сессий
Установка PHP-фреймворков
Установка Yii
Установка Symfony
Установка Laravel
XDebug - дебаг и профилирование кода php (profiling)

Related Articles
Development with PHP
Arrays in PHP
Date and Time in PHP - basics
How to display time of multiple timezones in PHP
How to add variable to url in PHP
json_decode
How to get screen size with PHP
Call function from another file
Premature end of chunk coded message body: closing chunk expected
Generate unique random numbers with PHP
Check your HTTP_USER_AGENT
Compare two dates
PHP 8 Classes
Comments in PHP
Cookies
PHP sessions
Authentication and Authorization in PHP 8

Search on this site

Subscribe to @aofeed channel for updates

Visit Channel

@aofeed

Feedbak and Questions in Telegram

@aofeedchat