-
Notifications
You must be signed in to change notification settings - Fork 44
/
Copy pathhttp-auth.xml
180 lines (170 loc) · 6.8 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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: bdf9a4e40204c805f2c2a5c94c2f2f8f5556195a Maintainer: samesch 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-Authentifizierung mit PHP</title>
<simpara>
Man kann die Funktion <function>header</function> verwenden, um die
Nachricht <literal>"Authentifizierung erforderlich"</literal> an den
Client-Browser zu senden, damit dieser ein Fenster zur Eingabe von
Benutzername/Passwort öffnet. Hat der Benutzer diese eingegeben, wird die
URL des PHP-Skripts mit den
<link linkend="reserved.variables">vordefinierten Variablen</link>
<varname>PHP_AUTH_USER</varname>, <varname>PHP_AUTH_PW</varname> und
<varname>AUTH_TYPE</varname>, die den Benutzernamen, das Passwort und den
Typ der Authentifizierung enthalten, erneut aufgerufen. Diese
vordefinierten Variablen befinden sich im Array
<varname>$_SERVER</varname>. Es wird <emphasis>nur</emphasis> die
Authentifizierungsmethode "Basic" unterstützt. Näheres hierzu bei der
Funktion <function>header</function>.
</simpara>
<para>
Ein Auszug aus einem Skript, das die Clientauthentifizierung auf einer
Seite erzwingt, würde so aussehen:
</para>
<para>
<example>
<title>Beispiel: Basic-HTTP-Authentifizierung</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 'Text, der gesendet wird, falls der Benutzer auf Abbrechen drückt';
exit;
} else {
echo "<p>Hallo {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>Sie gaben {$_SERVER['PHP_AUTH_PW']} als Passwort ein.</p>";
}
?>
]]>
</programlisting>
</example>
</para>
<note>
<title>Hinweis zur Kompatibilität</title>
<para>
Achten Sie für die maximale Kompatibilität mit allen Clients bei den
Header-Zeilen auf die richtige Schreibweise! Das Schlüsselwort "Basic"
sollte genau so geschrieben werden, der Realm-String muss in doppelte
(nicht einfache) Anführungszeichen gesetzt werden und in der
<emphasis>HTTP/1.0 401</emphasis>-Zeile darf nur genau ein Leerzeichen vor
dem <emphasis>401</emphasis>-Code stehen. Die Authentifizierungsparameter
müssen durch Kommata getrennt werden.
</para>
</note>
<para>
Anstatt <varname>PHP_AUTH_USER</varname> und <varname>PHP_AUTH_PW</varname>
wie im Beispiel oben einfach nur auszugeben, werden Sie den Benutzernamen
und das Passwort auf Gültigkeit überprüfen wollen. Dies kann durch das
Abfragen einer Datenbank oder die Suche des Benutzers in einer Textdatei
geschehen.
</para>
<para>
Vorsicht bei einigen Internet Explorer-Versionen - sie scheinen sehr
wählerisch zu sein, was die Reihenfolge der Header angeht. Abhilfe schafft
hier das Senden des <emphasis>WWW-Authenticate</emphasis>-Headers vor dem
<literal>HTTP/1.0 401</literal>-Header.
</para>
<note>
<title>Konfigurationshinweis</title>
<para>
PHP prüft das Vorhandensein einer <literal>AuthType</literal>
Apache-Direktive, um zu entscheiden, ob eine externe Authentifizierung
aktiv ist.
</para>
</note>
<simpara>
Zu beachten ist, dass Obenstehendes keinesfalls jemanden, der auf demselben
Server die Kontrolle über eine nicht authentifizierte URL hat, davon
abhalten kann, Passwörter von authentifizierten URLs auszulesen.
</simpara>
<simpara>
Sowohl Netscape als auch der Internet Explorer löschen den lokalen
Authentifizierungscache des Browserfensters, wenn der Server eine
401-Meldung zurückgibt. Dies kann verwendet werden, um einen Benutzer
"auszuloggen" und eine erneute Eingabe des Benutzernamens/Passworts zu
erzwingen. Manchmal wird dieses Verhalten für das automatische Ausloggen
nach Ablauf einer bestimmten Zeitspanne oder für einen Logout-Button
genutzt.
</simpara>
<para>
<example>
<title>HTTP-Authentifizierung, mit erneuter Anforderung von Name/Passwort</title>
<programlisting role="php">
<![CDATA[
<?php
function authentifizieren() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "Bitte geben Sie eine gültige Login-ID und das Passwort für den
Zugang ein\n";
exit;
}
if (!isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['Gesehen'] == 1 && $_POST['AlteAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authentifizieren();
} else {
echo "<p>Willkommen: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo "Alt: " . htmlspecialchars($_REQUEST['AlteAuth']);
echo "<form action='' method='post'>\n";
echo "<input type='hidden' name='Gesehen' value='1' />\n";
echo "<input type='hidden' name='AlteAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Erneut Anmelden' />\n";
echo "</form></p>\n";
}
?>
]]>
</programlisting>
</example>
</para>
<simpara>
Dieses Verhalten wird vom Authentifizierungsstandard <literal>HTTP
Basic</literal> nicht gefordert, daher sollte man sich nie darauf
verlassen. Tests mit <literal>Lynx</literal> haben gezeigt, dass
<literal>Lynx</literal> die Authentifizierungsinformationen bei Erhalt
einer 401-Meldung nicht löscht. Solange der benötigte Berechtigungsnachweis
nicht geändert wird, kann der Benutzer auf die vorhergehende Seite zurück
und danach vorwärts und die angeforderte Adresse wieder öffnen. Der
Benutzer kann die Authentifizierungsinformationen aber durch Drücken von
<literal>'_'</literal> löschen.
</simpara>
<simpara>
Damit die HTTP-Authentifizierung funktioniert, wenn der IIS mit der
CGI-Version von PHP verwendet wird, müssen Sie die "<literal>Directory
Security</literal>" Ihrer IIS-Konfiguration ändern. Klicken Sie auf
"<literal>Edit</literal>" und aktivieren Sie nur "<literal>Anonymous
Access</literal>". Alle anderen Felder sollten deaktiviert bleiben.
</simpara>
<note>
<title>IIS-Anmerkung:</title>
<simpara>
Damit die HTTP-Authentifizierung mit dem IIS funktioniert, muss die
PHP-Konfigurationsanweisung
<link linkend="ini.cgi.rfc2616-headers">cgi.rfc2616_headers</link> auf
<literal>0</literal> (die Voreinstellung) gesetzt sein.
</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
-->