7 Caractéristiques
Manuel PHP
->Identification HTTP avec PHP . Cookies . Sessions . Utiliser les XForms . Gestion des chargements de fichier . Utilisation des fichiers à distance . Gestion des connexions . Connexions persistantes aux bases de données . Safe mode . Utiliser PHP en ligne de commande
|
7.1 Identification HTTP avec PHP
Les fonctions d'identification
HTTP
de PHP ne sont disponibles
que si PHP est exécuté comme module Apache, et non
pas sous la forme d'un CGI. Sous cette forme, il est possible
d'utiliser la fonction
header
pour demander
une identification (
"Authentication Required"
) au client,
générant ainsi l'apparition d'une fenêtre
de demande d'utilisateur et de mot de passe. Une fois que les
champs ont été remplis, l'URL sera de nouveau
appelée, avec les variables
PHP_AUTH_USER
,
PHP_AUTH_PW
et
AUTH_TYPE
contenant respectivement le nom d'utilisateur, le mot de passe et
le type d'identification. Ces variables prédéfinies sont trouvées dans les tableaux
$_SERVER et
$HTTP_SERVER_VARS
.
Les méthodes d'identification simple ("Basic") et de type "Digest" (depuis PHP 5.1.0)
sont supportées. Reportez-vous à la fonction
header
pour plus d'informations.
Note | Note sur les versions de PHP
Les auto-globales ,
telles que $_SERVER ,
ont été ajoutée en PHP à partir de la version
4.1.0 .
$HTTP_SERVER_VARS
est disponible depuis PHP 3.
|
Voici un exemple de script qui force l'identification du client
pour accéder à une page :
Exemple d'identification HTTP simple |
<?php if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="My Realm"'); header('HTTP/1.0 401 Unauthorized'); echo 'Texte utilisé si le visiteur utilise le bouton d\'annulation'; exit; } else { echo "<p>Bonjour, {$_SERVER['PHP_AUTH_USER']}.</p>"; echo "<p>Votre mot de passe est {$_SERVER['PHP_AUTH_PW']}.</p>"; } ?>
|
Exemple d'identification HTTP Digest |
Cet exemple montre comment appliquer l'utilisation d'un script
d'identification HTTP de type "Digest". Pour plus d'information,
lisez la documentation RFC 2617 .
|
Note | Note de compatibilité
Soyez bien prudent lorsque vous utilisez des en-têtes HTTP avec PHP. Afin de
garantir un maximum de compatibilité entre les navigateurs, le mot clé
"Basic" doit être écrit avec un B majuscule, et le texte de présentation
doit être placé entre guillemets simples, et exactement un espace doit
précéder le code
401
dans l'en-tête
HTTP/1.0 401
.
|
Au lieu d'afficher simplement les variables globales
PHP_AUTH_USER
et
PHP_AUTH_PW
, vous préférerez sûrement
vérifier la validité du nom d'utilisateur et du mot de passe.
Par exemple, en envoyant ces informations à une base de données,
ou en recherchant dans un fichier dbm.
Méfiez-vous des navigateurs bogués, tels que Internet Explorer.
Ils semblent très susceptibles concernant l'ordre des en-têtes.
Envoyer l'en-tête d'identification (
WWW-Authenticate
)
avant le code de
HTTP/1.0 401
semble lui convenir
jusqu'à présent.
Pour éviter que quelqu'un écrive un script qui
révèle les mots de passe d'une page, à la
quelle on a accédé par une identification traditionnelle,
les variables globales PHP_AUTH ne seront pas assignées si
l'identification externe a été activée pour
cette page. Dans ce cas, la variable
REMOTE_USER
peut être
utilisée pour identifier l'utilisateur à l'extérieur.
De même que
$_SERVER['REMOTE_USER']
.
Note | Note de configuration
PHP utilise la présence de la directive
AuthType
pour déterminer si une identification externe est activée.
Évitez donc cette directive de contexte si vous voulez utiliser
l'identification de PHP (sinon, les deux identifications se contrediront,
et échoueront).
|
Notez cependant que les manipulations ci-dessus n'empêchent
pas quiconque possède une page non identifiée
de voler les mots de passe des pages protégées,
sur le même serveur.
Netscape et Internet Explorer effaceront le cache d'identification client
s'ils reçoivent une réponse 401. Cela permet de déconnecter
un utilisateur, pour le forcer à saisir à nouveau son nom de compte
et son mot de passe. Certains programmeurs l'utilisent pour donner un
délai d'expiration, ou alors, fournissent un bouton de déconnexion.
Identification HTTP avec nom d'utilisateur/mot de passe forcé |
<?php function authenticate() { header('WWW-Authenticate: Basic realm="Test Authentication System"'); header('HTTP/1.0 401 Unauthorized'); echo "Vous devez entrer un identifiant et un mot de passe valide pour accéder à cette ressource.\n"; exit; }
if ( !isset($_SERVER['PHP_AUTH_USER']) || ($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) { authenticate(); } else { echo "<p>Bienvenue : {$_SERVER['PHP_AUTH_USER']}<br />"; echo "Ancien : {$_REQUEST['OldAuth']}"; echo "<form action=\"{$_SERVER['PHP_SELF']}\" method=\"post\">\n"; echo "<input type=\"hidden\" name=\"SeenBefore\" value=\"1\">\n"; echo "<input type=\"hidden\" name=\"OldAuth\" value=\"{$_SERVER['PHP_AUTH_USER']}\">\n"; echo "<input type=\"submit\" value=\"Identification\">\n"; echo "</form></p>\n"; } ?>
|
Ce comportement n'est pas nécessaire par le standard
d'identification
HTTP Basic
. Les tests avec
Lynx
ont montré qu'il n'affectait
pas les informations de session lors de la réception d'un
message de type 401. Ce qui fait que presser la touche "retour"
(
back
) à un client
Lynx
précédemment identifié donnera l'accès direct à
la ressource. Cependant, l'utilisateur peut utiliser la touche
'_'
pour détruire les anciennes identifications.
Notez également que avant PHP 4.3.3, l'identification HTTP ne fonctionne
pas sous le serveur Mircosoft IIS avec la version CGI de PHP dû à une
limitation de IIS. Pour que cela fonctionne en PHP 4.3.3+, vous devez éditer
votre configuration de IIS "
Directory Security
". Cliquez
sur "
Edit
" et activez uniquement
"
Anonymous Access
", tous les autres champs doivent
être laissés non actifs.
Une autre limitation si vous utilisez le module IIS (ISAPI) et PHP 4, vous ne devez
pas utiliser les variables
PHP_AUTH_*
mais à la place,
la variable
HTTP_AUTHORIZATION
est disponible. Par exemple,
utilisez le code suivant :
list($user, $pw) = explode(':',
base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Note | Note pour les utilisateurs de IIS :
Pour que l'identification HTTP fonctionne avec IIS, la directive PHP
cgi.rfc2616_headers
doit être définie à
0
(la valeur par défaut).
|
Note |
Si le safe mode est activé, le
uid
de ce script est ajouté à la partie
realm
des en-têtes
WWW-Authenticate
.
|
|