При использовании базовой аутентификации (в частности, через LDAP, но также и htpasswd) с Apache переменная REMOTE_USER становится доступной для кода PHP / Ruby / Python — это очень полезно для переноса аутентификации на веб-сервер.
В нашей офисной среде у нас есть много внутренних приложений, работающих таким образом через SSL, все они достаточно безопасны. НО: Apache предоставляет переменные PHP_AUTH_USER (=REMOTE_USER) и PHP_AUTH_PW любому приложению внутри PHP. (PHP_AUTH_PW содержит открытый текстовый пароль, введенный пользователем.) Это означает, что приложение может собирать имена пользователей и пароли. Предположительно, та же информация доступна Python и Ruby (все три в настоящее время используются; PHP постепенно выводится из эксплуатации).
Так как же мне запретить Apache делать это?
Одна из идей — использовать аутентификацию Kerberos Negotiate (которая не раскрывает пароль и имеет преимущество единого входа), но в некоторых браузерах (Chrome и в некоторых случаях Firefox) она автоматически возвращается к базовому режиму, в результате чего пароль снова становится раскрытым.
решение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
Радиус правильный — нельзя.
После дальнейшего исследования я понял, что это по сути сценарий из учебника для подтверждения личности: доверенный поставщик удостоверений «доказывает» личность пользователя клиентскому приложению. Спецификация SAML 2.0 кажется подходящей.
Я надеялся обойтись без дополнительных уровней инфраструктуры, но собираюсь использовать simpleSAMLphp[1] для IDP и mod_mellon[2] для Apache. (День возни, и все работает.) Это не решает проблему с паролем, но перемещает ее туда, где ее можно контролировать.
Примечание: OpenSSO от Sun — довольно мощный проект, но Oracle его закрыла, а будущее связанного с ним проекта OpenAM до сих пор неясно.
[1]:http://rnd.feide.no/simplesamlphpпростойSAMLphp
[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!";
Теперь я могу войти в систему, используя свои учетные данные, и мой настоящий пароль больше не сохраняется.