Autenticação por HTTP em plataforma Linux
De TeHospedia
Tabela de conteúdo |
Sintoma
Validação por HTTP através do PHP não funciona apropriadamente.
Causa
Incompatibilidade do PHP com o Apache
Situações de reprodução
- Plataformas afetadas:
- Linux
Correção
Adicionar no public_html/.htaccess:
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
Adicionar no começo do código PHP antes do uso:
if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
$ha = base64_decode( substr($_SERVER['HTTP_AUTHORIZATION'],6) );
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', $ha);
unset($ha);
}
if (empty($_SERVER['PHP_AUTH_USER'])) {
unset($_SERVER['PHP_AUTH_USER']);
}
Exemplo completo
<?php
// este arquivo faz conexao ao banco de dados
include 'config.php';
/* correcao de HTTP auth */
if (isset($_SERVER['HTTP_AUTHORIZATION'])) {
$ha = base64_decode( substr($_SERVER['HTTP_AUTHORIZATION'],6) );
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', $ha);
unset($ha);
}
if (empty($_SERVER['PHP_AUTH_USER'])) {
unset($_SERVER['PHP_AUTH_USER']);
}
/* fim da correcao de HTTP auth */
/* se o navegador do usuario nao fornecer a autenticacao, exibe o header e termina */
function cabecalhos_autenticacao() {
header("WWW-Authenticate: Basic realm='Intranet'");
header('HTTP/1.0 401 Unauthorized');
exit;
}
// nao temos usuario definido pelo navegador
if (empty($_SERVER['PHP_AUTH_USER'])) {
cabecalhos_autenticacao();
} else {
// consulta ao banco de dados para verificar se usuario digitou senha certa
$sql = sprintf("SELECT usuario FROM usuarios WHERE usuario='%s' AND senha=MD5('%s')",
mysql_real_escape_string($_SERVER['PHP_AUTH_USER']),
mysql_real_escape_string($_SERVER['PHP_AUTH_PW'])
);
$res = mysql_query($sql);
// esta logado, digitou senha certa
if (mysql_num_rows($res) == 1) {
printf("autenticado como %s", $_SERVER['PHP_AUTH_USER']);
// nao esta logado, digitou senha errada, pede para autenticar novamente
} else {
cabecalhos_autenticacao();
}
}
?>
Outras infromações pertinentes
- Atenção: desde o PHP 4.1 não deve ser usado $PHP_AUTH_USER nem $PHP_AUTH_PW, mas sim $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']



