Die
HTTP-Authentifizierung
durch
PHP
ist
nur
verfügbar
,
wenn
PHP
als
Apache-Modul
läuft
und
funktioniert
daher
nicht
mit
der
CGI-Version
.
In
einem
PHP-Skript
für
ein
Apache-Modul
kann
man
die
Funktion
header(
)
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
"
unterstützt
.
Näheres
hierzu
bei
der
header(
)
Funktion
.
Ein
Auszug
aus
einem
Skript
,
das
die
Clientauthentifizierung
auf
einer
Seite
erzwingt
,
würde
so
aussehen
:
Beispiel
16-1
.
HTTP-Authentifizierung
?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
"
;
}
?
|
|
Hinweis
:
Achten
Sie
bei
den
Header-Zeilen
für
maximale
Kompatibilität
auf
die
richtige
Schreibweise
!
Das
Schlüsselwort
"
Basic
"
sollte
genau
so
geschrieben
werden
,
der
Realm-String
muss
in
doppelte
(nicht
einfache
)
Anführungszeichen
eingeschlossen
sein
,
und
in
der
"HTTP
/
1.0 401
"-Zeile
darf
nur
genau
ein
Leerzeichen
vor
dem
401-Code
stehen
.
Anstatt
$PHP_AUTH_USER
und
$PHP_AUTH_PW
einfach
nur
auszugeben
,
werden
Sie
den
Benutzernamen
und
das
Passwort
auf
Gültigkeit
überprüfen
wollen
.
Dies
kann
durch
die
Abfrage
einer
Datenbank
oder
das
Einlesen
einer
Textdatei
geschehen
.
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
WWW-Authenticate
Headers
vor
dem
HTTP
/
1.0 401
.
Um
zu
unterbinden
,
dass
ein
Skript
das
Passwort
einer
durch
einen
traditionellen
externen
Mechanismus
geschützten
Seite
ausliest
,
werden
die
PHP_AUTH
Variablen
nicht
gesetzt
,
wenn
eine
externe
Authentifizierung
für
diese
bestimmte
Seite
aktiviert
ist
.
In
diesem
Fall
kann
die
$REMOTE_USER
Variable
benutzt
werden
,
um
den
Benutzer
durch
die
externe
Zugriffskontrolle
zu
identifizieren
.
Konfigurationshinweis
:
PHP
prüft
das
Vorhandensein
einer
AuthType
PHP
prüft
das
Vorhandensein
einer
AuthType
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
)
.
Zu
beachten
ist
,
dass
obenstehendes
keinesfalls
jemanden
,
der
die
Kontrolle
über
eine
nichtgeschützte
URL
hat
,
davon
abhalten
kann
,
Passwörter
von
geschützten
URLs
auf
dem
gleichen
Rechner
auszulesen
.
Sowohl
Netscape
als
auch
der
Internet
Explorer
löschen
den
lokalen
Authentifizierungscache
des
Browserfensters
,
wenn
der
Server
eine
401-Meldung
zurückgibt
.
Dies
kann
benutzt
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
.
Beispiel
16-2
.
HTTP-Authentifizierung
,
mit
erneuter
Anforderung
von
Name
/
Passwort
?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"
;
}
?
|
|
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
löscht
.
Ein
Klick
auf
den
Zurück
-
Button
und
danach
auf
Vorwärts
wird
die
angeforderte
Adresse
öffnen
(
und
zwar
so
lange
,
bis
die
Identifizierung
der
Benutzer
geändert
wird
)
.
Weiterhin
muss
beachtet
werden
,
dass
dies
unter
dem
Microsoft
IIS
mit
der
CGI-Version
von
PHP
aufgrund
einer
Einschränkung
des
IIS
nicht
funktioniert
.