Au Autent enticaçã cação o de de sit sites com com PHP PHP e MySQ ySQL [Art [Artiigo]
http ttp://www. www.viva vivaol oliinux.co x.com m.br/ar r/arti tig gos/impres ressora. ra.p...
Autenticação Autenticação de sites com PHP e MySQL Autor: Djair Dutra C. Jr.
Data: 08/12/2010 Entendendo como como as coisas funcionam
O sistema de login será baseado na seguinte dinâmica: Todos os arquivos php serão colocados na mesma pasta, sem distinção ou separação alguma. O usuário não autenticado terá acesso livre apenas à tela login.php, na qual não há exigência de autenticação. Os demais arquivos desta pasta terão um comando na primeira linha que verificará se a autenticação foi positiva. Se for positiva, o restante da página será carregada, caso contrário, o usuário será redirecionado imediatamente para a página login.php. A página login.php fará a verificação do usuário e senha. Se a autenticação for positiva, esta página redirecionará o cliente para uma outra qualquer, que pode ser inclusive uma index.php. Se a autenticação não for positiva, o cliente voltará à página de login.php.
Qual a segurança oferecida por este sistema de login? Este sistema de login só fará restrição de acesso apenas às páginas em php. Qualquer outro arquivo que esteja na pasta, seja html, jpg, gif, doc, pdf ou qualquer outro, será exibido sem nenhuma restrição, mesmo que o usuário não tenha autenticado. Quanto as páginas em php, o sistema é totalmente seguro, desde que sejam obedecidas todas as regras que serão citadas aqui neste artigo. Nos vários testes feitos visando burlar o sistema, em diferentes browsers, coloquei a URL completa de uma das páginas com conteúdo restrito, e em todos os testes, fui redirecionado para a página login.php. Num outro teste, usei o lynx, navegador em modo texto muito simples, que, por este motivo, talvez não fosse manipulável p elo php, php , mas o resultado foi o mesmo mesmo dos anteriores. Tentei ainda fazer um download de um arquivo restrito através do comando wget, mas independente do arquivo que eu escolha, o download só baixa o arquivo login.php e sem os códigos php, obviamente. Testei também com outros programas de download, inclusive do Windows, mas nenhum deles teve êxito. Além de divulgar conhecimentos, um dos outros motivos pelo qual estou escrevendo este artigo é para que outras pessoas, com mais conhecimentos e outras técnicas, possam testar a segurança deste sistema e reportar aqui possíveis falhas que eu não enxergue. Agradeço a quem fizer isso.
Pré-requisitos para o sistem s istema a Para que este sistema funcione, será necessário que o servidor tenha instalado o apache e que este tenha suporte ao php, sem esquecer do pacote php5-mysql. Deve também ter instalado e funcionando o MySql, bem como o phpmyadmin, que será usado nas explicações para criar os bancos de dados.
1 de 11
12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo]
http://www.vivaolinux.com.br/artigos/impressora.p...
Conhecimento básico de php e mysql também é necessário, pois não perderei muito tempo detalhando como funcionam os códigos - até p orque este não é o intuito - mas sim, mostrando como fazer as autenticações e as integrações das páginas. Além dos já citados, é importante também o conhecimento de HTML, pois os exemplos citados aqui estarão "crus" e sem nenhu ma formatação. Somente os códigos em PHP.
Criando o banco de dados e as tabelas necessárias
O banco de dados pode ser o mesmo que você usará no seu site ou sistema, seja ele qual for. Basta apenas adicionar as tabelas "usuários" e "sessões", as quais serão responsáveis por armazenar os dados do usuário e das sessões criadas respectivamente. O s nomes "usuários" e "sessões" não são obrigatórios, mas é uma boa ideia seguir esses padrões. Para facilitar, coloquei abaixo os códigos já prontos para criar as tabelas necessárias. No PhpMyadmin, você deve escolher seu banco de dados e depois a aba SQL, para colar os códigos abaixo e criar as tabelas. Código para criar a tabela de usuários: CREATE TABLE IF NOT EXISTS `usuarios` ( `codusuario` int(11) NOT N ULL AUTO_INCREMENT, `nome` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `senha` varchar(255) DEFAULT NULL, `privilegio` varchar(255 ) DEFAULT NULL, `status` varchar(255) DEFAULT NULL, PRIMARY KEY (`codusuario`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; Código para criar a tabela de sessões: CREATE TABLE IF NOT EXISTS `sessoes` ( `codsessao` mediumint(9) NOT NULL AUTO_INCREMENT, `data` date DEFAULT NULL, `hora` time DEFAULT NULL, `ipserver` varchar(255) DE FAULT NULL, `iprede` varchar(255) D EFAULT NULL, `sessao` varchar(255) DEFAULT NULL, `usuario` varchar(255) DEFAULT NULL, `datafecha` date DEFAULT NULL, `horafecha` time DEFAULT NULL, `status` varchar(255) DEFAULT NULL, PRIMARY KEY (`codsessao`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=186 ;
Explicando a criptografia da senha O login e a senha que serão digitados na janela de login serão conferidos com os que estão salvos no banco de dados como qualquer sistema, porém, por uma questão de segurança - e porque não dizer também de ética as senhas digitadas não serão guardadas no banco de dados literalmente como foram digitadas. Para armazenar senhas, sempre gostei de usar uma técnica de criptografia com MD5 ( http://pt.wikipedia.org /wiki/MD5) por ser unidirecional, ou seja, uma vez que um texto é convertido para MD5 a sua conversão para o valor original é impossível.
2 de 11
12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo]
http://www.vivaolinux.com.br/artigos/impressora.p...
Mesmo que alguém tenha acesso à tabela que contém seus dados de usuário, ele não saberá o que fazer com a sua senha, que fica num formato parecido com este: f278b0cb1f1d4e55eea62e8974707214. Então, resumindo, o sistema de login receberá a senha digitada pelo usuário, converterá para MD5 e só aí verificará se confere com a senha que está no banco de dados. No exemplo a seguir a senha criptografada é a palavra djair, mas se você desejar criar sua própria senha pode criar um arquivo em php só para lhe auxiliar na criação das senhas. Use o código abaixo para criar uma página com o nome senha.php e veja como é simples criptografar uma senha. echo "Senha: ".md5($senha); ?>
Criando um usuário "na mão" para testar os códigos Antes de criar as páginas em php, é óbvio que deve haver pelo menos um usuário no banco de dados para fazer os testes. Este usuário será criado manualmente, através do PhpMyadmin. Lembre-se de que, como explicado acima, a senha deve ser armazenada no banco de dados já no formato MD5, portanto faça esta conversão antes de inserir os dados. INSERT INTO `usuarios` (`codusuario`, `nome`, `email`, `senha`, `privilegio`, `status`) VALUES (NULL, 'Djair Dutra', '[email protected]', 'f278b0cb1f1d4e55eea62e8974707214', 'ADMIN', 'ATIVO');
Sobre a formatação das páginas Como o intuito aqui é apenas a informação pura e simples sobre autenticação, mais uma vez lembro que não me prenderei também a detalhes de formatação de pág ina. Se fôssemos detalhar todos os estilos de formatação e detalhes em CSS, ou mesmo em formatação pura em HTML este artigo ficaria gig antesco. Portanto, suponho que o leitor deste artigo tenha algum conhecimento de HTML e saiba "encaixar" os códigos no conteúdo da sua página.
Criando os primeiros arquivos em PHP
O primeiro arquivo a ser criado será uma página de login, chamada login.php, a qual fará a validação dos dados dos usuários e redirecionará para uma segunda página: a index.php. Conteúdo da página login.php: # Inicia uma sessão. Esta deve ser obrigatoriamente a primeira linha do arquivo. session_start(); ?> #Grava o número da sessão criada numa variável, chamada $sessid. $sessid = session_id(); ?>
3 de 11
12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo]
http://www.vivaolinux.com.br/artigos/impressora.p...
# Verifica se os campos não estão vazios if ($cara != "" and $codsecreto != "" and $OK != ""){; #Criptografando a senha digitada com MD5 $codsecreto = md5($codsecreto); # Iniciando a conexão com o banco de dados $conexao = mysql_connect('localhost', 'root', 'minhasenha'); mysql_select_db('nome_do_bd', $conexao); # Fazendo a consulta no banco de dados $consulta = mysql_query("SELECT codcliente, email, senha, privilegio, status FROM clientes where email='$cara' AND senha='$codsecreto'", $conexao); # Conta quantos registros foram encontrados $linhas = mysql_num_rows($consulta); # Se o resultado for apenas um registro: Sucesso! if ($linhas == 1){; # Pegando dados do cliente $codcliente = mysql_result($consulta,0,"codcliente"); $consulta_email = mysql_result($consulta,0,"email"); $consulta_privilegio = mysql_result($consulta,0,"privilegio"); $consulta_status = mysql_result($consulta,0,"status"); }; #Fechando a conexão após a consulta terminar mysql_close($conexao); }; # Verifica se o código do cliente é maior que zero # Verifica se o e-mail digitado não é vazio # Verifica se o e-mail digitado confere com o que foi localizado no banco de dados # Verifica se o status do cliente está ativo if ($codcliente >= 1 and $consulta_email == $cara and $consulta_email != "" and $consulta_status == "ATIVO"){; # Guarda IP da rede numa variável $iprede = $_SERVER['REMOTE_ADDR']; # Guarda a data numa variável, no formato do MySql (AAAA-MM-DD) $hoje_data = date("Y-m-d"); # Guarda a Hora numa variável $hoje_hora = date("H:i:s"); # Faz a conexão com o banco de dados $conexao = mysql_connect('localhost', 'root', 'minhasenha'); mysql_select_db('nome_do_bd', $conexao); # Cria um registro na tabela sessões, com os dados das variáveis acima $consulta = mysql_query("INSERT INTO sessoes VALUES('','$hoje_data','$hoje_hora','$ipserver','$iprede','$sessid','$cara','$datafecha','$horafecha','ABERTA')", $conexao); # Encerra a conexão mysql_close($conexao); # Redireciona o cliente para a página index.php header("Location: index.php" );
4 de 11
12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo]
http://www.vivaolinux.com.br/artigos/impressora.p...
}; ?> Até aqui (acima) os códigos em php tratam apenas das informações recebidas e redirecionam o cliente para uma página index.php, caso os dados estejam corretos. Ainda não temos o código HTML que compõe a página "visualmente". Se colarmos todos os códigos acima no arquivo login.php só aparecerá uma tela branca. Logo abaixo estão os códigos do HTML para criar os campos de preenchimento do nome e senha. Os códigos HTML devem ser colocados após os códigos em php descritos acima. Como usamos a mesma página (login.php) para logar e autenticar, os códigos em php são lidos primeiro e numa sequência de cima para baixo continuando até chegar ao HTML. Se no meio deste caminho, houv erem informações que conferem com o banco de dad os (como um login com sucesso, por exemplo), o php redirecionará o cliente para outra página antes mesmo de ler o código HTML. Caso as informações não "batam" com as do banco e dados, a leitura da página continuará descendo e como não há nenhum redirecionamento em casos de login errado, a sequência continuará até exibir o HTML novamente, ou seja, retornando para a tela de login. Resumindo: Se o login obtiver sucesso o php joga o cliente para outra página. Caso contrário exibirá a mesma página para que ele tente fazer login novamente. Veja o código do HTML. Login <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> Aqui encerramos a nossa página login.php, a qual é responsável por receber os dados digitados e conferir com o banco de dados. Nos campos de login e senha usei as palavras "cara" e "codsecreto", mas você pode colocar qualquer outra, desde que também faça as devidas mudanças no restante do código que se refere a elas. Explicando a página login.php numa sequência de ações: 1. O usuário digita o login e senha 2. A página login.php chama a ela mesma através do