You are on page 1of 11

Autenticação de sites com PHP e MySQL [Artigo] http://www.vivaolinux.com.br/artigos/impressora.p...

Autenticação de sites com PHP e MySQL

Autor: Djair Dutra C. Jr. <djair at easytecnologia.com.br>


Data: 08/12/2010

Entendendo 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 pelo php, mas o resultado foi o 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 sistema


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é porque 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 nenhuma 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. 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:

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 ;

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 ;

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); ?>


<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.

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, houverem informações que conferem com o banco de dados (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.

<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<table width="100%" height="100%" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td align="center" valign="middle">
<FORM ACTION=login.php METHOD=POST target=_self>
Login:
<input type=text name=cara>
Senha:
<input type=password name=codsecreto>
<input type=submit name=OK value=OK>
<a href="login.php?">Recuperar Senha</a>
</form>
</td>
</tr>
</table>
</body>
</html>

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 <FORM ACTION=login.php METHOD=POST
target=_self>
3. Quando ela recarrega, traz em suas variáveis "cara" e "codsecreto" as informações digitadas para login e
senha respectivamente.
4. De posse destes dados, o php (lá em cima) faz uma consulta ao banco de dados e checa se os dados
informados conferem com algum registro no banco de dados de usuários.
5. Se os dados conferem com algum registro, o php cria um novo registro na tabela sessões, guardando a

5 de 11 12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo] http://www.vivaolinux.com.br/artigos/impressora.p...

data, hora, número da sessão e login. Estes dados servem como um histórico de acessos e servem também
como base para a consulta das próximas páginas, coisa que veremos mais adiante.
6. Após conferir que o login está correto e criar o registro na tabela sessões, o php redireciona o cliente
para uma outra página, no caso chamada de index.php, mas que pode ser qualquer outra.

Protegendo cada arquivo individualmente

A página de login tem a função de um porteiro, que confere os dados do usuário e se forem positivos,
redireciona-o para uma página, aqui denominada index.php. Caso os dados não confiram com o banco de
dados, os usuários ficam barrados na porta.

Esta é uma ótima medida de segurança se não fosse por um problema: O que impede do cliente digitar a URL
de uma página diretamente no navegador, sem passar pelo porteiro? O que aconteceria se ele fizesse isso?

Obviamente teria acesso a qualquer outra página e o tal "porteiro" não barraria nada porque o cliente estaria
"pulando o muro" e uma vez dentro do prédio o acesso não é mais questionado.

Na verdade, o trabalho que devemos ter é de cercar o sistema de muros altos e intransponíveis, de forma que
só seja possível entrar passando pelo porteiro. Desta forma, sim, só teria acesso aqueles que receberam
autorização.

Para fazer isso colocaremos na primeira linha de cada arquivo uma verificação de autenticação, ou seja, se o
cliente foi autenticado com sucesso na tela de login, poderá ter acesso ao arquivo.

Criando o arquivo sessoes.php

Antes, uma breve explicação sobre as sessões dos navegadores

Cada vez que você abre seu navegador, é criada uma sessão única, que trata-se de uma string com 32
caracteres, contendo letras e números. Exemplo: d5598f5a83a466e00bd0df58167d1994. As sessões mudam
quando você fecha o navegador, mas não quando fecham apenas a página e continua com o navegador aberto,
com outras abas.

Aquela linha <? session_start(); ?> que tem no início da página login.php e que também está presente na
primeira linha do arquivo sessoes.php são responsáveis por iniciar as sessões.

É importante informar que quando uma sessão é criada, por mais que você entre numa página que tem o
código para criá-la novamente, ela não mudará de número. Ou seja, se ela já existe, continua como está. Estas
sessões são a base para a autenticação das outras páginas que devem ter acesso restrito.

Criando o arquivo sessoes.php:

Lembra que, quando o usuário faz o login com sucesso, é criado um registro na tabela sessoes, onde são
guardados seu login, data, hora e principalmente o número da sessão? Pois estes dados são fundamentais para
o acesso às outras páginas. Eles funcionam como uma credencial, ou um crachá que pode ser mostrado em
todas as portarias internas e dar-lhe acesso aos setores internos, afinal se "porteiro" o permitiu entrar é
porque trata-se de alguém de confiança.

