如何在PHP中使用基本的HTTP身份验证?
题
我正在尝试使用 基本的HTTP身份验证 并遵循PHP手册页面上的示例。但这对我不起作用。变量 $_SERVER['PHP_AUTH_USER']
似乎没有设置。当用户尝试登录时,请提示用户在新的登录dialog中。该服务器正在运行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身份验证?
解决方案
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。
其他提示
尝试这个::
<?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");
}
?>
对于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)));
我认为PHP方法依赖于在Web服务器上配置的基本身份验证。一个简单的方法是在要启用基本身份验证的目录中包含一个.htaccess文件。
大多数基于UNIX的Web主机都可以通过上传此文件来做到这一点。一个单独的文件(调用此.htauth)将保留允许访问站点或目录的用户登录名。
检查您是否已覆盖变量 $_SERVER[‘PHP_AUTH_USER’]
和$_SERVER[‘PHP_AUTH_PW’]
在您尝试访问两个变量的地方之前。
如果不是上述情况,则CHEK是否使用PHP作为CGI Mod。如果您使用PHP为CGI mod,那么在大多数情况下,您将无法获得 $_SERVER[‘PHP_AUTH_USER’]
和$_SERVER[‘PHP_AUTH_PW’]
因为常规我们不使用选项编译Apache SECURITY_HOLE_PASS_AUTHORIZATION
因此,如果您想获得两个变量,则将Apache重新编译使用option security_hole_pass_authorization,也可以使用.htaccess方法在 PHP基本验证 邮政。