【发布时间】:2015-04-06 19:32:46
【问题描述】:
我在 PHP 中有以下代码,
<?php
ob_start();
$valid_passwords = array ("matrixUlt" => "$ecurEh1FIVE");
$valid_users = array_keys($valid_passwords);
$user = $pass = null;
if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW']))
{
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];
}
$validated = (in_array($user, $valid_users)) && ($pass == $valid_passwords[$user]);
if(!$validated)
{
header('WWW-Authenticate: Basic realm="You need to be authenticated to access the resource!"');
header('HTTP/1.0 401 Unauthorized');
exit("Not authorized");
echo ob_get_clean();
}
当这个 [("matrixUlt" => "$ecurEh1FIVE"] username:password 被给出时,这在 localhost 中可以正常工作。但在 LIVE 服务器/生产环境中一直显示身份验证对话框。任何想法为什么这不起作用?
【问题讨论】:
-
当您将
$放在变量的双引号内时,您认为会发生什么?请改用('matrixUlt' => '$ecurEh1FIVE')。 -
PHP数组中的单引号和双引号有什么区别?它在本地工作,所以它应该在现场工作!我认为问题出在其他地方。
-
如果你把一个变量(PHP 以 $ 开头的东西)放在双引号内,PHP 会尝试把变量的内容放在那里。如果
$ecurEh1FIVE是文本而不是变量,则使用单引号。 -
@Drown - 或者更好的是,不要存储明文密码。考虑改用
password_hash()。 -
@webblover。您确定 PROD 的设置与 DEV 相同吗?有一些设置可能会导致 PHP_AUTH 变量无法设置:(来自:php.net/manual/en/features.http-auth.php)为了防止有人编写脚本来显示通过传统外部机制进行身份验证的页面的密码,PHP_AUTH 变量如果为该特定页面启用了外部身份验证并启用了安全模式,则不会设置。无论如何,REMOTE_USER 可用于识别经过外部验证的用户。因此,您可以使用 $_SERVER['REMOTE_USER']。