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

Jon*_*nas 16 php authentication server-variables http-authentication basic-authentication

我正在尝试使用基本HTTP身份验证,并按照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>";
}
?>
Run Code Online (Sandbox Code Playgroud)

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

Maz*_*med 11

试试这个::

<?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");
    }
?>
Run Code Online (Sandbox Code Playgroud)


Ted*_*ddy 10

对于PHP-CGI:

在.htaccess中添加:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]
</IfModule>
Run Code Online (Sandbox Code Playgroud)

并在脚本的开头添加:

list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Run Code Online (Sandbox Code Playgroud)


bob*_*nce 8

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

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

echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
Run Code Online (Sandbox Code Playgroud)

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

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