O que este arquivo faz é pegar o número da sessão atual, verificar se existe algum registro no banco de dados
referente a ela. Se houver um registro, ele ainda verifica se trata-se de uma sessão ativa ou se já foi encerrada
pelo usuário.

Caso a sessão exista e esteja ativa, o php pega apenas duas variáveis chamadas "sessao" e "usuario" que
respectivamente levam o número da sessão e o login do usuário que estão na tabela sessoes.

Caso não exista, as variáveis "sessao" ou "usuario" ficarão vazias e o comando "if" destruirá as sessões e jogará

6 de 11 12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo] http://www.vivaolinux.com.br/artigos/impressora.p...

o usuário para a tela de login novamente.

Em resumo, este arquivo verifica se há uma sessão dando permissão ao usuário e se não houver ela
redireciona-o para a tela de login. Veja o código completo do arquivo sessoes.php.

<? # Inicia uma sessão


session_start();
?>

<? # Pega o número da sessão criada e grava numa variável


$sessid = session_id();
?>

<?
# Inicia uma conexão com o banco de dados
$conexao = mysql_connect('localhost', 'root', 'minhasenha');
mysql_select_db('nome_do_bd', $conexao);

# Faz uma consulta para encontrar registros de sessões ativas (com status ABERTA)
# que coincidam com a sessão atual do usuário.
$consulta = mysql_query("SELECT * FROM sessoes where sessao='$sessid' and status='ABERTA'", $conexao);

# Pega a quantidade de linhas encontradas na busca


$linhas = mysql_num_rows($consulta);

# Se há mais de uma linha encontrada, grava sessão e login em duas variáveis


if ($linhas >= 1){;
$sessao = mysql_result($consulta,0,"sessao");
$usuario = mysql_result($consulta,0,"usuario");
};

#Finaliza a conexão com o banco de dados


mysql_close($conexao);

# Confere se a variável "sessao" não é diferente da sessão atual do usuário;


# Confere se a variável "sessao" não é vazia;
# Confere se a variável "usuario" não é vazia.
if ($sessao != $sessid or $sessao == "" or $usuario == ""){;

# Se alguma das verificações acima for verdadeira, executa os códigos abaixo

# Destrói a sessão atual


session_unset();
session_destroy();

# Redireciona para a página de login.php


header("Location: login.php");
};
?>

Como inserir este código nos demais arquivos do sistema?

A página sessoes.php é quem verifica se há uma sessão aberta, tendo portanto, uma função de autenticação.
Mas como fazer para que estas autenticações sejam chamadas pelas demais páginas do sistema? Simples!
Através do código <? include('sessoes.php'); ?> que deve estar presente na primeira linha de cada página que
se deseja autenticar. Só isso!

Quando uma página restrita for acessada (pedidos.php, por exemplo), mesmo que seja digitando sua URL no

7 de 11 12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo] http://www.vivaolinux.com.br/artigos/impressora.p...

navegador, esta simples linha "chama" a página sessoes.php e esta faz seu trabalho de autenticar.

Se o resultado for positivo, nada acontecerá, portanto a página volta a ser exibida normalmente. Se o
resultado da autenticação for negativo a segunda linha nem chegará a ser carregada, porque o arquivo
sessoes.php jogará imediatamente o cliente para a página login.php.

Não esqueça de que o comando include('sessoes.php') deve ser colocado na primeira linha de todas as páginas
php.

Entenda que, quando usamos um comando include, o php faz uma pausa no arquivo atual e vai ler o arquivo
contido no include. Só quando acaba de ler o arquivo do include é que ele volta a ler a segunda, terceira,
quarta e demais linhas do arquivo atual.

Criando o Logoff
Já que temos a autenticação toda pronta, agora vamos criar um arquivo chamado logoff.php que será
responsável por encerrar a sessão. Este recurso é apenas um cuidado a mais, porque na verdade, quando o
usuário fecha o navegador a sessão é encerrada, mas pode acontecer casos em que ele queira encerrar a
conexão, mas também continuar com seu navegador aberto.

