Exemplo de autenticação em PHP utilizando sessão- Parte 1
Quando construímos qualquer tipo de sistemas web, seja um simples gerenciador de de notícias a um e-commerce temos um ponto em comum, precisamos fazer a validação do usuário que irá interagir com o sistema. Então veremos a seguir vermos como criar sistema de login básico utilizando banco de dados MySQL.
Para começarmos iremos criar a tabela no banco de dados, segue abaixo a DDL da tabela.
CREATE TABLE usuarios(
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
login VARCHAR(10) NOT NULL,
senha VARCHAR(100) NOT NULL
);
//senha 12345
INSERT INTO usuarios(nome,email,login,senha) VALUES('Rodrigo','blogbotecodigital@gmail.com','rodrigo', '827ccb0eea8a706c4c34a16891f84e7b');
A tabela é bem simples tendo apenas um id
inteiro que se incrementa automaticamente, o nome do usuário, seu email e seu login e senha para de acesso. Como podemos ver na linha 10 temos uma inserção de um usuário básico, com a senha já “criptografada” com a função hash md5. Utilizamos esta técnica de para que a senha real do usuário não fique armazenada no banco de dados e alguém que tenha acesso a ele possa ver a senha, é claro que é possível descobrir palavras que gerem este hash por foça bruta mas já oferece uma certa segurança.
Agora precisamos de uma formulário para que o usuário entre com seu login e senha:
<form action="autentica.php" method="post">
<label for="login">Login:</label>
<input id="login" name="login" type="text" />
<label for="senha">Senha</label>
<input id="senha" name="senha" type="password" />
<input type="submit" value="Enviar" />
</form>
Tendo o banco de dados e um formulário para o usuário fornecer os dados podemos começar a autenticar o usuário. Primeiro precisamos conectar ao banco de dados, normalmente faço isso em um arquivo a parte, pois se for necessário posteriormente alterar algum dado de conexão ao banco só é necessário mudar esse arquivo e não em dezenas de outros espalhados pelo sistema.
//Configura de acesso ao banco de dados
$conf['host'] = "localhsot"; //host do banco de dados
$conf['bd'] = "teste"; //nome do banco
$conf['usuario'] = "user"; //nome de usuário de acesso ao banco
$conf['senha'] = "123456"; //senha de acesso ao banco de dados
//conexão com o banco de dados
$conexao = @mysql_connect($conf['host'], $conf['usuario'], $conf['senha']) or die("ERRO NA CONEXÃO COM MYSQL");
$db = @mysql_select_db($conf['bd'], $conexao) or die("ERRO NA SELEÇÃO DO BANCO DE DADOS MYSQL");
Para aqueles que já têm algum contato com banco de dados sabem que para nos conectarmos precisamos saber o host em que está o banco (linha 2), e devemos fornecer um login e senha(linhas 4 e 5). O PHP para realizar uma conexão a um banco de dados MySQL utiliza a função mysql_connect($host,$user,$senha)
que, como podemos ver, recebe o host, o usuário e a senha como parâmetros e retorna um identificador desta conexão para utilizarmos ela no futuro.
Gostaria de chamar a atenção para o carácter @ antes das funções que interagem com o banco de dados, elas servem para que se ocorrer algum erro de conexão eles não gerem um warnning para o usuário não mostrando algumas informações importante como nome de usuário, host do banco, ou nome do banco que pode por em risco a segurança do servidor.
Na linha 9 selecionamos qual banco de dados está nossa tabela utilizando a função mysql_select_db(nome,conexao)
.
//fazemos o include do conf.php
require_once("conf.php");
$login = $_POST['login'];
$senha = $_POST['senha'];
//coloca \ antes das aspas para evitar SQL Injection
if(get_magic_quotes_gpc() == 0){
$login = addslashes($login);
$senha = addslashes($senha);
}
//criptografamos a senha
$senha = md5($senha);
Vamos à autenticação do usuário no arquivo autentica.php
. Começamos incluindo o arquivo de conexão ao banco de dados explicado um pouco acima, que eu salvei em conf.php
, então o incluímos com require_once('conf.php')
.
Nas linhas 4 e 5 recebemos via POST o login e a senha, na linha 8 verificamos se o magic quotes está acionado, o magic_quotes
serve para colocar automaticamente barras( \ ) antes de aspas e barras, esta é uma opção configurável via PHP.ini
então se ela estiver desabilitada colocamos as barras com a função addslashes(str)
que tem o mesmo efeito de magic_quotes
.
Na linha 14 criptografamos a senha utilizando a função md5(str)
que retorna um código hash da string passada. Não é exatamente uma criptografia, mas sim um código gerado através da senha. Este código é de mão única, ou seja não é possível tendo este código chegar a string original. Isto fornece a segurança de que a senha digitada pelo usuário não fique explicitamente gravada no banco de dados, ficando assim visível a todos que tenha acesso a ele.
//executamos uma consulta no banco de dados
$sql = mysql_query("SELECT id, nome FROM usuarios WHERE login = '$login' AND senha = '$senha'") or die("ERRO NO COMANDO SQL");
//retorma o número de linhas retornadas pela consulta acima
$row = mysql_num_rows($sql);
if($row == 0){
echo "Erro: Usuário ou Senha inválidos";
echo "";
echo "<a href="login.php">voltar</a>";
}else{
$id = mysql_result($sql, 0, "id");//pegamos o id do usuario autentica
$nome = mysql_result($sql, 0, "nome");//pegamos o nome do usuário autenticado
//redirecionamos para a página do resultado
header("Location: resultado.php");
}
Agora vamos verificar se o login e senha existem no banco de dados, para isso utilizamos uma consulta SQL como mostrado na linha 2 onde utilizamos a função mysql_query($sql)
, ela retorna um identificador o qual devemos utilizar para obter os dados retornados por esta consulta.
Na linha 5 utilizamos a função mysql_num_rows($sql)
para sabermos quantas linha foram retornadas pela nossa consulta ou seja quantos usuários existem no banco de dados com o login e a senha passadas. Na linha 7 verificamos se o números de linhas retornada é igual a 0 ou seja não havia nenhum usuário no banco com estes dados e então informamos isto para ele.
Se o número de linhas foi diferente de “0” quer dizer que foi encontrado um usuário com os dados passados(isso parece óbvio não?), então podemos pegar os dados de nome e id do banco utilizando a função mysql_result($sql,nomedocampo)
, após isto redirecionamos o usuário para a página protegida com a função header('location: pagina')
.
Bom isso é tudo por hoje, que quiser pode fazer o download dos scripts deste tutorial aqui. No próximo tutorial vamos ver como guardar as informações em seções e com isto não permitir que usuários visualizem páginas sem estar logados.