Autenticação de sites com PHP e MySQL
Neste artigo pretendo mostrar uma maneira fácil, simples e segura de fazer um sistema de autenticação em PHP com MySQL. Todas as sessões são registradas em um banco de dados com o IP, data e hora de acesso, deixando um enorme histórico excelente para futuras auditorias. Procurarei detalhar o máximo possível para facilitar a compreensão do artigo.
Parte 2: 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. Os 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:
Código para criar a tabela de sessões:
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.
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.
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.
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.
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 NULL 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 ;
`codusuario` int(11) NOT NULL 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) DEFAULT NULL,
`iprede` varchar(255) DEFAULT 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 ;
`codsessao` mediumint(9) NOT NULL AUTO_INCREMENT,
`data` date DEFAULT NULL,
`hora` time DEFAULT NULL,
`ipserver` varchar(255) DEFAULT NULL,
`iprede` varchar(255) DEFAULT 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.
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); ?>
<form method=post action=senha.php>
<input type=text name=senha>
<input type=submit name=OK value=OK>
</form>
<form method=post action=senha.php>
<input type=text name=senha>
<input type=submit name=OK value=OK>
</form>
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', 'djair@easytecnologia.com.br', '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ágina. 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 gigantesco.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.
Quanto aos arquivos com outras estensões que não php, não existe uma opção que faça o php processar todo e qualquer tipo de arquivo ? Seria meio que um disfarce para o arquivo onde o php intercepta o carregamento e faz todas as verificações como se quele fosse um arquivo php real.
Até mais.