20

我正在尝试使用基本 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 身份验证?

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 应用程序。(这是否实际上是一个安全漏洞取决于您服务器上的其他用户是否具有比您的网站用户更低或更高的权限。)

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

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

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

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

于 2010-11-11T01:14:33.700 回答
1

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

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

于 2010-11-11T00:57:40.513 回答
0

检查您是否已经覆盖了您的变量$_SERVER[‘PHP_AUTH_USER’],并且$_SERVER[‘PHP_AUTH_PW’]在您尝试访问这两个变量的位置之前。

如果上述情况并非如此,那么请检查您是否使用 php 作为 cgi mod。如果您使用 php 作为 cgi mod,那么在大多数情况下,您将无法获得$_SERVER[‘PHP_AUTH_USER’]$_SERVER[‘PHP_AUTH_PW’]因为通常我们不会使用选项编译 apacheSECURITY_HOLE_PASS_AUTHORIZATION 所以如果您想获得这两个变量,然后使用选项 SECURITY_HOLE_PASS_AUTHORIZATION 重新编译 apache,或者您可以使用 . htaccess 方法。

于 2017-01-28T07:19:18.527 回答