11<?xml version =" 1.0" encoding =" utf-8" ?>
22<!-- $Revision$ -->
3- <!-- EN-Revision: bdf9a4e40204c805f2c2a5c94c2f2f8f5556195a Maintainer: hirokawa Status: ready -->
3+ <!-- EN-Revision: cd4180557a185469a64a7eb26f7be98d0a5f1ebb Maintainer: hirokawa Status: ready -->
44<!-- CREDITS: shimooka,takagi,mumumu -->
55 <chapter xml : id =" features.http-auth" xmlns =" http://docbook.org/ns/docbook" xmlns : xlink =" http://www.w3.org/1999/xlink" >
66 <title >PHP による HTTP 認証</title >
1414 パスワードを入力すると、PHP スクリプトを含むその URL は、次回以降、
1515 <link linkend =" reserved.variables" >定義済みの変数</link >
1616 <varname >PHP_AUTH_USER</varname > と、 <varname >PHP_AUTH_PW</varname > と、
17- <varname >PHP_AUTH_TYPE </varname > にそれぞれユーザー名、
17+ <varname >AUTH_TYPE </varname > にそれぞれユーザー名、
1818 パスワード、認証型が代入された状態で呼ばれます。
1919 定義済みの変数は、配列
2020 <varname >$_SERVER</varname > でアクセス可能です。
2424
2525 <para >
2626 ページ上でクライアント認証を強制するスクリプトの例を以下に示します。
27+ </para >
28+ <para >
2729 <example >
2830 <title >Basic HTTP 認証の例</title >
2931 <programlisting role =" php" >
3032<![CDATA[
3133<?php
3234if (!isset($_SERVER['PHP_AUTH_USER'])) {
33- header("WWW-Authenticate: Basic realm=\"My Realm\"" );
34- header("HTTP/1.0 401 Unauthorized" );
35+ header('HTTP/1.1 401 Unauthorized' );
36+ header('WWW-Authenticate: Basic realm="My Realm"' );
3537 echo "ユーザーがキャンセルボタンを押した時に送信されるテキスト\n";
3638 exit;
3739} else {
@@ -45,12 +47,12 @@ if (!isset($_SERVER['PHP_AUTH_USER'])) {
4547 </para >
4648
4749 <note >
48- <title >互換性に関する注意 </title >
50+ <title >互換性 </title >
4951 <para >
5052 HTTPヘッダ行をコーディングする際には注意を要します。全てのクライアントへの
5153 互換性を最大限に保証するために、キーワード "Basic" には、
5254 大文字の"B"を使用して書くべきです。realm文字列は(一重引用符ではなく)
53- 二重引用符で括る必要があります。また、<emphasis >HTTP/1.0 401</emphasis >
55+ 二重引用符で括る必要があります。また、<emphasis >HTTP/1.1 401</emphasis >
5456 ヘッダ行のコード <emphasis >401</emphasis > の前には、
5557 1つだけ空白を置く必要があります。
5658 認証パラメータは、
@@ -66,15 +68,8 @@ if (!isset($_SERVER['PHP_AUTH_USER'])) {
6668 ユーザーを調べるといったことをすることになるでしょう。
6769 </para >
6870
69- <para >
70- バグのある Internet Explorer ブラウザには注意してください。このブラ
71- ウザは、ヘッダの順序に関してとてもうるさいようです。今のところ、
72- <literal >HTTP/1.0 401</literal > ヘッダの前に
73- <emphasis >WWW-Authenticate</emphasis > ヘッダを送るのが効果があるようです。
74- </para >
75-
7671 <note >
77- <title >設定上の注意 </title >
72+ <title >Apache の設定 </title >
7873 <para >
7974 PHP は、外部認証が動作しているかどうかの判定を
8075 <literal >AuthType</literal > ディレクティブの有無で行います。
@@ -86,62 +81,34 @@ if (!isset($_SERVER['PHP_AUTH_USER'])) {
8681 にある認証を要するURLからパスワードを盗むことを防ぐわけではありませ
8782 ん。
8883 </simpara >
89- <simpara >
90- サーバーからレスポンスコード 401 を受けた際に、Netscape Navigatorおよび
91- Internet Explorer は共にローカルブラウザのウインドウ上の認証キャッシュを
92- 消去します。この機能により、簡単にユーザーを"ログアウト"させ、強制的に
93- ユーザー名とパスワードを再入力させることができます。この機能は、
94- "タイムアウト" 付きのログインや、"ログアウト" ボタンに適用されています。
95- </simpara >
96- <example >
97- <title >新規に名前 / パスワードを入力させる HTTP 認証の例</title >
98- <programlisting role =" php" >
99- <![CDATA[
100- <?php
101- function authenticate() {
102- header('WWW-Authenticate: Basic realm="Test Authentication System"');
103- header('HTTP/1.0 401 Unauthorized');
104- echo "このリソースにアクセスする際には有効なログインIDとパスワードを入力する必要があります。\n";
105- exit;
106- }
10784
108- if (!isset($_SERVER['PHP_AUTH_USER']) ||
109- ($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
110- authenticate();
111- } else {
112- echo "<p>Welcome: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
113- echo "Old: " . htmlspecialchars($_REQUEST['OldAuth']);
114- echo "<form action='' method='post'>\n";
115- echo "<input type='hidden' name='SeenBefore' value='1'>\n";
116- echo "<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
117- echo "<input type='submit' value='Re Authenticate'>\n";
118- echo "</form></p>\n";
119- }
120- ?>
121- ]]>
122- </programlisting >
123- </example >
124- <simpara >
125- この動作は、<literal >HTTP Basic</literal > 認証の標準に基づいていません。よって、この機能に
126- 依存しないように注意する必要があります。<literal >Lynx</literal > によるテストの結果、
127- <literal >Lynx</literal > は、認証証明書を 401 サーバー応答によりクリアしないことが明らかに
128- なっています。このため、back を押してから forward を再度押すことにより
129- 証明書の要件が変更されない限りリソースをオープンすることができます。
130- しかし、ユーザーは <literal >'_'</literal > キーを押すことにより認証情報をクリアすることが可能です。
131- </simpara >
132- <simpara >
133- IIS サーバーと CGI 版の PHP の組み合わせで HTTP 認証を使うには、
134- IIS の設定の "<literal >ディレクトリセキュリティ</literal >" の "<literal >編集</literal >" ボタンを押して
135- "<literal >匿名アクセス</literal >" のみをオンにしてください。
136- その他のフィールドはオフのままにしてください。
137- </simpara >
13885 <note >
139- <title >IIS に関する注意:</title >
86+ <title >ブラウザの挙動</title >
87+ <simpara >
88+ HTTP Basic 認証は非常に基本的なもので、ログアウトをサポートするようには
89+ 設計されていません。HTTP はステートレスなプロトコルであるため、
90+ ほとんどのブラウザは <literal >2xx</literal > ステータスコードを受け取ると
91+ すぐに認証情報をキャッシュし、ブラウザを閉じるまですべてのリクエストで
92+ その認証情報を送信し続けます。サーバーが認証情報の再入力を求める
93+ プロンプトを要求するための標準的な方法は定義されていません。
94+
95+ 長年にわたり、この問題に対するさまざまな回避策がインターネット上で
96+ 広まってきましたが、それらはすべて、異なるブラウザが未定義のエッジケース
97+ (あるいは HTTP 標準の違反さえも)をどのように処理するかに依存しています。
98+ このような回避策は避け、Basic 認証を重要な用途に使用しないことが最善です。
99+ </simpara >
100+ </note >
101+
102+ <note >
103+ <title >IIS の設定</title >
140104 <simpara >
141- IIS上 で HTTP 認証を使用する場合、PHP の
142- <link linkend =" ini.cgi.rfc2616-headers" >cgi.rfc2616_headers</link >
143- ディレクティブは<literal >0</literal > (デフォルト値) にセットされて
144- いなければなりません。
105+ IIS サーバーと CGI 版の PHP の組み合わせで HTTP 認証を使うには、
106+ php.ini ディレクティブ <link linkend =" ini.cgi.rfc2616-headers" >cgi.rfc2616_headers</link >
107+ を <literal >0</literal > (デフォルト値) に設定し、IIS の設定の
108+ "<literal >ディレクトリセキュリティ</literal >" を編集する必要があります。
109+ "<literal >編集</literal >" ボタンを押して
110+ "<literal >匿名アクセス</literal >" のみをオンにしてください。
111+ その他のフィールドはオフのままにしてください。
145112 </simpara >
146113 </note >
147114
0 commit comments