web-dev-qa-db-ja.com

PHPで基本HTTP認証を使用するにはどうすればよいですか?

私は Basic HTTP Authentication を使用しようとしています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認証を使用するにはどうすればよいですか?

16
Jonas

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

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

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

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

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

8
bobince

これを試して::

<?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");
    }
?>
13
Mazhar Ahmed

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)));
10
Teddy

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

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

0
Ken Richards

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

上記が当てはまらない場合は、phpをcgi modとして使用しているかどうかを確認してください。 phpをcgi modとして使用している場合、ほとんどの場合$_SERVER[‘PHP_AUTH_USER’]$_SERVER[‘PHP_AUTH_PW’]は得られません。一般に、オプションSECURITY_HOLE_PASS_AUTHORIZATIONでApacheをコンパイルしないため、両方を取得したい場合次に、オプションSECURITY_HOLE_PASS_AUTHORIZATIONを使用してApacheを再コンパイルするか、 PHP basic auth で説明されている.htaccessアプローチを使用できます。

0