Boteco Digital

Exemplo de autenticação em PHP utilizando sessão- Parte 1

Quando construimos 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 válidaçã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 autamaticamente, 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 precissamos 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. Primero precissamos 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 dezemas 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 caracter @ 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 algunas 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 incluimos com require_once(‘conf.php’).

Nas linhas 4 e 5 recebemos via POST o login e a senha, na linha 8 verficamos se o magic quotes está acionado, o magic_quotes serve para colocar automáticamente 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 verficar se o login e senha existem no banco de dados, para isso utilizamos uma consulta SQLcomo 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 encotrado um usuário com os dados passados(isso parace ó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 quardar as informações em seções e com isto não permitir que usuários visualizem páginas sem estar logados. Um abraço e te chero mais tarde.

Categorias PHP
comments powered by Disqus