-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathhttp-auth.xml
166 lines (156 loc) · 7.45 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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: bdf9a4e40204c805f2c2a5c94c2f2f8f5556195a Maintainer: hirokawa Status: ready -->
<!-- CREDITS: shimooka,takagi,mumumu -->
<chapter xml:id="features.http-auth" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>PHP による HTTP 認証</title>
<simpara>
<function>header</function> 関数を使うと、
<literal>"Authentication Required"</literal>
メッセージをクライアントブラウザに送ることができます。
これにより、クライアントブラウザではユーザー名とパスワードの入力要求
ウインドウがポップアップ表示されます。一度、ユーザーがユーザー名と
パスワードを入力すると、PHP スクリプトを含むその URL は、次回以降、
<link linkend="reserved.variables">定義済みの変数</link>
<varname>PHP_AUTH_USER</varname> と、 <varname>PHP_AUTH_PW</varname> と、
<varname>PHP_AUTH_TYPE</varname> にそれぞれユーザー名、
パスワード、認証型が代入された状態で呼ばれます。
定義済みの変数は、配列
<varname>$_SERVER</varname> でアクセス可能です。
"Basic" 認証 <emphasis>のみ</emphasis> がサポートされています。詳細は、
<function>header</function>を参照ください。
</simpara>
<para>
ページ上でクライアント認証を強制するスクリプトの例を以下に示します。
<example>
<title>Basic HTTP 認証の例</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 "ユーザーがキャンセルボタンを押した時に送信されるテキスト\n";
exit;
} else {
echo "<p>こんにちは、{$_SERVER['PHP_AUTH_USER']} さん。</p>";
echo "<p>あなたは、{$_SERVER['PHP_AUTH_PW']} をパスワードとして入力しました。</p>";
}
?>
]]>
</programlisting>
</example>
</para>
<note>
<title>互換性に関する注意</title>
<para>
HTTPヘッダ行をコーディングする際には注意を要します。全てのクライアントへの
互換性を最大限に保証するために、キーワード "Basic" には、
大文字の"B"を使用して書くべきです。realm文字列は(一重引用符ではなく)
二重引用符で括る必要があります。また、<emphasis>HTTP/1.0 401</emphasis>
ヘッダ行のコード <emphasis>401</emphasis> の前には、
1つだけ空白を置く必要があります。
認証パラメータは、
カンマ区切りで指定しなければなりません。
</para>
</note>
<para>
単に <varname>PHP_AUTH_USER</varname>および<varname>PHP_AUTH_PW</varname>
を出力するのではなく、ユーザー名とパスワードの有効性をチェックしたいと
思うかもしれません。
その場合、クエリーをデータベースに送るか、ある dbm ファイル中の
ユーザーを調べるといったことをすることになるでしょう。
</para>
<para>
バグのある Internet Explorer ブラウザには注意してください。このブラ
ウザは、ヘッダの順序に関してとてもうるさいようです。今のところ、
<literal>HTTP/1.0 401</literal> ヘッダの前に
<emphasis>WWW-Authenticate</emphasis> ヘッダを送るのが効果があるようです。
</para>
<note>
<title>設定上の注意</title>
<para>
PHP は、外部認証が動作しているかどうかの判定を
<literal>AuthType</literal> ディレクティブの有無で行います。
</para>
</note>
<simpara>
しかし、上記の機能も、認証を要求されないURLを管理する人が同じサーバー
にある認証を要するURLからパスワードを盗むことを防ぐわけではありませ
ん。
</simpara>
<simpara>
サーバーからレスポンスコード 401 を受けた際に、Netscape Navigatorおよび
Internet Explorer は共にローカルブラウザのウインドウ上の認証キャッシュを
消去します。この機能により、簡単にユーザーを"ログアウト"させ、強制的に
ユーザー名とパスワードを再入力させることができます。この機能は、
"タイムアウト" 付きのログインや、"ログアウト" ボタンに適用されています。
</simpara>
<example>
<title>新規に名前 / パスワードを入力させる HTTP 認証の例</title>
<programlisting role="php">
<![CDATA[
<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo "このリソースにアクセスする際には有効なログインIDとパスワードを入力する必要があります。\n";
exit;
}
if (!isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
echo "<p>Welcome: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo "Old: " . 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>
<simpara>
この動作は、<literal>HTTP Basic</literal> 認証の標準に基づいていません。よって、この機能に
依存しないように注意する必要があります。<literal>Lynx</literal> によるテストの結果、
<literal>Lynx</literal> は、認証証明書を 401 サーバー応答によりクリアしないことが明らかに
なっています。このため、back を押してから forward を再度押すことにより
証明書の要件が変更されない限りリソースをオープンすることができます。
しかし、ユーザーは <literal>'_'</literal> キーを押すことにより認証情報をクリアすることが可能です。
</simpara>
<simpara>
IIS サーバーと CGI 版の PHP の組み合わせで HTTP 認証を使うには、
IIS の設定の "<literal>ディレクトリセキュリティ</literal>" の "<literal>編集</literal>" ボタンを押して
"<literal>匿名アクセス</literal>" のみをオンにしてください。
その他のフィールドはオフのままにしてください。
</simpara>
<note>
<title>IIS に関する注意:</title>
<simpara>
IIS上 で HTTP 認証を使用する場合、PHP の
<link linkend="ini.cgi.rfc2616-headers">cgi.rfc2616_headers</link>
ディレクティブは<literal>0</literal> (デフォルト値) にセットされて
いなければなりません。
</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:
-->