Escolar Documentos
Profissional Documentos
Cultura Documentos
Nosso sistema será bem simples: um arquivo chamado seguranca.php, que deverá ser
incluído no topo do seu site (em todas as páginas) e que faz a conexão com o banco de
dados e que possui algumas funções usadas para redirecionar o visitante para o
formulário de login (login.php) caso ele não esteja logado.
Vamos ao trabalho:
O que iremos definir primeiro é a tabela usada para armazenar os usuários do sistema:
Execute esse bloco SQL no seu banco de dados para criar a tabela usada pelo sistema.
Depois disso, vamos ao formulário de login que você colocará dentro de um arquivo
chamado login.php:
Esse formulário, com apenas dois campos, manda pra página valida.php, que é um
pequeno PHP que receberá os dados enviados pelo formulário, fará a validação deles e
mandará o visitante ou pra página interna (index.php) ou de volta pra página de login
(login.php).
Esse é o codigo fonte do arquivo valida.php:
03
04 // Verifica se um formulário foi enviado
05 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
06 // Salva duas variáveis com o que foi digitado no formulário
// Detalhe: faz uma verificação com isset() pra saber se o campo foi
07
preenchido
08 $usuario = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';
09 $senha = (isset($_POST['senha'])) ? $_POST['senha'] : '';
10
// Utiliza uma função criada no seguranca.php pra validar os dados
11
digitados
12 if (validaUsuario($usuario, $senha) == true) {
// O usuário e a senha digitados foram validados, manda pra página
13
interna
14 header("Location: index.php");
15 } else {
// O usuário e/ou a senha são inválidos, manda de volta pro form de
16
login
// Para alterar o endereço da página de login, verifique o arquivo
17
seguranca.php
18 expulsaVisitante();
19 }
20 }
A estrutura do seu site, até esse ponto, deve estar dessa forma:
Agora vamos criar o arquivo seguranca.php na mesma pasta dos demais arquivos:
001 /**
002 * Sistema de segurança com acesso restrito
003 *
004 * Usado para restringir o acesso de certas páginas do seu site
005 *
006 * @author Thiago Belem <contato@thiagobelem.net>
007 * @link http://thiagobelem.net/
008 *
047
048 /**
049 * Função que valida um usuário e senha
050 *
051 * @param string $usuario - O usuário a ser validado
052 * @param string $senha - A senha a ser validada
053 *
054 * @return bool - Se o usuário foi validado ou não (true/false)
055 */
056 function validaUsuario($usuario, $senha) {
057 global $_SG;
058
059 $cS = ($_SG['caseSensitive']) ? 'BINARY' : '';
060
061 // Usa a função addslashes para escapar as aspas
062 $nusuario = addslashes($usuario);
063 $nsenha = addslashes($senha);
064
065 // Monta uma consulta SQL (query) para procurar um usuário
$sql = "SELECT `id`, `nome` FROM `".$_SG['tabela']."` WHERE ".$cS."
066 `usuario` = '".$nusuario."' AND ".$cS." `senha` = '".$nsenha."'
LIMIT 1";
067 $query = mysql_query($sql);
068 $resultado = mysql_fetch_assoc($query);
069
070 // Verifica se encontrou algum registro
071 if (empty($resultado)) {
072 // Nenhum registro foi encontrado => o usuário é inválido
073 return false;
074
075 } else {
076 // O registro foi encontrado => o usuário é valido
077
078 // Definimos dois valores na sessão com os dados do usuário
$_SESSION['usuarioID'] = $resultado['id']; // Pega o valor da
079
coluna 'id do registro encontrado no MySQL
$_SESSION['usuarioNome'] = $resultado['nome']; // Pega o valor da
080
coluna 'nome' do registro encontrado no MySQL
081
082 // Verifica a opção se sempre validar o login
083 if ($_SG['validaSempre'] == true) {
084 // Definimos dois valores na sessão com os dados do login
085 $_SESSION['usuarioLogin'] = $usuario;
086 $_SESSION['usuarioSenha'] = $senha;
087 }
088
089 return true;
090 }
091 }
092
093 /**
094 * Função que protege uma página
095 */
096 function protegePagina() {
097 global $_SG;
098
if (!isset($_SESSION['usuarioID']) OR !
099
isset($_SESSION['usuarioNome'])) {
100 // Não há usuário logado, manda pra página de login
101 expulsaVisitante();
} else if (!isset($_SESSION['usuarioID']) OR !
102
isset($_SESSION['usuarioNome'])) {
103 // Há usuário logado, verifica se precisa validar o login novamente
104 if ($_SG['validaSempre'] == true) {
// Verifica se os dados salvos na sessão batem com os dados do
105
banco de dados
if (!validaUsuario($_SESSION['usuarioLogin'],
106
$_SESSION['usuarioSenha'])) {
107 // Os dados não batem, manda pra tela de login
108 expulsaVisitante();
109 }
110 }
111 }
112 }
113
114 /**
115 * Função para expulsar um visitante
116 */
117 function expulsaVisitante() {
118 global $_SG;
119
120 // Remove as variáveis da sessão (caso elas existam)
unset($_SESSION['usuarioID'], $_SESSION['usuarioNome'],
121
$_SESSION['usuarioLogin'], $_SESSION['usuarioSenha']);
122
123 // Manda pra tela de login
124 header("Location: ".$_SG['paginaLogin']);
125 }
Não vou poder explicar todas as funções do arquivo pq é muita coisa.. Mas todas elas
estão devidamente comentadas e documentadas… É só olhar.
Com esse arquivos nós já nos conectamos automaticamente ao servidor MySQL, então
se você usar outra forma pra fazer a conexão, vá na parte de configurações do
seguranca.php e defina a variável $_SG['conectaServidor'] pra falso (false). O mesmo
acontece pra sessão com a variável $_SG['abreSessao'].
Agora é só incluir essas linhas no topo de cada arquivo que deverá ter o acesso restrito:
1 <?php
2
// Verifica se houve POST e se o usuário ou
3
a senha é(são) vazio(s)
if (!empty($_POST) AND
4 (empty($_POST['usuario']) OR
empty($_POST['senha']))) {
5 header("Location: index.php"); exit;
6}
7
8 ?>
Com isso, todo código que vier depois desse if estará
seguro de que os dados foram preenchidos no formulário.
01 <?php
02
// Verifica se houve POST e se o usuário
03
ou a senha é(são) vazio(s)
if (!empty($_POST) AND
04 (empty($_POST['usuario']) OR
empty($_POST['senha']))) {
05 header("Location: index.php"); exit;
06 }
07
08 // Tenta se conectar ao servidor MySQL
mysql_connect('localhost', 'root', '') or
09
trigger_error(mysql_error());
// Tenta se conectar a um banco de dados
10
MySQL
mysql_select_db('usuarios') or
11
trigger_error(mysql_error());
12
$usuario =
13 mysql_real_escape_string($_POST['usuario'])
;
$senha =
14
mysql_real_escape_string($_POST['senha']);
15
16 ?>
Agora é hora de validar os dados contra a tabela de
usuários:
01 <?php
02
// Verifica se houve POST e se o usuário
03
ou a senha é(são) vazio(s)
if (!empty($_POST) AND
04 (empty($_POST['usuario']) OR
empty($_POST['senha']))) {
05 header("Location: index.php"); exit;
06 }
07
08 // Tenta se conectar ao servidor MySQL
mysql_connect('localhost', 'root', '') or
09
trigger_error(mysql_error());
// Tenta se conectar a um banco de dados
10
MySQL
mysql_select_db('usuarios') or
11
trigger_error(mysql_error());
12
$usuario =
13 mysql_real_escape_string($_POST['usuario'])
;
$senha =
14
mysql_real_escape_string($_POST['senha']);
15
16 // Validação do usuário/senha digitados
$sql = "SELECT `id`, `nome`, `nivel` FROM
`usuarios` WHERE (`usuario` = '". $usuario
17
."') AND (`senha` = '". sha1($senha) ."')
AND (`ativo` = 1) LIMIT 1";
18 $query = mysql_query($sql);
19 if (mysql_num_rows($query) != 1) {
// Mensagem de erro quando os dados são
20
inválidos e/ou o usuário não foi encontrado
21 echo "Login inválido!"; exit;
22 } else {
// Salva os dados encontados na
23
variável $resultado
24 $resultado = mysql_fetch_assoc($query);
25 }
26
27 ?>
Repare que estamos buscando registros que tenham o
usuário igual ao digitado pelo visitante e que tenham uma
senha igual a versão SHA1 da senha digitada pelo
visitante… Também buscamos apenas por registros de
usuários que estejam ativos, assim quando você precisar
remover um usuário do sistema, mas não pode
simplesmente excluir o registro é só trocar o valor da
coluna ativo pra zero.
19 if (mysql_num_rows($query) != 1) {
// Mensagem de erro quando os dados são
20
inválidos e/ou o usuário não foi encontrado
21 echo "Login inválido!"; exit;
22 } else {
// Salva os dados encontados na
23
variável $resultado
24 $resultado = mysql_fetch_assoc($query);
25
26 // Se a sessão não existir, inicia uma
27 if (!isset($_SESSION)) session_start();
28
// Salva os dados encontrados na
29
sessão
$_SESSION['UsuarioID'] =
30
$resultado['id'];
$_SESSION['UsuarioNome'] =
31
$resultado['nome'];
$_SESSION['UsuarioNivel'] =
32
$resultado['nivel'];
33
34 // Redireciona o visitante
35 header("Location: restrito.php"); exit;
36 }
01 <?php
02
// A sessão precisa ser iniciada em cada
03
página diferente
04 if (!isset($_SESSION)) session_start();
05
// Verifica se não há a variável da sessão
06
que identifica o usuário
07 if (!isset($_SESSION['UsuarioID'])) {
08 // Destrói a sessão por segurança
09 session_destroy();
// Redireciona o visitante de volta pro
10
login
11 header("Location: index.php"); exit;
12 }
13
14 ?>
15
16 <h1>Página restrita</h1>
<p>Olá, <?php echo
17
$_SESSION['UsuarioNome']; ?>!</p>
Pronto meu amigo! O seu sistema de login está pronto
para funcionar… Só vamos fazer alguns incrementos para
ele ficar mais “usável”… Agora você vai ver como fazer
a verificação de usuário logado e de nível de acesso, por
exemplo para uma página onde apenas os
administradores possam ter acesso:
01 <?php
02
// A sessão precisa ser iniciada em cada
03
página diferente
04 if (!isset($_SESSION)) session_start();
05
06 $nivel_necessario = 2;
07
// Verifica se não há a variável da sessão
08
que identifica o usuário
if (!isset($_SESSION['UsuarioID']) OR
09 ($_SESSION['UsuarioNivel'] <
$nivel_necessario)) {
10 // Destrói a sessão por segurança
11 session_destroy();
// Redireciona o visitante de volta pro
12
login
13 header("Location: index.php"); exit;
14 }
15
16 ?>
Código de Logout
1 <?php
2 session_start(); // Inicia a sessão
session_destroy(); // Destrói a sessão
3
limpando todos os valores salvos
header("Location: index.php"); exit; //
4
Redireciona o visitante
5 ?>