TeHospedo

www.TeHospedo.com.br

TeHospedo - Serviços de Internet
TeHospedia

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']
Ferramentas pessoais
Relacionamento
Esta página foi modificada pela última vez às 22h55min, 23 de fevereiro de 2008. - Esta página foi acessada 1 257 vezes. - Sobre
 
Capa Empresa Mapa do site Política de uso Infra-estrutura Trabalhe conosco