-
Notifications
You must be signed in to change notification settings - Fork 76
/
Copy pathhttp-auth.xml
181 lines (165 loc) · 9.22 KB
/
http-auth.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<?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
-->