Forum und email
HTTP autentikace a PHP

Kapitola 34. 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 34-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 34-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.