当使用 Apache 的基本身份验证(特别是通过 LDAP,但也可以通过 htpasswd)时,它会使 REMOTE_USER 变量可用于下面的 PHP / Ruby / Python 代码 - 这对于将身份验证卸载到 Web 服务器非常有用。
在我们的办公环境中,我们有许多内部应用程序通过 SSL 像这样工作,都非常安全。但是:Apache 向 PHP 内的任何应用程序公开 PHP_AUTH_USER (=REMOTE_USER) 和 PHP_AUTH_PW 变量。(PHP_AUTH_PW 包含用户输入的纯文本密码。)这意味着应用程序可以收集用户名和密码。据推测,Python 和 Ruby 可以获得相同的信息(这三种语言目前都在使用;PHP 正在逐步淘汰)。
那么我怎样才能阻止 Apache 这样做呢?
一种想法是使用 Kerberos 协商身份验证(不会暴露密码并具有 SSO 的好处),但对于某些浏览器(Chrome 和某些情况下的 Firefox),这会自动回退到 Basic,导致密码再次暴露。
答案1
以防万一有人像我一样偶然发现这个问题:
在 Apache 2.4.5 及更高版本中,您可以使用AuthBasicFake
屏蔽密码的指令:
AuthBasicFake toto tata
结果是:
PHP_AUTH_USER=toto
PHP_AUTH_PWD=tata
保留用户名:
AuthBasicFake %{REMOTE_USER} tata
结果是:
PHP_AUTH_USER=value-of-remote-user
PHP_AUTH_PWD=tata
REMOTE_USER 不受影响。
答案2
似乎不可能,但看看http://bytes.com/topic/php/answers/798619-prevent-setting-php_auth_pw
帖子#8 建议使用 auto_prepend_file 来运行取消设置变量的脚本
这是一种解决方法,不是一个干净的解决方案,但它存在......
您尝试过 AuthType Digest 吗?
答案3
Radius 是正确的——你不能。
经过进一步研究,我意识到这基本上是身份断言的教科书场景:受信任的身份提供者向客户端应用程序“证明”用户的身份。SAML 2.0 规范似乎很合适。
我希望不用更多基础设施层,但我打算使用 simpleSAMLphp[1] 作为 IDP,使用 mod_mellon[2] 作为 Apache 端。(经过一天的调整,终于成功了。)这并不能解决密码问题,但可以将其移至可控制的位置。
另外:Sun 的 OpenSSO 非常强大,但 Oracle 却将其淘汰,而相关的 OpenAM 项目的未来仍不明朗。
[1]:http://rnd.feide.no/simplesamlphpsimpleSAMLphp
[2]:http://code.google.com/p/modmellon/mod_mellon
答案4
我有一个解决方法。我将以下内容添加到我的 .htaccess 中
php_value auto_prepend_file "global_prepend.php"
在文件“global_prepend.php”中我添加了以下 PHP 行:
$_SERVER["PHP_AUTH_PW"]="Shh! It's a secret!";
我现在可以使用我的凭证登录,并且我的真实密码不再存储。