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
|
<?xml version="1.0" encoding="iso-8859-1"?>
<chapter id="features.http-auth">
<title>HTTP-Authentifizierung mit PHP</title>
<simpara>
Die HTTP-Authentifizierung durch PHP ist nur verfgbar, wenn PHP als
Apache-Modul luft und funktioniert daher nicht mit der CGI-Version.
In einem PHP-Skript fr ein Apache-Modul kann man die Funktion
<function>header</function> benutzen, um die Nachricht "Authentifizierung
notwendig" 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-Scripts
mit den Variablen $PHP_AUTH_USER, $PHP_AUTH_PW
und $PHP_AUTH_TYPE, die den jeweiligen Benutzernamen, das
Passwort und den Typ der Identifizierung enthalten, erneut aufgerufen.
Momentan wird nur das Authentifizierungsmodell "basic" untersttzt.
Nheres hierzu bei der <function>header</function> Funktion.</simpara>
<para>
Ein Auszug aus einem Skript, das die Clientauthentifizierung
auf einer Seite erzwingt, wrde so aussehen:
<example>
<title>HTTP-Authentifizierung</title>
<programlisting role="php">
<?php
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
echo "Text to send if user hits Cancel button\n";
exit;
} else {
echo "Hello $PHP_AUTH_USER.<P>";
echo "You entered $PHP_AUTH_PW as your password.<P>";
}
?>
</programlisting>
</example></para>
<note>
<title>Hinweis</title>
<para>
Achten Sie bei den Header-Zeilen fr maximale Kompatibilitt auf die
richtige Schreibweise! Das Schlsselwort "Basic" sollte genau so geschrieben
werden, der Realm-String muss in doppelte (nicht einfache) Anfhrungszeichen
eingeschlossen sein, und in der "HTTP/1.0 401"-Zeile
darf nur genau ein Leerzeichen vor dem 401-Code stehen.
</para>
</note>
<para>
Anstatt $PHP_AUTH_USER und $PHP_AUTH_PW einfach nur
auszugeben, werden Sie den Benutzernamen und das Passwort
auf Gltigkeit berprfen wollen. Dies kann durch die Abfrage
einer Datenbank oder das Einlesen einer Textdatei geschehen.</para>
<para>
Vorsicht bei einigen Internet Explorer-Versionen - sie scheinen
sehr whlerisch zu sein, was die Reihenfolge der Header angeht.
Abhilfe schafft hier das Senden des <emphasis>WWW-Authenticate</emphasis>
Headers vor dem <errorcode>HTTP/1.0 401</errorcode>.</para>
<simpara>
Um zu unterbinden, dass ein Skript das Passwort einer durch
einen traditionellen externen Mechanismus geschtzten Seite
ausliest, werden die PHP_AUTH Variablen nicht gesetzt, wenn
eine externe Authentifizierung fr diese bestimmte Seite aktiviert
ist. In diesem Fall kann die $REMOTE_USER Variable benutzt
werden, um den Benutzer durch die externe Zugriffskontrolle
zu identifizieren.</simpara>
<note>
<title>Konfigurationshinweis</title>
<para>
PHP prft das Vorhandensein einer <literal>AuthType</literal>
Apache-Direktive, um zu entscheiden, ob eine externe
Authentifizierung aktiv ist. Vermeiden Sie deshalb diese
Konfigurationsdirektive im Kontext der PHP-Authentifizierung
(anderenfalls wird jeder Authentifizierungsversuch misslingen).
</para>
</note>
<simpara>
Zu beachten ist, dass obenstehendes keinesfalls jemanden,
der die Kontrolle ber eine nichtgeschtzte URL hat, davon
abhalten kann, Passwrter von geschtzten URLs auf dem
gleichen Rechner auszulesen.</simpara>
<simpara>
Sowohl Netscape als auch der Internet Explorer lschen den
lokalen Authentifizierungscache des Browserfensters, wenn der
Server eine 401-Meldung zurckgibt. Dies kann benutzt werden, um
einen Benutzer "auszuloggen" und eine erneute Eingabe des
Benutzernamens/Passworts zu erzwingen. Manchmal wird dieses Verhalten
fr das automatische Ausloggen nach Ablauf einer bestimmten Zeitspanne
oder fr einen Logout-Button genutzt.</simpara>
<simpara></simpara>
<example>
<title>HTTP-Authentifizierung, mit erneuter Anforderung von Name/Passwort</title>
<programlisting role="php">
<?php
function authenticate() {
Header( "WWW-Authenticate: Basic realm=\"Test Authentication System\"");
Header( "HTTP/1.0 401 Unauthorized");
echo "You must enter a valid login ID and password to access this resource\n";
exit;
}
if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !strcmp($OldAuth, $PHP_AUTH_USER)) ) {
authenticate();
}
else {
echo "Welcome: $PHP_AUTH_USER<BR>";
echo "Old: $OldAuth";
echo "<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n";
echo "<INPUT TYPE=HIDDEN NAME=\"SeenBefore\" VALUE=\"1\">\n";
echo "<INPUT TYPE=HIDDEN NAME=\"OldAuth\" VALUE=\"$PHP_AUTH_USER\">\n";
echo "<INPUT TYPE=Submit VALUE=\"Re Authenticate\">\n";
echo "</FORM>\n";
}
?>
</programlisting>
</example>
<simpara>
Dieses Verhalten wird vom Authentifizierungsstandard HTTP Basic
nicht gefordert, daher sollte man sich nie darauf verlassen. Tests
mit Lynx haben gezeigt, dass Lynx die Authentifizierungsinformationen
bei Erhalt einer 401-Meldung nicht lscht. Ein Klick auf den Zurck-
Button und danach auf Vorwrts wird die angeforderte Adresse
ffnen (und zwar so lange, bis die Identifizierung der Benutzer
gendert wird).</simpara>
<simpara>
Weiterhin muss beachtet werden, dass dies unter dem Microsoft
IIS mit der CGI-Version von PHP aufgrund einer
Einschrnkung des IIS nicht funktioniert.</simpara>
</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:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
|