Desenvolvimento - PHP

Segurança: Autenticando o PHP com HTTP (Authentication Required)

Um dos modos muito seguros para fazer autenticação de usuário em uma área restrita é usando a autenticação HTTP.

por Leo Genilhu



Um dos modos muito seguros para fazer autenticação de usuário em uma área restrita é usando a autenticação HTTP. Essa autenticação só é possível para os PHPs que estão compilados como módulos do apache. Vamos ver as vantagens e os perigos desta autenticação.

Como funciona?

Quando o PHP esta compilado como modulo do apache é possível usar a função nativa que envia uma janela de entrada "Authentication Required" ao servidor web, que por sua vez requisitar ao browser do cliente uma tela de diálogo de entrada para usuário e senha. Assim que o usuário preencher seu login e senha, a URL contendo o script PHP será chamada de novo com as PHP_AUTH_USER, PHP_AUTH_PW, e AUTH_TYPE.

Estas variáveis contem o nome de usuário, login, senha e tipo de autenticação, sendo esta uma informação muito importante para nosso scritp de validação.

Estas informações são enviadas respectivamente nessa ordem para o servidor. A partir dai essas variáveis predefinidas são achadas nos arrays e $HTTP_SERVER_VARS.

Obs: $_SERVER é um array contendo informações como headers com caminhos e localizações do script etc. A variável $_SERVER foi introduzida a partir da versão 4.1.0 . Os itens deste array são criados pelo servidor web. Não há garantias que todos os servidores web geram geram estas variáveis alguns servidores são configurados para omitem esta variável.

Veja um exemplo de código:

<?php
  if (!isset($_SERVER["PHP_AUTH_USER"])) {
    header("WWW-Authenticate: Basic realm="Minha intranet"");
    header("HTTP/1.0 401 Unauthorized");
    echo "Operação cancelada! Você não logou!!";
    exit;
  } else {
    echo "<p>Olá, {$_SERVER["PHP_AUTH_USER"]}.</p>";
    echo "<p>Sua senha é : {$_SERVER["PHP_AUTH_PW"]}.</p>";
  }
?> 

Analizando o código acima:

Na primeira linha verificamos se a variável do array $_SERVER existe, caso ela não exista enviamos ao servidor web a requisição da função header(), nesta função é muito importante observamos o parâmetro utilizado.

"WWW-Authenticate: Basic realm="Minha intranet"".

Somente autenticação "Basic" (Básica) é suportada. O realm define a mensagem de texto que será enviada a caixa de dialogo.

Caso a variável exista é que o cliente já esta autenticado e pode navegar na intranet.

Bom Esta autenticação pode ser levada em conta uma validação em banco de dados ou arquivo texto ou ainda qualquer outra forma de comparar os dados enviados pelo cliente.

Configuração:

O PHP usa a presença de uma diretiva chamada AuthType para determinar se autenticação externa está em efeito ou não nas próximas transações entre o cliente e o servidor. No entanto, aqui existe um perigo que deve ser tratado pois a diretiva citada não previne que alguém que controle uma URL não autenticada de roubar senhas de URLs autenticadas no mesmo servidor.

Tanto o Netscape Navigator quanto o Internet Explorer já trazem por padrão a limpeza do de autenticação da janela do navegador para o realm após receber uma resposta 401 do servidor. Isso pode efetivamente "deslogar" um usuário, forçando o mesmo a re-entrar seu nome de usuário e senha. Algumas pessoas usam isso para delimitar o tempo de um login, ou fazer um botão de "log-out".

Porém outros browser não tratam essa limpa como por exemplo o navegador de texto do linux Lynx. Ai deve se forçar o log-out através de script para garantir a segurança. Uma outra limitação é se você estiver usando o módulo IIS (ISAPI). Ai você não deve usar as variáveis PHP_AUTH_* mas sim, a variável HTTP_AUTHORIZATION.

Por exemplo, considere o seguinte código:

list($user, $pw) = explode(":",base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));

Algumas informações importantes:

Autenticação HTTP não funcionava usando o servidor IIS da Microsoft com a versão CGI do PHP devido a limitação do IIS. Para fazer ela funcionar, você deve editar a configuração "Directory Security" do IIs. Clique em "Editar" e apenas marque "Anonymous Access", todos os outros campos devem ser mantidos desmarcados.

IIS: Para autenticação via HTTP funcionar no IIS, a diretiva do PHP deve estar configurada para 0 (o valor padrão). Se ( safe-mode) do PHP estiver habilitado, o uid do script é adicionado a parte realm do cabeçalho WWW-Authenticate.

Bom é isso, espero ter ajudado a todos.

Qualquer duvida entre em contato no meu email leo@genilhu.com.

Até a próxima e um feliz natal a todos.

Leo Genilhu

Leo Genilhu - Atua como consultor de desenvolvimentos e aplicações em web/wireless, sendo analista de uma empresa de desenvolvimento.
Além disso participa de comunidades de linux e software livre. Mantedor de lista de discussão em php e linux.