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:
Voorbeeld 17-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.
Voorbeeld 17-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 == 1 && !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.