Enviar por e-mail
Imprimir
Foto por Hazel Motes
Por Sessão
Sessão, também conhecida por sessão de comunicação, é uma informação interativa semi-permanente entre computadores que é estabelecida por um certo intervalo de tempo.
Sessão HTTP - armazenamento de dados em um arquivo único no servidor, um cookie é utilizado como identificador da sessão.
Ao contrário de que muitos pensam - a sessão depende de cookie. Não existe sessão sem cookie.
A grande vantagem da persistência de autenticação por sessão é que os dados não ficam expostos e trafegando livremente pela internet, os dados ficam armazenados no servidor Web e um cookie identifica o cliente. Sendo assim, um flag (sinalizador) em sessão já é o suficiente para restringir o acesso.
<?php
function forbidden() {
// inicia a sessão
if (empty($_SESSION))
session_start();
// deve ser verificado se as variáveis de sessão que são criadas no processo de autenticação existem
if (empty($_SESSION['usuario'])) {
// Se não existir o usuário é redirecionado para a página de autenticação
header('Location: /login.html');
exit();
}
}
?>
Todos as páginas, arquivou ou funcionalidades que forem restritas a usuários autenticados devem incluír e executar essa função. Crie a função em um arquivo separado e inclua nos demais, se alguma regra mudar só será necessário alterar um arquivo e não dezenas.
Exemplo:
<?php
// index.php
require('forbidden.php');
forbidden();
// ...
?>
Por Cookie
Manter e testar uma autenticação por cookie é um pouco diferente e mais complicado, é necessário tomar certos cuidados para não comprometer a segurança do sistema e do usuário.
O cookie é criado e armazenado no computador do cliente, sendo assim, podem ser fácilmente manipulado. Não é necessário de nenhuma ferramenta sofisticada para criar, apagar e modificar os cookies, alguns plug-ins do Mozilla Firefox já fazem isso.
Diferente da sessão, um flag, como por exemplo um valor booleano, não é suficiente para manter a autenticação e acesso seguro. No mínimo o usuário e senha devem ser armazenados em cookie para depois ser testados em todos os acessos. Esse teste consiste em verificar a integridade dos dados.
Quantas senhas diferentes você usa?
Outra questão muito importante é como você vai armazenar o usuário e senha? Em geral, o usuário não é uma informação altamente sigilosa, então pode ser armazenado em sua forma simples (cuidado com CPF e outros dados, opte por e-mail, nome da conta, número incremental único ou id). A senha não pode ser armazenada em sua forma simples ou você estará comprometendo os dados do usuário. Uma pessoa que tenha acesso ao computador do usuário ou aos dados trafegados na rede facilmente vai encontrar a senha, e se ela não estiver modificada isso vai ser um grande problema. Uma das soluções é gerar um hash da senha, como o MD5, e armazenar o hash no cookie.
Não armazene as senhas no banco de dados ou em qualquer outro arquivo sem antes criptografá-la. Se o site ou sistema for invadido ou algum intruso tenha acesso a informação vai descobrir a senha real dos usuários ou documentos. Gere um hash com MD5 e/ou PASSWORD e armazene o hash.
Cookie - Modelo do processo de criação e envio
GET /index.html HTTP/1.1 Host: www.examplo.com.br
Navegador solicita uma página ao servidor
HTTP/1.1 200 OK Content-type: text/html Set-Cookie: name=value
Servidor responde a solicitação e envia um pedido de criação de cookie para o navegador
GET /materia.html HTTP/1.1 Host: www.exemplo.com.br Cookie: name=value
Navegador envia todos os cookies do domínio e livres a cada solicitação
Exemplo do que não deve ser feito
<?php
// flag
if (empty($_COOKIE['autenticado']) || !$_COOKIE['autenticado'])
exit('Acesso restrito');
?>
Simplesmente cria-se um cookie com o nome "autenticado" e valor "1" e pronto! Está autenticado e com acesso livre nas páginas de acesso restrito do sistema.
Exemplo seguro
<?php
function forbidden() {
$teste = false;
if (isset($_COOKIE['usuario']) && isset($_COOKIE['senha'])) {
// Faça tratamento da string para evitar SQL Injection. Retirar as aspas simples e duplas já é suficiente
$get = mysql_query("SELECT id FROM usuario WHERE usuario = '{$_COOKIE['usuario']}' AND senha = '{$_COOKIE['senha']}'");
if (mysql_num_rows($get))
$teste = true;
}
// Redireciona para a página de autenticação
if (!$teste) {
header('Locaton: /login.html');
exit();
}
}
?>
É aceitável, mas não é o melhor método. O cookie precisa ser único para o navegador que o usuário usou para se autenticar. Mas isso fica pra próxima.
Persistência da autenticação por sessão é mais segura e mais simples, mas o tempo de vida de uma sessão é muito curto, muitas vezes não passa de 2 horas, já o cookie pode durar meses, mas a desenvantagem do cookie é que os dados podem ser modificados pelo cliente e por isso precisam ser tratados e verificados quanto a sua intergridade constantemente.
Comentar
RSS
RSS
ótimo artigo! ótimo site!