PHPで基本的なHTTP認証を使用するにはどうすればよいですか?
質問
私は使用しようとしています 基本的なHTTP認証 PHPマニュアルページの例に従いました。しかし、それは私にとってはうまくいきません。変数 $_SERVER['PHP_AUTH_USER']
設定されていないようです。ユーザーがログインしようとすると、ユーザーは新しいログインダイアログのプロンプトが表示されます。サーバーはPHP 5.3.3を実行しており、Google ChromeとInternet Explorerで試しました。
これが私が使用した簡単な例です。
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Jonas Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'User pressed Cancel';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as you password.</p>";
}
?>
なにが問題ですか? PHPで基本的なHTTP認証を使用するにはどうすればよいですか?
解決
PHPはどのように実行されていますか? Apache mod_cgiを介している場合、認証情報をまったく手に入れることができないのではないかと心配しています。 Apacheは、CGIアプリをコンパイルしない限り、CGIアプリに渡すことはありません。 SECURITY_HOLE_PASS_AUTHORIZATION
国旗。 (実際にセキュリティホールであるかどうかは、サーバー上の他のユーザーがWebサイトユーザーよりも低いまたは大きい特権を持っているかどうかによって異なります。)
IIS CGIの場合、「匿名」ディレクトリアクセスのみが構成されていることを確認する必要があります。または、IISが資格情報をステップインして認証しようとする必要があります。
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
HTML-Injectionセキュリティホール(まあ、それが機能した場合)。使用する htmlspecialchars()
. 。男は、非常に疑わしいアドバイスとコードでいっぱいのPHPドキュメントページです。
あなたは見てみることができます $_SERVER['HTTP_AUTHORIZATION']
同様に、私はそれがmod_cgiの問題であると思われますが、どちらの変数も存在せず、代わりにクッキーベースのログインに頼る必要があります。または、FastCGIやMOD_PHPなど、PHPホスティングに対してより近代的なアプローチを備えたホストに変更します。
他のヒント
これを試して::
<?php
/*
** Define a couple of functions for
** starting and ending an HTML document
*/
function startPage()
{
print("<html>\n");
print("<head>\n");
print("<title>Listing 24-1</title>\n");
print("</head>\n");
print("<body>\n");
}
function endPage()
{
print("</body>\n");
print("</html>\n");
}
/*
** test for username/password
*/
if( ( isset($_SERVER['PHP_AUTH_USER'] ) && ( $_SERVER['PHP_AUTH_USER'] == "leon" ) ) AND
( isset($_SERVER['PHP_AUTH_PW'] ) && ( $_SERVER['PHP_AUTH_PW'] == "secret" )) )
{
startPage();
print("You have logged in successfully!<br>\n");
endPage();
}
else
{
//Send headers to cause a browser to request
//username and password from user
header("WWW-Authenticate: " .
"Basic realm=\"Leon's Protected Area\"");
header("HTTP/1.0 401 Unauthorized");
//Show failure text, which browsers usually
//show only after several failed attempts
print("This page is protected by HTTP " .
"Authentication.<br>\nUse <b>leon</b> " .
"for the username, and <b>secret</b> " .
"for the password.<br>\n");
}
?>
PHP-CGIの場合:
.htaccessにこれを追加します:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule>
スクリプトの最初にこれを追加します:
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
PHPメソッドは、Webサーバーで構成されている基本認証に依存していると思います。これを行う簡単な方法は、基本認証を有効にするディレクトリに.htaccessファイルを含めることです。
ほとんどのUNIXベースのWebホストでは、このファイルをアップロードするだけでこれを行うことができます。別のファイル(これを呼び出す.htauth)は、サイトまたはディレクトリにアクセスできるユーザーログインを保持します。
変数を過剰に構築したかどうかを確認してください $_SERVER[‘PHP_AUTH_USER’]
と$_SERVER[‘PHP_AUTH_PW’]
両方の変数にアクセスしようとしている場所の前。
上記が当てはまらない場合は、PHPをCGI modとして使用しているかどうかを確認してください。 PHPをCGI modとして使用している場合、ほとんどの場合は取得できません $_SERVER[‘PHP_AUTH_USER’]
と$_SERVER[‘PHP_AUTH_PW’]
ジェネラルのため、オプションでapacheをコンパイルしません SECURITY_HOLE_PASS_AUTHORIZATION
両方の変数を取得したい場合は、Option Security_hole_Pass_AuthorizationでApacheを再コンパイルするか、.htaccessアプローチを使用することができます。 PHP Basic Auth 役職。