De
HTTP
Authenticatie
functies
in
PHP
zijn
alleen
te
gebruiken
als
PHP
gebruikt
wordt
als
Apache
module
en
is
zijn
NIET
te
gebruiken
in
de
CGI
versie
.
In
een
PHP
script
is
het
dan
mogelijk
,
met
de
header(
)
functie
,
een
"Authentication
Required
"
bericht
naar
de
browser
te
sturen
.
Dit
veroorzaakt
dat
de
browser
een
"
Login
/
Password
"
invul
window
aan
de
gebruiker
laat
zien
.
Zo
gauw
de
gebruiker
een
login
naam
en
een
password
heeft
ingevuld
wordt
de
URL
met
het
PHP
script
dat
de
header
stuurde
opnieuw
aangeroepen
.
Nu
zijn
de
variablen
$PHP_AUTH_USER
,
$PHP_AUTH_PW
en
$PHP_AUTH_TYPE
gevuld
met
de
waarden
die
de
gebruiker
heeft
ingevuld
.
Op
dit
moment
word
alleen
de
"
Basic
"
authenticatie
ondersteund
.
Zie
de
header(
)
functie
voor
meer
informatie
.
Dit
voorbeeld
script
dwingt
gebruikers
authenticatie
af
:
Voorbeeld
16-1
.
HTTP
Authentication
voorbeeld
?php
if(
!isset($PHP_AUTH_USER)
)
{
Header(
"WWW-Authenticate
:
Basic
realm=\"
Mijn
Realm\"")
;
Header("HTTP
/
1.0 401
Unauthorized")
;
echo
"Tekst
om
te
sturen
als
de
gebruiker
op
Annuleren
klikt.\n"
;
exit
;
}
else
{
echo
"Hallo
$PHP_AUTH_USER
.
P
"
;
echo
"Je
gebruikte
$PHP_AUTH_PW
als
je
password
.
P
"
;
}
?
|
|
In
plaats
van
slechts
de
ingevoerde
waarden
aan
de
gebruiker
te
laten
zien
,
wil
je
waarschijnlijk
$PHP_AUTH_USER
en
$PHP_AUTH_PW
gebruiken
om
de
gebruiker
te
valideren
tegen
bijvoorbeeld
een
database
.
Kijk
uit
voor
buggy
Internet
Explorer
browsers
.
Sommige
zijn
erg
nauwkeurig
over
de
volgorde
dat
de
headers
gestuurd
worden
.
Door
eerst
de
WWW-Authenticate
header
te
sturen
en
dan
de
HTTP
/
1.0 401
header
lijkt
het
probleem
opgelost
te
zijn
.
Om
te
voorkomen
dat
iemand
een
script
schrijft
die
de
wachtwoorden
achterhaald
van
iemand
die
al
eerder
geauthenticeerd
was
door
middel
van
het
externe
authenticatie
systeem
worden
de
PHP_AUTH_*
variabelen
niet
gevuld
als
er
gebruik
word
gemaakt
van
het
externe
authenticatie
systeem
voor
die
bepaalde
pagina
.
In
dit
geval
kan
de
variabele
$REMOTE_USER
gebruikt
worden
om
de
extern
geauthenticeerde
gebruiker
te
identificeren
.
Dit
weerhoudt
iemand
er
echter
niet
van
om
wachtwoorden
te
stelen
via
een
niet-geauthenticeerde
URL
op
dezelfde
server
.
Zowel
Netscape
als
Internet
Explorer
zullen
hun
huidige
cache
in
het
huidige
Window
legen
wanneer
ze
een
401
header
van
de
server
krijgen
.
Op
deze
manier
kan
je
op
een
efficiente
manier
een
gebruiker
"
uit
loggen
"
.
Sommige
mensen
gebruiken
dit
om
een
login
te
laten
verlopen
of
gebruiken
dit
met
een
"
log-out
"
knop
.
Voorbeeld
16-2
.
HTTP
Authentication
voorbeeld
welke
een
nieuwe
loginnaam
en
wachtwoord
vereist
.
?php
function
authenticate(
)
{
Header
(
"WWW-Authenticate
:
Basic
realm=\"
Test
Authentication
Systeem\"")
;
Header
(
"HTTP
/
1.0 401
Unauthorized")
;
echo
"Je
moet
een
geldige
login
en
wachtwoord
opgeven
om
bij
"
.
"deze
pagina
te
komen\n"
;
exit
;
}
if(!isset($PHP_AUTH_USER
)
|
|
($EerderGezien
==
1
!strcmp($VorigeNaam
,
$PHP_AUTH_USER)
)
)
{
authenticate()
;
}
else
{
echo
"Welcome
:
$PHP_AUTH_USER
BR
"
;
echo
"Old
:
$VorigeNaam"
;
echo
"
FORM
ACTION=\"$PHP_SELF\
"
METHOD=POST
\n"
;
echo
"
INPUT
TYPE=HIDDEN
NAME=\"EerderGezien\
"
VALUE=\"1\
"
\n"
;
echo
"
INPUT
TYPE=HIDDEN
NAME=\"VorigeNaam\
"
VALUE=\"$PHP_AUTH_USER\
"
\n"
;
echo
"
INPUT
TYPE=Submit
VALUE=\"Opnieuw
inloggen\
"
\n"
;
echo
"
/
FORM
\n"
;
}
?
|
|
Dit
gedrag
is
niet
vereist
voor
de
HTTP
Basic
authenticatie
standaard
,
dus
je
moet
hier
nooit
op
vertrouwen
.
Tests
met
de
Lynx
browser
wijzen
uit
dat
Lynx
zijn
cache
NIET
leegt
als
hij
een
401
header
van
de
server
krijgt
.
Dus
als
je
'
back
'
en
'forward
'
gaat
krijg
je
gewoon
de
pagina
te
zien
met
de
eerder
ingevoerde
waarden
(Tenzij
de
login
voorwaarden
zijn
gewijzigd
)
.
Let
op
:
Dit
werkt
niet
met
Microsoft
'
s
IIS
server
en
de
CGI
versie
van
PHP
vanwege
een
gebrek
in
IIS
.