Kapitola 16. HTTP autentikace a PHP

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 .