20

基本HTTP認証を使用しようとしており、PHPのマニュアルページの例に従いました。しかし、それは私にはうまくいきません。変数$_SERVER['PHP_AUTH_USER']が設定されていないようです。ユーザーがログインしようとすると、新しいログインダイアログが表示されます。サーバーはPHP5.3.3を実行しており、GoogleChromeとInternetExplorerで試しました。

これが私が使用した簡単な例です:

<?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認証を使用するにはどうすればよいですか?

4

5 に答える 5

17

これを試して::

<?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");
    }
?>
于 2011-01-02T10:09:54.780 に答える
12

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)));
于 2014-03-21T12:49:13.527 に答える
10

PHPはどのように実行されていますか?Apache mod_cgiを使用している場合は、認証情報をまったく取得できないのではないかと思います。SECURITY_HOLE_PASS_AUTHORIZATIONフラグを付けてコンパイルしない限り、ApacheはそれをCGIアプリに渡しません。(実際にセキュリティホールであるかどうかは、サーバー上の他のユーザーがWebサイトのユーザーよりも低い特権または高い特権を持っているかどうかによって異なります。)

IIS CGIの場合は、「匿名」ディレクトリアクセスのみが構成されていることを確認する必要があります。そうしないと、IISはステップインしてクレデンシャル自体を認証しようとします。

echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";

HTMLインジェクションのセキュリティホール(うまくいった場合)。を使用しhtmlspecialchars()ます。男は、非常に疑わしいアドバイスとコードでいっぱいのそのPHPドキュメントページです。

$_SERVER['HTTP_AUTHORIZATION']mod_cgiの問題であると思われますが、どちらの変数も存在しないため、代わりにCookieベースのログインを使用する必要があります。または、FastCGIやmod_phpなど、PHPホスティングへのより最新のアプローチを備えたホストに変更します。

于 2010-11-11T01:14:33.700 に答える
1

PHPの方法は、Webサーバーで構成されている基本認証に依存していると思います。これを行う簡単な方法は、基本認証を有効にするディレクトリに.htaccessファイルを含めることです。

ほとんどのUNIXベースのWebホストでは、このファイルをアップロードするだけでこれを実行できます。別のファイル(これを.htauthと呼びます)は、サイトまたはディレクトリへのアクセスを許可されているユーザーログインを保持します。

于 2010-11-11T00:57:40.513 に答える
0

変数をオーバーライドしたかどうか、$_SERVER[‘PHP_AUTH_USER’]および$_SERVER[‘PHP_AUTH_PW’]両方の変数にアクセスしようとしている場所の前に確認してください。

上記が当てはまらない場合は、phpをcgimodとして使用しているかどうかを確認してください。$_SERVER[‘PHP_AUTH_USER’]phpをcgimodとして使用している場合、ほとんどの場合、取得でき$_SERVER[‘PHP_AUTH_PW’]ません。通常、オプションを使用してapacheをコンパイルしないため、SECURITY_HOLE_PASS_AUTHORIZATION 両方の変数を取得する場合は、オプションSECURITY_HOLE_PASS_AUTHORIZATIONを使用してapacheを再コンパイルするか、を使用できます。 htaccessアプローチ。

于 2017-01-28T07:19:18.527 に答える