Prostředky
HTTP
autentikace
jsou
v
PHP
přístupné
pouze
pokud
PHP
běží
jako
modul
Apache
,
tudíž
nejsou
přístupné
v
CGI
verzi
.
V
PHP
skriptu
běžícím
pod
modulem
Apache
lze
použít
funkci
header(
)
k
odeslání
zprávy
"Authentication
Required
"
klientskému
browseru
,
což
vyvolá
zobrazení
dialogového
okna
pro
vložení
uživatelského
jména
a
hesla
.
Jakmile
uživatel
zadá
jméno
a
heslo
,
URL
obsahující
tento
PHP
skript
se
zavolá
znovu
s
proměnnými
$PHP_AUTH_USER
,
$PHP_AUTH_PW
and
$PHP_AUTH_TYPE
obsahujícími
jméno
,
heslo
a
typ
autentikace
.
V
současnosti
je
podporována
pouze
"
Basic
"
autentikace
.
Více
informací
viz
funkce
header(
)
.
Následující
fragment
kódu
může
posloužit
jako
ukázka
vyžádání
autentikace
uživatele
na
stránce
:
Příklad
16-1
.
Ukázka
HTTP
Autentikace
?php
if(
!isset($PHP_AUTH_USER)
)
{
Header(
"WWW-Authenticate
:
Basic
realm=\"
My
Realm\"")
;
Header("HTTP
/
1.0 401
Unauthorized")
;
echo
"Text
,
který
se
odešle
,
pokud
uživatel
zmáčkne
tlačítko
Cancel\n"
;
exit
;
}
else
{
echo
"Ahoj
$PHP_AUTH_USER
.
P
"
;
echo
"Jako
heslo
jsi
zadal
$PHP_AUTH_PW
.
P
"
;
}
?
|
|
Místo
protého
vytištění
$PHP_AUTH_USER
a
$PHP_AUTH_PW
byste
asi
chtěli
ověřit
platnost
zadaného
jména
a
hesla
.
Například
dotazem
v
databázi
nebo
vyhledáním
uživatele
v
dbm
souboru
.
Pozor
na
chybové
browsery
Internet
Explorer
.
Zdá
se
,
že
jsou
velice
vybíravé
,
pokud
jde
o
pořadí
hlaviček
.
Zdá
se
,
že
odeslání
hlavičky
WWW-Authenticate
před
hlavičkou
HTTP
/
1.0 401
zabírá
.
Aby
se
zabránilo
psaní
skriptů
odhalujících
hesla
na
stránkách
autentikovaných
některým
z
tradičních
externích
mechanismů
,
PHP_AUTH
proměnné
se
nevytvoří
,
pokud
je
pro
tu
kterou
stránku
zapnuta
externí
autentikace
.
V
takovém
případě
můžete
k
identifikaci
externě
autentikovaného
uživatele
použít
proměnnou
$REMOTE_USER
.
Všimněte
si
nicméně
,
že
výše
uvedené
nezabrání
krádežím
hesel
z
autentikovaných
URL
osobou
,
která
ovládá
neautentikovanou
URL
na
stejném
serveru
.
Jak
Netscape
,
tak
Internet
Explorer
po
přijetí
response
kódu
401
vyprázdní
autentikační
cache
současného
realmu
.
Tak
můžete
uživatele
v
podstatě
"
odlogovat
"
.
Někteří
lidé
toho
využívají
k
"
vypršení
"
přihlášení
nebo
tvorbě
odhlašovacího
tlačítka
.
Příklad
16-2
.
Ukázka
HTTP
autentikace
vyžadující
nové
jméno
a
heslo
?php
function
authenticate(
)
{
Header
(
"WWW-Authenticate
:
Basic
realm=\"
Test
Authentication
System\"")
;
Header
(
"HTTP
/
1.0 401
Unauthorized")
;
echo
"K
přístupu
na
tento
zdroj
musíte
zadat
platné
ID
a
heslo\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"
;
}
?
|
|
Podle
standardu
HTTP
Basic
authentication
se
toto
chování
nevyžaduje
,
takže
byste
na
to
nikdy
neměli
spoléhat
.
Pokusy
s
Lynxem
ukázaly
,
že
Lynx
po
přijetí
response
kódu
401
nevyprázdní
autentikační
údaje
,
takže
po
stisknutí
back
a
forward
se
znovu
ukáže
požadovaný
zdroj
(
pokud
se
nezměnily
požadavky
na
údaje
)
.
Dále
si
všimněte
,
že
tato
vlastnost
při
použití
IIS
serveru
a
CGI
verze
PHP
díky
omezením
IIS
nefunguje
.