<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/features.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'features.http-auth.php',
    1 => 'PHP による HTTP 認証',
    2 => 'PHP による HTTP 認証',
  ),
  'up' => 
  array (
    0 => 'features.php',
    1 => '機能',
  ),
  'prev' => 
  array (
    0 => 'features.php',
    1 => '機能',
  ),
  'next' => 
  array (
    0 => 'features.cookies.php',
    1 => 'クッキー(Cookies)',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'features/http-auth.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.http-auth" class="chapter">
  <h1 class="title">PHP による HTTP 認証</h1>


  <p class="simpara">
   <span class="function"><a href="function.header.php" class="function">header()</a></span> 関数を使うと、
   <code class="literal">&quot;Authentication Required&quot;</code>
   メッセージをクライアントブラウザに送ることができます。
   これにより、クライアントブラウザではユーザー名とパスワードの入力要求
   ウインドウがポップアップ表示されます。一度、ユーザーがユーザー名と
   パスワードを入力すると、PHP スクリプトを含むその URL は、次回以降、
   <a href="reserved.variables.php" class="link">定義済みの変数</a>
   <var class="varname">PHP_AUTH_USER</var> と、 <var class="varname">PHP_AUTH_PW</var> と、
   <var class="varname">AUTH_TYPE</var> にそれぞれユーザー名、
   パスワード、認証型が代入された状態で呼ばれます。
   定義済みの変数は、配列
   <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER</a></var> でアクセス可能です。
   &quot;Basic&quot; 認証 <em>のみ</em> がサポートされています。詳細は、
   <span class="function"><a href="function.header.php" class="function">header()</a></span>を参照ください。
  </p>

  <p class="para">
   ページ上でクライアント認証を強制するスクリプトの例を以下に示します。
  </p>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>例1 Basic HTTP 認証の例</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (!isset(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_USER'</span><span style="color: #007700">])) {<br />    </span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'HTTP/1.1 401 Unauthorized'</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'WWW-Authenticate: Basic realm="My Realm"'</span><span style="color: #007700">);<br />    echo </span><span style="color: #DD0000">"ユーザーがキャンセルボタンを押した時に送信されるテキスト\n"</span><span style="color: #007700">;<br />    exit;<br />} else {<br />    echo </span><span style="color: #DD0000">"&lt;p&gt;こんにちは、</span><span style="color: #007700">{</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_USER'</span><span style="color: #007700">]}</span><span style="color: #DD0000"> さん。&lt;/p&gt;"</span><span style="color: #007700">;<br />    echo </span><span style="color: #DD0000">"&lt;p&gt;あなたは、</span><span style="color: #007700">{</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_AUTH_PW'</span><span style="color: #007700">]}</span><span style="color: #DD0000"> をパスワードとして入力しました。&lt;/p&gt;"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>

  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <strong>互換性</strong><br />
   <p class="para">
    HTTPヘッダ行をコーディングする際には注意を要します。全てのクライアントへの
    互換性を最大限に保証するために、キーワード &quot;Basic&quot; には、
    大文字の&quot;B&quot;を使用して書くべきです。realm文字列は(一重引用符ではなく)
    二重引用符で括る必要があります。また、<em>HTTP/1.1 401</em>
    ヘッダ行のコード <em>401</em> の前には、
    1つだけ空白を置く必要があります。
    認証パラメータは、
    カンマ区切りで指定しなければなりません。
   </p>
  </p></blockquote>

  <p class="para">
   単に <var class="varname">PHP_AUTH_USER</var>および<var class="varname">PHP_AUTH_PW</var>
   を出力するのではなく、ユーザー名とパスワードの有効性をチェックしたいと
   思うかもしれません。
   その場合、クエリーをデータベースに送るか、ある dbm ファイル中の
   ユーザーを調べるといったことをすることになるでしょう。
  </p>

  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <strong>Apache の設定</strong><br />
   <p class="para">
    PHP は、外部認証が動作しているかどうかの判定を
    <code class="literal">AuthType</code> ディレクティブの有無で行います。
   </p>
  </p></blockquote>

  <p class="simpara">
   しかし、上記の機能も、認証を要求されないURLを管理する人が同じサーバー
   にある認証を要するURLからパスワードを盗むことを防ぐわけではありませ
   ん。
  </p>

  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <strong>ブラウザの挙動</strong><br />
   <span class="simpara">
    HTTP Basic 認証は非常に基本的なもので、ログアウトをサポートするようには
    設計されていません。HTTP はステートレスなプロトコルであるため、
    ほとんどのブラウザは <code class="literal">2xx</code> ステータスコードを受け取ると
    すぐに認証情報をキャッシュし、ブラウザを閉じるまですべてのリクエストで
    その認証情報を送信し続けます。サーバーが認証情報の再入力を求める
    プロンプトを要求するための標準的な方法は定義されていません。

    長年にわたり、この問題に対するさまざまな回避策がインターネット上で
    広まってきましたが、それらはすべて、異なるブラウザが未定義のエッジケース
    （あるいは HTTP 標準の違反さえも）をどのように処理するかに依存しています。
    このような回避策は避け、Basic 認証を重要な用途に使用しないことが最善です。
   </span>
  </p></blockquote>

  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <strong>IIS の設定</strong><br />
   <span class="simpara">
    IIS サーバーと CGI 版の PHP の組み合わせで HTTP 認証を使うには、
    php.ini ディレクティブ <a href="ini.core.php#ini.cgi.rfc2616-headers" class="link">cgi.rfc2616_headers</a>
    を <code class="literal">0</code> (デフォルト値) に設定し、IIS の設定の
    &quot;<code class="literal">ディレクトリセキュリティ</code>&quot; を編集する必要があります。
    &quot;<code class="literal">編集</code>&quot; ボタンを押して
    &quot;<code class="literal">匿名アクセス</code>&quot; のみをオンにしてください。
    その他のフィールドはオフのままにしてください。
   </span>
  </p></blockquote>

 </div>
<?php manual_footer($setup); ?>