【问题标题】:REMOTE_USER and PHP_AUTH_USER sometimes emptyREMOTE_USER 和 PHP_AUTH_USER 有时为空
【发布时间】:2013-10-21 13:14:01
【问题描述】:

我一直在这个网站上工作,该网站应该使用带有 htpasswd 的 HTTP 基本身份验证。身份验证本身就像一个魅力,但有时(并非总是)$_SERVER['PHP_AUTH_USER'] 是空的。

我得到了改用 REMOTE_USER 的建议,它也只是不时起作用。 我正在使用 PHP 作为 Apache 的 CGI 插件,不幸的是,其他任何事情都是不可能的。该网站通过 HTTPS 进行 SSL 加密。

为什么会这样?

【问题讨论】:

  • 您是否能够调查哪些用户名是空的?我建议使用:$user = (strlen($_SERVER['PHP_AUTH_USER']) > 0) ? $_SERVER['PHP_AUTH_USER'] : $_SERVER['REMOTE_USER'];
  • 如果不是因为大多数时候 PHP_AUTH_USER 和 REMOTE_USER 都是空的,这将是一个好主意。

标签: php .htpasswd


【解决方案1】:

我没有确切的解决方案,但有几个想法可能对您有所帮助。

$user = !empty($_SERVER['PHP_AUTH_USER'])
      ? $_SERVER['PHP_AUTH_USER']
      : $_SERVER['REMOTE_USER'];

...是一个好的开始。请记住,如果您不使用Basic Realm Authentication,则必须使用Digest Realm Authentication $_SERVER['PHP_AUTH_DIGEST'] 进行arround。

您应该首先注意不要在正确的位置覆盖和检查您的变量。如果只是有人没有输入用户名,也可能是用户名为空。

如果认证不成功,请确保发送Connection: close标头。

现在要调试现象,您应该写入日志文件或向自己发送包含以下文本的邮件以进一步调查:

// variables from http://php.net/manual/en/language.variables.superglobals.php
$log = var_export(array($_SERVER, $_REQUEST, $_COOKIES, $_SESSION), true);

我还阅读了与 cgi 结合使用的其他包含用户名的变量集,请查看以下问题/答案:https://stackoverflow.com/a/7792912/1948292

其他可能包含用户信息的变量(取自上面的答案):

$_SERVER['REDIRECT_HTTP_AUTHORIZATION']
$_SERVER['REDIRECT_REMOTE_USER']

【讨论】:

  • 我建议使用 !empty($_SERVER['PHP_AUTH_USER']) 而不是 (strlen($_SERVER['PHP_AUTH_USER']) > 0),因为 PHP_AUTH_USER 可能会丢失并显示通知(或警告)。
  • 老实说,在尝试 DanFromGermany 的调试技巧时,我发现 PHP_AUTH_USER 实际上已设置,但设置为 ''。 PHP_AUTH_PW 也被设置,但为 NULL。我在我的 .htaccess 中使用它:AuthType Basic AuthName "site name" AuthUserFile /path/to/.htpasswd Require valid-user 我还使用一些重写来强制网站通过 HTTPS 提供服务。我不确定这是否会造成任何麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2011-04-09
  • 2019-09-20
相关资源
最近更新 更多