當使用 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 Negotiate 驗證(它不會暴露密碼並具有 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
Post #8 建議使用 auto_prepend_file 執行一個取消設定變數的腳本
這是一個解決方法,不是一個乾淨的解決方案,但它存在...
您嘗試過 AuthType Digest 嗎?
答案3
半徑是對的——但你不能。
經過進一步研究,我意識到這基本上是身份斷言的教科書場景:受信任的身份提供者向客戶端應用程式「證明」用戶的身份。 SAML 2.0 規格似乎很適合。
我希望在沒有更多基礎設施層的情況下擺脫困境,但我將在 IDP 方面使用 simpleSAMLphp[1],在 Apache 方面使用 mod_mellon[2]。 (經過一天的修改,它成功了。)這並不能解決密碼問題,而是將其移至可以控制的位置。
旁白:Sun 的 OpenSSO 非常強大,但 Oracle 終止了它,相關的 OpenAM 專案的未來仍然不清楚。
[1]:http://rnd.feide.no/simplesamlphp簡單SAMLphp
答案4
我有一個解決方法。我將以下內容添加到我的 .htaccess 中
php_value auto_prepend_file "global_prepend.php"
在檔案「global_prepend.php」中,我新增了以下 PHP 行:
$_SERVER["PHP_AUTH_PW"]="Shh! It's a secret!";
我現在可以使用我的憑證登錄,並且不再儲存我的真實密碼。