Nossos pensamentos, nossas atitudes, nossas emoções, tudo são formas de energia, constantemente influenciando o mundo a nossa volta. (Diane Dreher)

logo Moraga  
Principal
Categorias
Ferramentas

telescópio

Semanal Mensal Geral
  1. Converter Byte em KB, MB, GB, TB, EB
  2. Verificar CPF com PHP
  3. Jogo da velha ou Tic tac toe
  4. Captcha em PHP
  5. createElement - Solução compatível com os navegadores
  6. removeChild - Remover elementos HTML por Javascript
  7. Copiando tabelas e removendo registros duplicados no MySQL
  8. Gerando Thumbnails com PHP
  9. Removendo linhas e espaços em branco de strings
  10. Apache Expires Header - Cache de imagens, Javascript e CSS
  1. Converter Byte em KB, MB, GB, TB, EB
  2. Verificar CPF com PHP
  3. Captcha em PHP
  4. Jogo da velha ou Tic tac toe
  5. Copiando tabelas e removendo registros duplicados no MySQL
  6. createElement - Solução compatível com os navegadores
  7. removeChild - Remover elementos HTML por Javascript
  8. Gerando Thumbnails com PHP
  9. Removendo linhas e espaços em branco de strings
  10. Apache Expires Header - Cache de imagens, Javascript e CSS
  1. Converter Byte em KB, MB, GB, TB, EB
  2. Captcha em PHP
  3. Jogo da velha ou Tic tac toe
  4. createElement - Solução compatível com os navegadores
  5. Copiando tabelas e removendo registros duplicados no MySQL
  6. Apache Expires Header - Cache de imagens, Javascript e CSS
  7. Removendo linhas e espaços em branco de strings
  8. removeChild - Remover elementos HTML por Javascript
  9. Verificar se existe um valor no Array em Javascript
  10. Gerando Thumbnails com PHP
e-mail Enviar por e-mail imprimir Imprimir
PHP

Persistência da autenticação com cookie e sessão

Por Alejandro Fernandez Moraga

Foto por <a rel="nofollow" href="http://www.flickr.com/photos/greg_scales/67283467/">Hazel Motes</a> 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.

Comentários
  • Ariel 31 de Janeiro de 2009 11:12

    ótimo artigo! ótimo site!


Comentar
captcha