Forum und email

HTTP authenticatie met PHP

De HTTP Authenticatie functies in PHP zijn alleen te gebruiken als PHP gebruikt wordt als Apache module en is zijn NIET te gebruiken in de CGI versie. In een PHP script is het dan mogelijk, met de header() functie, een "Authentication Required" bericht naar de browser te sturen. Dit veroorzaakt dat de browser een "Login/Password" invul window aan de gebruiker laat zien. Zo gauw de gebruiker een login naam en een password heeft ingevuld wordt de URL met het PHP script dat de header stuurde opnieuw aangeroepen. Nu zijn de variablen $PHP_AUTH_USER, $PHP_AUTH_PW en $PHP_AUTH_TYPE gevuld met de waarden die de gebruiker heeft ingevuld. Op dit moment word alleen de "Basic" authenticatie ondersteund. Zie de header() functie voor meer informatie.

Dit voorbeeld script dwingt gebruikers authenticatie af:

Example#1 HTTP Authentication voorbeeld

<?php
  
if(!isset($PHP_AUTH_USER)) {
    
Header("WWW-Authenticate: Basic realm=\"Mijn Realm\"");
    
Header("HTTP/1.0 401 Unauthorized");
    echo 
"Tekst om te sturen als de gebruiker op Annuleren klikt.\n";
    exit;
  } else {
    echo 
"Hallo $PHP_AUTH_USER.<P>";
    echo 
"Je gebruikte $PHP_AUTH_PW als je password.<P>";
  }
?>

In plaats van slechts de ingevoerde waarden aan de gebruiker te laten zien, wil je waarschijnlijk $PHP_AUTH_USER en $PHP_AUTH_PW gebruiken om de gebruiker te valideren tegen bijvoorbeeld een database.

Kijk uit voor buggy Internet Explorer browsers. Sommige zijn erg nauwkeurig over de volgorde dat de headers gestuurd worden. Door eerst de WWW-Authenticate header te sturen en dan de HTTP/1.0 401 header lijkt het probleem opgelost te zijn.

Om te voorkomen dat iemand een script schrijft die de wachtwoorden achterhaald van iemand die al eerder geauthenticeerd was door middel van het externe authenticatie systeem worden de PHP_AUTH_* variabelen niet gevuld als er gebruik word gemaakt van het externe authenticatie systeem voor die bepaalde pagina. In dit geval kan de variabele $REMOTE_USER gebruikt worden om de extern geauthenticeerde gebruiker te identificeren.

Dit weerhoudt iemand er echter niet van om wachtwoorden te stelen via een niet-geauthenticeerde URL op dezelfde server.

Zowel Netscape als Internet Explorer zullen hun huidige cache in het huidige Window legen wanneer ze een 401 header van de server krijgen. Op deze manier kan je op een efficiente manier een gebruiker "uit loggen". Sommige mensen gebruiken dit om een login te laten verlopen of gebruiken dit met een "log-out" knop.

Example#2 HTTP Authentication voorbeeld welke een nieuwe loginnaam en wachtwoord vereist.

<?php
  
function authenticate() {
    
Header"WWW-Authenticate: Basic realm=\"Test Authentication Systeem\"");
    
Header"HTTP/1.0 401 Unauthorized");
    echo 
"Je moet een geldige login en wachtwoord opgeven om bij ".
    
"deze pagina te komen\n";
    exit;
  }
 
  if(!isset(
$PHP_AUTH_USER) || ($EerderGezien == && !strcmp($VorigeNaam$PHP_AUTH_USER)) ) {
   
authenticate();
  } 
  else {
   echo 
"Welcome: $PHP_AUTH_USER<BR>";
   echo 
"Old: $VorigeNaam";
   echo 
"<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n";
   echo 
"<INPUT TYPE=HIDDEN NAME=\"EerderGezien\" VALUE=\"1\">\n";
   echo 
"<INPUT TYPE=HIDDEN NAME=\"VorigeNaam\" VALUE=\"$PHP_AUTH_USER\">\n";
   echo 
"<INPUT TYPE=Submit VALUE=\"Opnieuw inloggen\">\n";
   echo 
"</FORM>\n";
  }
?>

Dit gedrag is niet vereist voor de HTTP Basic authenticatie standaard, dus je moet hier nooit op vertrouwen. Tests met de Lynx browser wijzen uit dat Lynx zijn cache NIET leegt als hij een 401 header van de server krijgt. Dus als je 'back' en 'forward' gaat krijg je gewoon de pagina te zien met de eerder ingevoerde waarden (Tenzij de login voorwaarden zijn gewijzigd).

Let op: Dit werkt niet met Microsoft's IIS server en de CGI versie van PHP vanwege een gebrek in IIS.