16. Fejezet. HTTP hitelesítés PHP-vel

A HTTP hitelesítési (authentication) funkciók csak akkor elérhetőek PHP-ben, ha az Apache modulként fut, bár régebben a CGI módú használat során is működött ez a funkció, azonban ez a lehetőség már megszűnt. Az Apache modulként futó PHP esetében a Header() függvényt kell használni arra, hogy egy "Authentication Required" üzenetet küldjön a kliens böngészőnek, aminek hatására az egy Username/Password bemeneti ablakot nyit meg a felhasználó számára. Ha a látogató kitöltötte a username és password mezőket, az URL, ami a PHP scriptre mutat, ismét meghívásra kerül, és rendelkezésre állnak a $PHP_AUTH_USER, $PHP_AUTH_PW és a $PHP_AUTH_TYPE változók, amik a felhasználói név, jelszó és azonosítási típus értékeket tartalmazzák értelemszerűen. Jelen pillanatban csupán a "Basic" azonosítási típus támogatott. Lásd még a Header() függényvt.

Egy egyszerű példa PHP script, ami kliens azonosítást vált ki:

Példa 16-1. HTTP azonosítási példa

  1 
  2 
  3 <?php
  4   if(!isset($PHP_AUTH_USER)) {
  5     Header("WWW-Authenticate: Basic realm=\"Azonositás indoka\"");
  6     Header("HTTP/1.0 401 Unauthorized");
  7     echo "Ez jelenik meg, ha a Cancel gombot nyomja a user\n";
  8     exit;
  9   } else {
 10     echo "Helló $PHP_AUTH_USER.<P>";
 11     echo "A megadott jelszavad: $PHP_AUTH_PW.<P>";
 12   }
 13 ?>
 14 
 15     

Egy valós esetben persze nem a $PHP_AUTH_USER és $PHP_AUTH_PW kiírása az elérni kívánt cél, így általában a usernév és jelszó ellenőrzése következik. Természetesen lehetőség van ezt egy adatbázis lekérdezéssel megoldani, vagy egy dbm file-ban utánanézni a szükséges adatoknak.

Figyelj a hibás Internet Explorer böngészőkre, amik nem fogadják el tetszőleges sorrendben a HTTP fejléceket. A tesztek azt mutatják, hogy a WWW-Authenticate elküldése a HTTP/1.0 401 előtt megoldja a problémát.

Mivel a hagyományos HTTP azonosítás során a jelszó rejtett az elért script előtt, a PHP nem állítja be a PHP_AUTH változókat ha az adott file-ra a hagyományos azonosítás is engedélyezett, és így nem deríthető ki a user jelszava. Ebben az esetben a $REMOTE_USER változó tartalmazza a már azonosított felhasználó nevét.

Vedd észre, hogy ez nem küszöböli ki azt a problémát, hogy más nem azonosítás-köteles URL címeken lévő script-ek ugyanazon a szerveren megszerezzék a jelszavakat az azonosított URL-ekről.

A Netscape és az Internet Explorer böngészők törölni fogják a böngésző adott oldalhoz tartozó azonosítási tárát (authentication cache), amennyiben egy 401-es szerver üzenetet kapnak. Ez gyakorlatilag kilépteti a user-t, ami azt jelenti, hogy legközelebb ismét meg kell adnia a nevét és jelszavát. Időnként ezt arra használják, hogy lejárati időt rendelve a belépésekhez egy idő után megszüntessék azokat, vagy egy kilépés gombot biztosítsanak.

Példa 16-2. HTTP azonosítási példa, ami új nevet és jelszót kér

  1 
  2 
  3 <?php
  4   function  azonositas()  {
  5     Header( "WWW-authenticate:  basic  realm='Azonosítási Rendszer Teszt'");
  6     Header( "HTTP/1.0  401  Unauthorized");
  7     echo  "Érvényes user nevet és jelszót kell megadnod, hogy elérd ezt a szolgáltatást!\n";
  8     exit;
  9   }
 10 
 11   if(!isset($PHP_AUTH_USER)  ||  ($JartMarItt ==  1  &&  !strcmp($RegiUser,  $PHP_AUTH_USER))  )  {
 12     azonositas();
 13   }  
 14   else  {
 15     echo  "Helló:  $PHP_AUTH_USER<BR>";
 16     echo  "Régebben:  $RegiUser";
 17     echo  "<FORM  ACTION=\"$PHP_SELF\"  METHOD=POST>\n";
 18     echo  "<INPUT  TYPE=HIDDEN  NAME=\"JartMarItt\"  VALUE=\"1\">\n";
 19     echo  "<INPUT  TYPE=HIDDEN  NAME=\"RegiUser\"  VALUE=\"$PHP_AUTH_USER\">\n";
 20     echo  "<INPUT  TYPE=Submit  VALUE=\"Újraazonosítás\">\n";
 21     echo  "</FORM>\n";
 22 }
 23 ?>
 24 
 25    

A HTTP Basic azonosítási standard nem követeli meg ezt a viselkedést a böngészők részéről, tehát ne építs rá! Lynx-el végzett tesztek azt mutatták, hogy a Lynx nem törli az azonosítási bizonyítványokat a 401-es szerver válasz hatására, tehát egy back és forward lépéssel ismét megnyílik az oldal (feltéve, hogy az azonosítási feltételek nem változtak).

Szintén fontos megjegyezni, hogy ez a módszer nem vezet eredményre, ha Microsoft IIS szervert használsz CGI módú PHP-val, az IIS korlátozásai miatt.