PHP Basic身份认证输入任意凭据均可访问页面问题排查
问题原因
你的校验逻辑存在运算符优先级错误,PHP中逻辑非!的运算优先级高于相等判断==,所以代码中!$_SERVER['PHP_AUTH_USER'] == 'lorem'实际执行逻辑是:
- 先对
$_SERVER['PHP_AUTH_USER']做逻辑非运算得到布尔值 - 再将该布尔值和字符串
lorem做相等判断
而PHP中布尔值和字符串做==比较时,会先将字符串转为布尔值再比较,非空字符串都会转为true,所以最终这行判断等价于!$_SERVER['PHP_AUTH_USER'] == true,也就是只要输入的用户名非空,该条件就不成立。同理密码的判断逻辑也存在相同问题,最终只要用户输入了任意非空的账号密码,就会绕过校验。
修复方案
有两种常用修复方式,任选其一即可:
- 方式1:改用不等运算符
!=,避开优先级问题
if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || $_SERVER['PHP_AUTH_USER'] != 'lorem' || $_SERVER['PHP_AUTH_PW'] != 'ipsum'){ header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="Wonder Penguin"'); die("Access Denied !"); }
- 方式2:给相等判断加括号,明确运算顺序
if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || !($_SERVER['PHP_AUTH_USER'] == 'lorem') || !($_SERVER['PHP_AUTH_PW'] == 'ipsum')){ header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="Wonder Penguin"'); die("Access Denied !"); }
内容的提问来源于stack exchange,提问作者qadenza
相关产品推荐
相关产品推荐

