Si vous utilisez l'instruction Header("WWW-Authenticate: . . . pour authentifier les utilisateurs sur votre site, cela ne fonctionne que si PHP tourne comme module d' Apache.
Le user et le mot de passe sont retournées dans les variables PHP_AUTH_USER et $PHP_AUTH_PW
Cette configuration de PHP est cependant cause d'instabilités du serveur et de nombreux hébergeurs propose des solutions avec PHP s'exécutant en CGI.
Lors de l'exécution en mode CGI, PHP ne sait pas récupérer les informations d'authentification d'Apache et les deux variables restent non affectée.
Voici donc un moyen détourné de récupérer cette information.
Placez dans la racine de votre site un fichier .htaccess avec le code suivant (ou ajoutez le au fichier existant
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^Basic.*
RewriteRule (.*) $1?Authorization=%{HTTP:Authorization} [QSA,L]
Le script d'authentification à placer en début de vos pages à sécuriser
if (preg_match('/Basics+(.*)$/i', $_GET['Authorization'], $Authorization))
{
list($Auth_Name, $Auth_Pwrd) = explode(':', base64_decode($Authorization[1]));
if (($Auth_Name!="MonUser") || ($Auth_Pwrd!="MonPass")) // Faire ici votre test
{
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
die("Access refusé");
}
}
else
{
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
die("Access refusé");
}
Une variante pour empêcher l'appel direct de la page avec le paramètre d'authentification est d'utiliser dans le .htaccess
RewriteRule (.*) $1?%{ENV:UNIQUE_ID}=%{HTTP:Authorization} [QSA,L]
Et dans le script
preg_match('/Basics+(.*)$/i', $_GET[$_ENV['UNIQUE_ID']], $Authorization))
De cette façon, vous utilisez une variable de nom aléatoire généré à partir d' UNIQUE_ID'
Notez que vous pouvez toujours accéder a une page sécurisée de la façon suivante
www.site.com/page.php" title="http://User:Password@
www.site.com/page.php" target="_blank">http://User:Password@
www.site.com/page.php
JH