TeHospedo

www.TeHospedo.com.br

TeHospedo - Serviços de Internet
TeHospedia

Autenticação por HTTP em plataforma Linux

De TeHospedia

Conteúdo

[editar] Sintoma

Validação por HTTP através do PHP não funciona apropriadamente.

[editar] Causa

Incompatibilidade do PHP com o Apache

[editar] Situações de reprodução

  • Plataformas afetadas:
    • Linux

[editar] 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']);
}

[editar] 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();
    }   
}


?>

[editar] 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
Está página foi modificada pela última vez em 22:55, 23 Fevereiro 2008. - Esta página foi acessada 619 vezes. - Sobre a TeHospedia
 
Capa Empresa Mapa do site Política de uso Infra-estrutura Trabalhe conosco