当使用Apache进行基本authentication(特别是通过LDAP,但也使用htpasswd)时,它使REMOTE_USERvariables可用于PHP / Ruby / Python代码 – 这对于将authentication卸载到Web服务器非常有用。
在我们的办公环境中,我们有很多像SSL这样的内部应用程序,都非常安全。 但是:Apache将PHP_AUTH_USER(= REMOTE_USER)和PHP_AUTH_PWvariables公开给PHP中的任何应用程序。 (PHP_AUTH_PW包含用户input的明文密码。)这意味着应用程序可以获取用户名和密码。 据推测,相同的信息可用于Python和Ruby(所有三个目前正在使用; PHP正在被淘汰)。
那么如何防止Apache这样做呢?
一个想法是使用Kerberos协商身份validation(它不公开密码并具有SSO的好处),但是对于某些浏览器(Chrome和某些情况下,Firefox)会自动回退到Basic,从而导致密码再次暴露。
似乎不可能,但请参阅http://bytes.com/topic/php/answers/798619-prevent-setting-php_auth_pw
Post#8build议使用auto_prepend_file来运行一个未设置variables的脚本
这是一个解决方法不是一个干净的解决scheme,但它存在…
你有没有尝试AuthType摘要?
半径是正确的 – 你不能。
经过进一步的研究,我意识到这基本上是一个身份断言的文本书写场景:一个可信任的身份提供者向客户端应用程序“certificate”用户的身份。 SAML 2.0规范似乎很适合。
我希望能在没有更多的基础设施层的情况下脱身,但是我将使用简单的SAMLphp [1]作为IDP,mod_mellon [2]作为Apache的一面。 (一天的修补和它的工作。)这不能解决密码问题,但将其移动到可以控制的地方。
除此之外,Sun公司的OpenSSO相当强大,但甲骨文公司却把它杀死了,相关的OpenAM项目的未来依然不明朗。
[1]: http: //rnd.feide.no/simplesamlphp simpleSAMLphp
[2]: http : //code.google.com/p/modmellon/ mod_mellon
以防万一有人像我一样绊倒这个问题:
在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不受影响。