Ao usar autenticação básica (especificamente via LDAP, mas também htpasswd) com Apache, ele disponibiliza a variável REMOTE_USER para o código PHP/Ruby/Python abaixo - isso é muito útil para descarregar a autenticação para o servidor web.
Em nosso ambiente de escritório temos muitos aplicativos internos funcionando assim através de SSL, todos bastante seguros. MAS: O Apache expõe as variáveis PHP_AUTH_USER (=REMOTE_USER) e PHP_AUTH_PW para qualquer aplicação dentro do PHP. (PHP_AUTH_PW contém a senha em texto simples que o usuário digitou.) Isso significa que é possível que o aplicativo colete nomes de usuário e senhas. Presumivelmente, a mesma informação está disponível para Python e Ruby (todos os três estão atualmente em uso; PHP está sendo descontinuado).
Então, como posso evitar que o Apache faça isso?
Uma ideia é usar a autenticação Kerberos Negotiate (que não expõe a senha e tem a vantagem de ser SSO), mas que volta automaticamente para o Basic para alguns navegadores (Chrome e em alguns casos Firefox), fazendo com que a senha seja exposta novamente .
Responder1
Apenas no caso de alguém tropeçar nesta questão como eu:
No Apache 2.4.5 e posterior você pode usar oAuthBasicFake
diretiva para mascarar a senha:
AuthBasicFake toto tata
Resulta em:
PHP_AUTH_USER=toto
PHP_AUTH_PWD=tata
Para manter o nome de usuário:
AuthBasicFake %{REMOTE_USER} tata
resulta em:
PHP_AUTH_USER=value-of-remote-user
PHP_AUTH_PWD=tata
REMOTE_USER não é afetado.
Responder2
Parece não ser possível, mas vejahttp://bytes.com/topic/php/answers/798619-prevent-setting-php_auth_pw
A postagem nº 8 sugere usar auto_prepend_file para executar um script que desativa a variável.
É uma solução alternativa, não uma solução limpa, mas existe ...
Você tentou o AuthType Digest?
Responder3
Radius está certo - você não pode.
Após mais pesquisas, percebi que este é basicamente um cenário clássico para uma afirmação de identidade: um provedor de identidade confiável "prova" a identidade do usuário para o aplicativo cliente. A especificação SAML 2.0 parece uma boa opção.
Eu esperava sair sem mais camadas de infraestrutura, mas vou usar simpleSAMLphp[1] para o IDP e mod_mellon[2] para o lado do Apache. (Basta um dia de ajustes e funciona.) Isso não resolve o problema da senha, mas a move para um local onde possa ser controlada.
Além: o OpenSSO da Sun é bastante robusto, mas a Oracle o matou e o futuro do projeto OpenAM relacionado ainda não está claro.
[1]:http://rnd.feide.no/simplesamlphpsimplesSAMLphp
[2]:http://code.google.com/p/modmellon/mod_mellon
Responder4
Eu tenho uma solução alternativa. Eu adicionei o seguinte ao meu .htaccess
php_value auto_prepend_file "global_prepend.php"
No arquivo "global_prepend.php" adicionei a seguinte linha PHP:
$_SERVER["PHP_AUTH_PW"]="Shh! It's a secret!";
Agora posso fazer login com minhas credenciais e minha senha real não está mais armazenada.