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.