Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
109 changes: 30 additions & 79 deletions features/http-auth.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: bdf9a4e40204c805f2c2a5c94c2f2f8f5556195a Maintainer: shein Status: ready -->
<!-- EN-Revision: cd4180557a185469a64a7eb26f7be98d0a5f1ebb Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="features.http-auth" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<chapter xml:id="features.http-auth" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>HTTP-аутентификация в PHP</title>

<simpara>
Expand Down Expand Up @@ -30,32 +30,29 @@
<programlisting role="php">
<![CDATA[
<?php

if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');

echo 'Текст, который скрипт отправит,
если пользователь нажмёт кнопку «Отмена»';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Вы ввели пароль: {$_SERVER['PHP_AUTH_PW']}.</p>";
}

?>
]]>
</programlisting>
</example>
</para>

<note>
<title>Примечание о совместимости</title>
<title>Совместимость</title>
<para>
При определении HTTP-заголовков соблюдают осторожность. Слово "Basic"
требуется писать с заглавной буквы "B", значение для ключа realm берут
в двойные, но не одинарные кавычки, а перед кодом <emphasis>401</emphasis>
в строке заголовка <emphasis>HTTP/1.0 401</emphasis>
в строке заголовка <emphasis>HTTP/1.1 401</emphasis>
указывают ровно один пробел, чтобы гарантировать максимальную совместимость
с клиентами. Параметры аутентификации разделяют запятыми.
</para>
Expand All @@ -68,15 +65,8 @@ if (!isset($_SERVER['PHP_AUTH_USER'])) {
или через поиск пользователя в dbm-файле.
</para>

<para>
Остерегайтесь браузеров Internet Explorer, которые часто работают с ошибками.
Эти браузеры требовательны к порядку заголовков. Трюк с указанием
заголовка <emphasis>WWW-Authenticate</emphasis> перед отправкой статуса
<literal>HTTP/1.0 401</literal>, похоже, пока помогает.
</para>

<note>
<title>Примечание о конфигурации</title>
<title>Конфигурация Apache</title>
<para>
PHP использует директиву <literal>AuthType</literal>, чтобы определить,
действует ли внешняя аутентификация.
Expand All @@ -88,77 +78,38 @@ if (!isset($_SERVER['PHP_AUTH_USER'])) {
кто контролирует неаутентифицированный URL-адрес,
воровать пароли от аутентифицированных URL-адресов на том же сервере.
</simpara>
<simpara>
Браузеры Netscape Navigator и Internet Explorer очистят кеш аутентификации
текущего окна для заданного региона (realm) при получении от сервера статуса 401.
Это может отменить авторизацию пользователя и заставит его
повторно вводить имя пользователя и
пароль. Иногда разработчики используют это для ограничения авторизации
по времени ожидания или для предоставления кнопки «Выход».
</simpara>
<para>
<example>
<title>Пример HTTP-аутентификации с принудительным вводом новой пары логин-пароль</title>
<programlisting role="php">
<![CDATA[
<?php

function authenticate()
{
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');

echo "Вы должны ввести корректный логин и пароль для получения доступа к ресурсу \n";

exit;
}

if (
!isset($_SERVER['PHP_AUTH_USER'])
|| ($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])
) {
authenticate();
} else {
echo "<p>Добро пожаловать: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo "Предыдущий логин: " . htmlspecialchars($_REQUEST['OldAuth']);
echo "<form action='' method='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Авторизоваться повторно' />\n";
echo "</form></p>\n";
}
<note>
<title>Поведение браузеров</title>
<simpara>
Базовая HTTP-аутентификация действительно проста и не была рассчитана на поддержку
выхода из системы. Поскольку HTTP — протокол без сохранения состояния, большинство
браузеров кешируют предоставленные учётные данные сразу после получения статуса
<literal>2xx</literal> и отправляют их при каждом запросе до закрытия браузера.
Стандартного способа запросить у клиента повторный ввод учётных данных не существует.

За годы в интернете распространились разные обходные решения,
но все они зависят от того, как конкретные браузеры обрабатывают неопределённые
крайние случаи (или даже нарушения стандарта HTTP). Лучше избегать
таких обходных решений и не использовать Basic-аутентификацию для серьёзных задач.
</simpara>
</note>

?>
]]>
</programlisting>
</example>
</para>
<simpara>
Стандарт базовой аутентификации по протоколу HTTP <literal>HTTP Basic</literal> не требует такого поведения,
поэтому разработчик не должен зависеть от этого. Тестирование браузера <literal>Lynx</literal>
показало, что <literal>Lynx</literal> не очищает учётные данные аутентификации при ответе сервера
кодом 401, поэтому последовательное нажатие кнопок «Назад» и «Вперёд» откроет ресурс,
если требования к учётным данным не изменились.
Однако пользователь может нажать клавишу <literal>'_'</literal> для очистки кеша аутентификации.
</simpara>
<simpara>
Чтобы добиться корректной работы HTTP-аутентификации на IIS-сервере
с CGI-версией PHP, требуется отредактировать
опцию конфигурации IIS-сервера "<literal>Directory Security</literal>".
Щёлкните «<literal>Изменить</literal>» и поставьте галочку только в поле
«<literal>Анонимный доступ</literal>»,
остальные поля остаются неотмеченными.
</simpara>
<note>
<title>Примечание по теме аутентификации на IIS-севере:</title>
<title>Конфигурация IIS</title>
<simpara>
Чтобы HTTP-аутентификация корректно работала на IIS-сервере, для PHP-директивы
<link linkend="ini.cgi.rfc2616-headers">cgi.rfc2616_headers</link> требуется установить
значение <literal>0</literal> (значение по умолчанию).
Чтобы HTTP-аутентификация корректно работала на IIS-сервере с CGI-версией PHP,
для PHP-директивы <link linkend="ini.cgi.rfc2616-headers">cgi.rfc2616_headers</link>
требуется установить значение <literal>0</literal> (значение по умолчанию),
а также отредактировать опцию конфигурации IIS-сервера «<literal>Directory Security</literal>».
Щёлкните «<literal>Изменить</literal>» и поставьте галочку только в поле
«<literal>Анонимный доступ</literal>»,
остальные поля остаются неотмеченными.
</simpara>
</note>

</chapter>

<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
Expand Down
Loading