Les
fonctions
d'
authentification
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(
)
Sous
cette
forme
,
il
est
possible
d'utiliser
la
fonction
header(
)
pour
demander
une
authentification
("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
$PHP_AUTH_TYPE
contenant
respectivement
le
nom
d'utilisateur
,
le
mot
de
passe
et
le
type
d
'authentification
.
Actuellement
,
seule
l'
authentification
simple
("Basic"
)
est
supportée
.
Reportez-vous
à
la
fonction
header(
)
pour
plus
d
'informations
.
Voici
un
exemple
de
script
qui
force
l
'
authentification
du
client
pour
accéder
à
une
page
:
Exemple
16-1
.
Exemple
d
'
authentification
HTTP
?php
if(
!isset($PHP_AUTH_USER)
)
{
Header(
"WWW-Authenticate
:
Basic
realm=\"
My
Realm\"")
;
Header("HTTP
/
1.0 401
Unauthorized")
;
echo
"Texte
à
envoyer
si
le
client
appuie
sur
le
bouton
d'annulation\n"
;
exit
;
}
else
{
echo
"Bonjour
$PHP_AUTH_USER
.
P
"
echo
"Vous
avez
entré
le
mot
de
passe
$PHP_AUTH_PW
.
P
"
}
?
|
|
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
buggés
,
tels
que
Internet
Explorer
.
Ils
semblent
très
susceptibles
concernant
l
'
ordre
des
en-têtes
.
Envoyer
l'
en-tête
d'authentification
(
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
authentification
traditionnelle
,
les
variables
globales
PHP_AUTH
ne
seront
pas
assignées
si
l
'authentification
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
.
Notez
cependant
que
les
manipulations
ci-dessus
n
'
empêchent
pas
quiconque
possède
une
page
non
authentifié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'
authentification
client
s
'ils
recoivent
une
réponse
401
.
Cela
permet
de
déconnecter
un
utilisateur
,
pour
le
forcer
à
ré-entrer
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
.
Exemple
16-2
.
Authentification
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
nom
d'utilisateur
valide
et
un
mot
de
passe
correct
pour
accéder
à
cette
ressource\n"
;
exit
;
}
if(!isset($PHP_AUTH_USER
)
|
|
($SeenBefore
==
1
!strcmp($OldAuth
,
$PHP_AUTH_USER)
)
)
{
authenticate()
;
}
else
{
echo
"Bienvenue
$PHP_AUTH_USER
BR
"
;
echo
"Old
:
$OldAuth"
;
echo
"
form
action=\"$PHP_SELF\
"
method=post
\n"
;
echo
"
input
type=hidden
NAME=\"SeenBefore\
"
VALUE=\"1\
"
\n"
;
echo
"
input
type=hidden
NAME=\"OldAuth\
"
VALUE=\"$PHP_AUTH_USER\
"
\n"
;
echo
"
input
type=submit
value=\"Re
Authenticate\
"
\n
"
echo
"
/
FORM
\n"
;
}
?
|
|
Ce
comportement
n'
est
pas
nécessaire
par
le
standard
d
'authentification
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
authentifié
donnera
l
'accès
direct
à
la
ressource
.
Cependant
,
l'
utilisateur
peut
utiliser
la
touche
'_
'
pour
détruire
les
anciennes
authentifications
.
Notez
aussi
que
tout
ceci
ne
fonctionne
pas
sous
Microsoft
IIS
et
que
les
limitations
de
PHP
en
version
CGI
sont
dues
aux
limitations
de
IIS
.