O código é bem simples e, resumidamente, trata-se apenas de mudar o valor do campo status de ABERTA para
FECHADA e gravar a hora que isso aconteceu. Simples!

<? # 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();
?>

# 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);

# Seleciona o registro referente a sessão atual


# Muda o campo status para FECHADA
# Informa a data e hora de fechamento
mysql_query("UPDATE sessoes SET status=FECHADA', datafecha='$hoje_data', horafecha='$hoje_hora'
WHERE sessao='$sessid'", $conexao);

# Destrói as sessões
session_unset();
session_destroy();

# Redireciona o cliente para a tela de login


header("Location: login.php");
?>

Você pode colocar um link simples para esta página em qualquer ligar do seu sistema de login. A exemplo do
Google coloque no canto superior direito, de forma discreta. Pode ser associado a uma imagem, de um
cadeado, por exemplo.

8 de 11 12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo] http://www.vivaolinux.com.br/artigos/impressora.p...

É aconselhável colocar uma caixa de confirmação em JavaScript, perguntando se o usuário realmente deseja
efetuar logoff.

Finalizando (Dicas e maiores detalhes sobre o artigo)

Para melhorar a segurança, aconselho a colocação dos arquivos em php em pastas separadas, diferentes da
pasta raiz do servidor web. Como o PHP é uma linguagem server-side, ou seja, que roda no servidor, ele lê a
árvore de diretórios na visão do servidor e não na visão que o apache mostra ao navegador.

O apache mostra no navegador apenas o que tem acima da pasta /var/www, obviamente para ninguém ter
acesso às demais pastas a arquivos através do browser. Já com o php é diferente, pois ele enxerga todo o
servidor.

Portanto, podemos colocar arquivos php fora da área do servidor web, como em /etc ou em /var e "chamar"
estes arquivos através do comando include ou require.

Esta é uma forma segura, pois na pasta raiz do servidor web (/var/www) colocaríamos apenas um arquivo e os
demais seriam chamados através do comando include.

Neste artigo, me desfiz deste método para facilitar as explicações e as localizações dos arquivos, mas não é
aconselhável desenvolver um site assim.

Melhorando o código
Para diminuir ainda mais este artigo, também não criei avisos ou caixas informativas quando ocorrem erros,
mas é extremamente recomendável que um bom sistema avise e informe o usuário quando ocorrerem erros, de
autenticação. Um bom exemplo, seria usar um alert em javascript para informar ao usuário que login ou senha
não conferem.

Outro recurso simples que pode dar uma melhorada no seu site é colocar o foco do teclado no campo de login.
Geralmente o navegador não dá esse foco no primeiro campo da página e o usuário sempre tem que clicar no
campo para começar a digitar.

Para resolver este problema coloque o código abaixo entre as tags <body></body> do arquivo login.php.
Lembrando que o campo texto "cara" deve ter uma id= "cara" para que o JavaScript possa achar este campo.

<script language="JavaScript" type="text/JavaScript">


document.getElementById('cara').focus()
</script>

Gerenciando usuários
Visando a simplicidade do artigo também tirei um recurso importante para um bom site, que é uma página
para gerenciamento de usuários, no qual o administrador do site não precisa usar o phpmyadmin para inserir
dados "manualmente" no banco de dados.

Nesta página tanto é feito a adição de novos usuários como a edição e exclusão, sem contar que o processo de
gerar senha com MD5 pode ser automatizado, sem ter que recorrer todo tempo ao arquivo senha.php.

Num bom sistema é importante que cada usuário tenha acesso a alterar apenas sua própria senha. É
importante também que esta função seja inserida em um sistema.

9 de 11 12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo] http://www.vivaolinux.com.br/artigos/impressora.p...

Restrições por acesso


Dependendo do tamanho do seu sistema, talvez surja a necessidade de criar níveis diferentes de usuários e
liberar a cada um apenas uma parte do sistema. Os mesmos métodos para "expulsar" um usuário de uma
página sem autenticação podem ser usados também neste tipo de restrição. Basta usar a criatividade.

