-
Notifications
You must be signed in to change notification settings - Fork 157
/
Copy pathhttp-auth.xml
183 lines (172 loc) · 6.75 KB
/
http-auth.xml
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: bdf9a4e40204c805f2c2a5c94c2f2f8f5556195a Maintainer: yannick Status: ready -->
<!-- Reviewed: yes -->
<chapter xml:id="features.http-auth" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Identification HTTP avec PHP</title>
<simpara>
Il est possible d'utiliser la fonction <function>header</function> pour demander
une identification (<literal>"Authentication Required"</literal>) 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 <link linkend="reserved.variables">variables prédéfinies</link>
<varname>PHP_AUTH_USER</varname>, <varname>PHP_AUTH_PW</varname> et
<varname>AUTH_TYPE</varname> 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
<varname>$_SERVER</varname>.
<emphasis>Seulement</emphasis> les méthodes d'identification simple ("Basic")
est supportée. Reportez-vous à la fonction
<function>header</function> pour plus d'informations.
</simpara>
<para>
Voici un exemple de script qui force l'identification du client
pour accéder à une page :
</para>
<para>
<example>
<title>Exemple d'identification HTTP simple</title>
<programlisting role="php">
<![CDATA[
<?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>";
}
?>
]]>
</programlisting>
</example>
</para>
<note>
<title>Note de compatibilité</title>
<para>
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 double guillemets (pas des simples), et exactement un espace doit
précéder le code <emphasis>401</emphasis> dans l'en-tête
<emphasis>HTTP/1.0 401</emphasis>. Les paramètres d'authentification doivent
être séparés par des virgules.
</para>
</note>
<para>
Au lieu d'afficher simplement les variables globales <varname>PHP_AUTH_USER</varname>
et <varname>PHP_AUTH_PW</varname>, 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.
</para>
<para>
Méfiez-vous des navigateurs bogués, tels qu'Internet Explorer.
Ils semblent très susceptibles en ce qui concerne l'ordre des en-têtes.
Envoyer l'en-tête d'identification (<emphasis>WWW-Authenticate</emphasis>)
avant le code de <literal>HTTP/1.0 401</literal> semble lui convenir
jusqu'à présent.
</para>
<note>
<title>Note de configuration</title>
<para>
PHP utilise la présence de la directive <literal>AuthType</literal>
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).
</para>
</note>
<simpara>
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.
</simpara>
<simpara>
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.
</simpara>
<para>
<example>
<title>Identification HTTP avec nom d'utilisateur/mot de passe forcé</title>
<programlisting role="php">
<![CDATA[
<?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 valides 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 : " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo "Ancien : " . htmlspecialchars($_REQUEST['OldAuth']);
echo "<form action='' method='post'>\n";
echo "<input type='hidden' name='SeenBefore' value='1' />\n";
echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo "<input type='submit' value='Re Authenticate' />\n";
echo "</form></p>\n";
}
?>
]]>
</programlisting>
</example>
</para>
<simpara>
Ce comportement n'est pas nécessaire par le standard
d'identification <literal>HTTP Basic</literal>. Les tests avec
<literal>Lynx</literal> 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"
à un client <literal>Lynx</literal>
précédemment identifié donnera l'accès direct à
la ressource. Cependant, l'utilisateur peut utiliser la touche
<literal>'_'</literal> pour détruire les anciennes identifications.
</simpara>
<simpara>
Afin de rendre fonctionnel l'authentification HTTP avec un serveur IIS avec
la version CGI de PHP, vous devez éditer
votre configuration "<literal>Directory Security</literal>". Cliquez
sur "<literal>Edit</literal>" et activez uniquement
"<literal>Anonymous Access</literal>", tous les autres champs doivent
être laissés non actifs.
</simpara>
<note>
<title>Note pour les utilisateurs de IIS :</title>
<simpara>
Pour que l'identification HTTP fonctionne avec IIS, la directive PHP
<link linkend="ini.cgi.rfc2616-headers">cgi.rfc2616_headers</link>
doit être définie à &zero; (la valeur par défaut).
</simpara>
</note>
</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:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->