Www-authenticate avec php en mode cgi

Contenu du snippet

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
Le code suivant est à placé en début de vos pages à protéger
(Ce script utilise la fonction header --> rien ne peut etre affiché avant)

Source / Exemple :


<?
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é");
}

...
Le restant de votre page
...
?>

Conclusion :


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 pour invalider l'authentification au cas ou quelqu'un arriverait à copier l'URL

Notez que vous pouvez toujours accéder a une page sécurisée de la façon suivante http://User:Password@www.site.com/page.php
Ceci est une régle générale pour tout les serveurs web !

JH

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.