1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files
archived-doc-ru/features/http-auth.xml
2024-10-17 06:36:14 +03:00

182 lines
9.2 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: bdf9a4e40204c805f2c2a5c94c2f2f8f5556195a 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">
<title>HTTP-аутентификация в PHP</title>
<simpara>
Функция <function>header</function> умеет
отправлять в браузер сообщение «<literal>Требуется аутентификация</literal>»
и при этом заставляет браузер показывать всплывающее окно ввода имени пользователя
и пароля. Как только пользователь заполнит логин и пароль,
браузер снова вызовет URL-адрес с названием PHP-скрипта, но уже
<link linkend="reserved.variables">с предопределёнными переменными</link>:
для переменной <varname>PHP_AUTH_USER</varname> PHP установит значение имени пользователя,
для переменной <varname>PHP_AUTH_PW</varname> — пароль,
а для <varname>AUTH_TYPE</varname> — тип
аутентификации. Эти предопределённые переменные содержит суперглобальный массив
<varname>$_SERVER</varname>. PHP поддерживает <emphasis>только</emphasis>
Basic-метод аутентификации. Дополнительную информацию даёт описание
функции <function>header</function>.
</simpara>
<para>
Пример фрагмента скрипта, который вынуждает клиента авторизоваться для
просмотра страницы:
</para>
<para>
<example>
<title>Пример HTTP-аутентификации с типом Basic</title>
<programlisting role="php">
<![CDATA[
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
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>
<para>
При определении HTTP-заголовков соблюдают осторожность. Слово "Basic"
требуется писать с заглавной буквы "B", значение для ключа realm берут
в двойные, но не одинарные кавычки, а перед кодом <emphasis>401</emphasis>
в строке заголовка <emphasis>HTTP/1.0 401</emphasis>
указывают ровно один пробел, чтобы гарантировать максимальную совместимость
с клиентами. Параметры аутентификации разделяют запятыми.
</para>
</note>
<para>
Вместо простого вывода значений переменных <varname>PHP_AUTH_USER</varname>
и <varname>PHP_AUTH_PW</varname>, как это сделал приведённый пример,
программист может проверить правильность имени пользователи и пароля через базу данных
или через поиск пользователя в dbm-файле.
</para>
<para>
Остерегайтесь браузеров Internet Explorer, которые часто работают с ошибками.
Эти браузеры требовательны к порядку заголовков. Трюк с указанием
заголовка <emphasis>WWW-Authenticate</emphasis> перед отправкой статуса
<literal>HTTP/1.0 401</literal>, похоже, пока помогает.
</para>
<note>
<title>Примечание о конфигурации</title>
<para>
PHP использует директиву <literal>AuthType</literal>, чтобы определить,
действует ли внешняя аутентификация.
</para>
</note>
<simpara>
Однако обратите внимание, что это не мешает тому,
кто контролирует неаутентифицированный 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";
}
?>
]]>
</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>
<simpara>
Чтобы HTTP-аутентификация корректно работала на IIS-сервере, для PHP-директивы
<link linkend="ini.cgi.rfc2616-headers">cgi.rfc2616_headers</link> требуется установить
значение <literal>0</literal> (значение по умолчанию).
</simpara>
</note>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->