如何在PHP中使用基本HTTP身份验证?

时间:2010-11-11 00:43:54

标签: php authentication http-authentication http-basic-authentication server-variables

我正在尝试使用Basic HTTP Authentication并按照PHP手册页上的示例进行操作。但它对我不起作用。似乎没有设置变量$_SERVER['PHP_AUTH_USER']。当用户尝试登录时,将通过新的登录对话框提示用户。服务器正在运行PHP 5.3.3,我尝试使用谷歌浏览器和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身份验证?

5 个答案:

答案 0 :(得分:9)

试试这个::

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

答案 1 :(得分:9)

对于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)));

答案 2 :(得分:8)

PHP如何运行?如果它是通过Apache mod_cgi,我恐怕你根本无法掌握认证信息。 Apache不会将其传递给CGI应用程序,除非您使用SECURITY_HOLE_PASS_AUTHORIZATION标志进行编译。 (它是否真的是一个安全漏洞取决于您服务器上的其他用户是否拥有比您的网站用户更低或更高的权限。)

如果是IIS CGI,则必须确保仅配置“匿名”目录访问,否则IIS将尝试介入并自行验证凭据。

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

HTML注入安全漏洞(如果有效的话)。使用htmlspecialchars()。伙计,这是一个充满高度可疑建议和代码的PHP文档页面。

您也可以尝试查看$_SERVER['HTTP_AUTHORIZATION'],但我怀疑它是mod_cgi问题,在这种情况下,两个变量都不存在,您将不得不求助于基于cookie的登录。或者使用更现代的PHP托管方法更改为主机,例如FastCGI或mod_php。

答案 3 :(得分:0)

我认为PHP方法依赖于在Web服务器上配置的基本身份验证。一种简单的方法是在要启用基本身份验证的目录中包含.htaccess文件。

大多数基于unix的Web主机允许您通过上传此文件来执行此操作。一个单独的文件(称为.htauth)将保存允许访问该站点或目录的用户登录。

答案 4 :(得分:0)

检查您是否在试图访问这两个变量的地方之前覆盖了变量$_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方法。