【发布时间】:2013-12-10 20:09:19
【问题描述】:
所以我目前正在学习 PHP 编程课程,我终于进入了身份验证和授权的艺术。
因此,在本书中,我们首先限制了授予所有帐户访问权限的页面,您可以在其中更新和删除所有帐户。我们从定义常量开始:
define('VALID_USERNAME', '');
define('VALID_PASSWORD', '');
为了方便我自己,我只是把它们作为空字符串。
一切顺利,弹出询问用户名和密码的对话框。 但是,当我输入空字符串时,对话框不断弹出,好像密码错误,或者根本没有输入密码。即使我用真实字符串定义用户名和密码,也会发生这种情况。
这是我的那部分代码:
if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW'])) {
header('http/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Wonder Penguin"');
} else {
if (($_SERVER['PHP_AUTH_USER'] != VALID_USERNAME) ||
($_SERVER['PHP_AUTH_PW'] != VALID_PASSWORD)) {
header('http/1.1 401 Unauthorized');
header('WWW-Authenticate: Basic realm="Wonder Penguin"');
}
}
如果您想知道为什么我没有使用 exit() 函数来防止人们点击取消以绕过身份验证并进入更新页面。我这样做是为了让我的老师可以对我创建的最后一个作业的这个页面进行评分。
我已经厌倦了排错:
我使用 echo 函数测试了我是否正确定义了有效的用户名和密码。
echo VALID_USERNAME;
echo VALID_PASSWORD;
它会弹出我定义的内容。所以理论上,我认为我的定义是正确的。
我尝试用单引号、双引号和不带引号编写define 函数。 这本书要我写这样的函数:
define(VALID_USERNAME, "admin");
define(VALID_PASSWORD, "password");
但是,当我试图在那里定义它们时,这会带来一个错误,即我使用了一个未定义的常量。
var_dump($_SERVER); 结果:
array(37) {
["REDIRECT_HANDLER"]=> string(23) "application/x-httpd-php"
["REDIRECT_STATUS"]=> string(3) "200"
["HTTP_HOST"]=> string(20) "patti-bee2.dcccd.edu"
["HTTP_CONNECTION"]=> string(10) "keep-alive"
["HTTP_ACCEPT"]=> string(74) "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
["HTTP_USER_AGENT"]=> string(108) "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36"
["HTTP_ACCEPT_ENCODING"]=> string(17) "gzip,deflate,sdch"
["HTTP_ACCEPT_LANGUAGE"]=> string(14) "en-US,en;q=0.8"
["HTTP_COOKIE"]=> string(217) "__qca=P0-630369357-1378011844686; __utma=198331962.264424896.1377179965.1382812794.1384740700.12; __utmc=198331962; __utmz=198331962.1381981575.8.4.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided)"
["PATH"]=> string(135) "C:\Program Files (x86)\PHP\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;c:\php;"
["SystemRoot"]=> string(10) "C:\Windows"
["COMSPEC"]=> string(27) "C:\Windows\system32\cmd.exe"
["PATHEXT"]=> string(53) ".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"
["WINDIR"]=> string(10) "C:\Windows"
["SERVER_SIGNATURE"]=> string(0) ""
["SERVER_SOFTWARE"]=> string(21) "Apache/2.2.22 (Win32)"
["SERVER_NAME"]=> string(20) "patti-bee2.dcccd.edu"
["SERVER_ADDR"]=> string(14) "144.162.99.193"
["SERVER_PORT"]=> string(2) "80"
["REMOTE_ADDR"]=> string(11) "99.7.247.36"
["DOCUMENT_ROOT"]=> string(66) "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs"
["SERVER_ADMIN"]=> string(16) "pburks@dcccd.edu"
["SCRIPT_FILENAME"]=> string(106) "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\Coleman\Wonder Penguin\PHP\show_all.php"
["REMOTE_PORT"]=> string(5) "54619"
["REDIRECT_URL"]=> string(40) "/coleman/wonder penguin/php/show_all.php"
["GATEWAY_INTERFACE"]=> string(7) "CGI/1.1"
["SERVER_PROTOCOL"]=> string(8) "HTTP/1.1"
["REQUEST_METHOD"]=> string(3) "GET"
["QUERY_STRING"]=> string(0) ""
["REQUEST_URI"]=> string(42) "/coleman/wonder%20penguin/php/show_all.php"
["SCRIPT_NAME"]=> string(40) "/coleman/wonder penguin/php/show_all.php"
["ORIG_SCRIPT_FILENAME"]=> string(18) "C:/PHP/php-cgi.exe"
["ORIG_PATH_INFO"]=> string(40) "/coleman/wonder penguin/php/show_all.php"
["ORIG_PATH_TRANSLATED"]=> string(106) "C:\Program Files (x86)\Apache Software Foundation\Apache2.2\htdocs\Coleman\Wonder Penguin\PHP\show_all.php"
["ORIG_SCRIPT_NAME"]=> string(16) "/php/php-cgi.exe"
["PHP_SELF"]=> string(40) "/coleman/wonder penguin/php/show_all.php"
["REQUEST_TIME"]=> int(1385432192)
}
在这一点上,我几乎直接从书中复制了它。 我做错了什么?
如果你想自己尝试一下,这里是link to my site。
【问题讨论】:
-
我对您正在使用的这本书持怀疑态度。正如您所发现的,您绝对应该使用它们的名称作为字符串
define('VALID_USERNAME', 'admin')来定义常量。另外作为代码风格说明,考虑使用'表示字符串文字而不是",这样你就不会对变量或转义字符感到惊讶`. ('` 在理论上更快。)无论如何,我我想知道var_dump($_SERVER)的输出是什么。那应该可以帮助您调试它。我怀疑如果用户名/密码为空,这些变量根本不会出现。 -
@Brad,我刚试了一下,遇到了一大堆错误。
-
没有错,就是你需要的调试输出!它基本上是
$_SERVER超全局关联数组中的每个变量。一些服务器使用除PHP_AUTH_USER和PHP_AUTH_PW之外的其他名称。我想看看那个输出是什么。您可以将其粘贴到您的问题中吗? -
@Brad,你去吧,先生。
-
$_SERVER中没有任何授权。当你做调试输出时,你是先登录的吗?如果是这样,Apache 的 CGI 参数很可能以某种方式配置不正确。不过,再次尝试使用用户名/密码的某些内容(不仅仅是空字符串)登录。
标签: php authentication admin