1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
<?xml version="1.0" encoding="iso-8859-1"?>
<chapter id="features.http-auth">
<title>HTTP authenticatie met PHP</title>
<simpara>
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
<function>header</function> 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
<function>header</function> functie voor meer informatie.</simpara>
<para>
Dit voorbeeld script dwingt gebruikers authenticatie af:
<example>
<title>HTTP Authentication voorbeeld</title>
<programlisting role="php">
<?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>";
}
?>
</programlisting>
</example></para>
<para>
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.
</para>
<para>
Kijk uit voor buggy Internet Explorer browsers. Sommige zijn
erg nauwkeurig over de volgorde dat de headers gestuurd worden.
Door eerst de <emphasis>WWW-Authenticate</emphasis> header te sturen
en dan de <errorcode>HTTP/1.0 401</errorcode> header lijkt het probleem
opgelost te zijn.</para>
<simpara>
Om te voorkomen dat iemand een script schrijft die de wachtworden
achterhaald van iemand die al eerder geauthenticeerd was door middel
van het externe authenticatie systeem worden de PHP_AUTH_* variablen
niet gevuld als er gebruik word gemaakt van het externe authenticatie
systeem voor die bepaalde pagina. In dit geval kan de variable
$REMOTE_USER gebruikt worden om de extern geauthenticeerde gebruiker
te identificeren.
</simpara>
<simpara>
Dit weerhoud iemand er echter niet van om wachtwoorden te stelen
via een niet-geauthenticeerde URL op dezelfde server.
</simpara>
<simpara>
Zowel Netscape als Internet Explorer zullen hun huidige cache in het
huidige Window legen zogauw 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.</simpara>
<simpara></simpara>
<example>
<title>HTTP Authentication voorbeeld welke een nieuwe loginnaam
en password vereist.</title>
<programlisting role="php">
<?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";
}
?>
</programlisting>
</example>
<simpara>
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).
</simpara>
<simpara>
Let op: Dit werkt niet met Microsoft's IIS server en de CGI versie
van PHP vanwege een gebrek in IIS.</simpara>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"../manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->
|