Num grande sistema, por exemplo, um usuário deve ter acesso apenas aos relatórios financeiros, mas não
pode mexer nas movimentações do caixa. Já outro usuário deve controlar o cadastro de clientes, mas não pode
ter acesso aos relatórios.

No exemplo deste artigo, ao cadastrar o usuário "djair" coloquei a palavra "ADMIN" no campo de nome
"privilegio". Apesar deste campo ser irrelevante nos códigos que exemplifiquei, esta é uma forma de
identificar que tipo de usuário está acessando o sistema e fazer possíveis redirecionamentos baseados nesta
informação.

Eu poderia, por exemplo, fazer uma verificação para redirecionar os ADMIN para uma página e os COMUNS
para outras. Poderia ainda fazer verificações no ato de excluir um registro. Se o cliente for ADMIN pode
excluir, caso contrário isso será negado a ele.

Existem várias maneiras de manipular usuários autenticados. Esta é apenas uma.

Dica de segurança
Apesar de existirem outras formas de redirecionamento em outras linguagens, como JavaScript, optei por usar
o redirecionamento do php porque ele funcionou em todos os navegadores, inclusive em downloads, com o
wget. Os redirecionadores feitos em JavaScript dependem deste recurso ativado no browser e em testes que
fiz, tive acesso ao conteúdo que deveria ser bloqueado.

Sobre a conexão com banco de dados


Também visando uma explicação mais enxuta usei um esquema de conexão no qual o código com usuário e
senha do banco de dados está presente dentro dos arquivos login.php, sessoes.php e logoff.php, mas esta não
é a forma aconselhável de fazer isso.

Um site com sistema de login deve planejar-se em relação a isso e criar um só arquivo responsável por fazer a
autenticação e em cada página fazer uma "chamada" a este arquivo através de códigos include ou require.
Desta forma não teríamos as senhas que dão acesso ao banco de dados espalhadas por vários arquivos.

É também importante citar que fiz os códigos "propositalmente" usando o usuário root para que no final
pudesse falar sobre isso separadamente. É extremamente recomendável (quase obrigatório) que você crie um
usuário do mysql específico para acessar seu sistema com autenticação e jamais usar o root.

Criando um usuário específico, você pode definir somente as tabelas que ele terá acesso, definirá se ele pode
excluir, adicionar etc. Se sua necessidade é um usuário que tenha acesso a tudo, faça isso dando todos os
privilégios a um novo usuário, mas não use o root dentro de sues códigos php. Não confunda! Estou falando de
um usuário do MySQL e não de um usuário do seu sistema de login.

Sobre os sistemas de autenticação


Neste artigo decidi mostrar uma alternativa de autenticação em php eficaz apenas para sites ou sistemas no
qual a necessidade seja proteger apenas os arquivos php. Como informado no início, todos os outros arquivos
que não sejam php estarão disponíveis a qualquer pessoa, mesmo que esta não esteja autenticada.

10 de 11 12-12-2010 15:31
Autenticação de sites com PHP e MySQL [Artigo] http://www.vivaolinux.com.br/artigos/impressora.p...

Existem várias outras alternativas disponíveis para autenticação, inclusive com restrição para outros tipos de
arquivos que não sejam php. O intuito deste artigo foi mostrar apenas um método.

Cabe ao desenvolvedor fazer um projeto minucioso de como será seu site, avaliar as necessidades, o tipo de
dados do sistema e só depois se decidir por uma das diversas alternativas disponíveis.

Considerações finais
Espero sinceramente que este artigo possa ajudar alguém como uma alternativa para o desenvolvimento de
um site com autenticação. Procurei resumir cada detalhe importante da maneira mais fácil possível e até
repeti alguns assuntos e algumas explicações buscando reafirmar o conhecimento ou dar ênfase a algo
relevante para o artigo.

Agradeço a quem puder contribuir com alguma dica, informar falhas do código, questionar, ou sugerir alguma
coisa que possa facilitar ou melhorar seu desempenho e segurança.

http://www.vivaolinux.com.br/artigo/Autenticacao-de-sites-com-PHP-e-MySQL

Voltar para o site

11 de 11 12-12-2010 15:31

You might also like