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

Содержание
Введение
Предопределённые переменные
Basic HTTP Аутентификация
Обзор Digest Аутентификации
Form Based Аутентификация
Похожие статьи

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

php.net

Basic HTTP Authentication

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

<?php // www.eth1.ru 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.

Чтобы гарантировать максимальную совместимость со всеми клиентами, ключевое слово "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 с набором (дайджестом) опций.

WWW-Authenticate: Digest realm="AndreiR",
qop="auth,auth-int",
nonce="abcdefg…",
opaque="abcd…",

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

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

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

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

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

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

GET /
Authorization: Digest username="andrei", realm="AndreiR", uri="/"
qop=auth, nc=00000001,response="12345abc…"
nonce="abcdefg…",
opaque="abcd…",

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

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

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

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

Form Based Аутентификации

Про аутентификацию через HTML форму вы можете прочитать в статье «PHP Аутентификация через форму»

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

Похожие статьи
Программирование на PHP
Массивы в PHP
Циклы в PHP
Дата и время в PHP - основы
Как отобразить время различных часовых поясов PHP
Как вставить переменную в ссылку PHP
gettype(): определить тип переменной PHP
json_decode
Как получить ширину экрана с помощью PHP
Вызов функции из другого файла
Premature end of chunk coded message body: closing chunk expected
Сгенерировать неповторяющиеся случайные числа PHP
Узнать свой HTTP_USER_AGENT
Сравнить две даты
Классы в PHP 8
Комментарии в PHP
substr: обрезать строку
Запросы к REST API на PHP
$_SERVER['REQUEST_URI']: текущая url
Работа с базами данных
Работа с cookies
PHP sessions
Аутентификация и авторизация в PHP 8
Тернарный оператор
try catch
PHP_errors.log Beget
Разбор ошибок

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: