#1 – Controle De Sessão E PHP. Indispensável Saber

Se você quiser saber se uma pagina está sendo requisitada pelo mesmo usuário que antes e ainda quer que as variáveis criadas anteriormente ainda permaneçam como definidas, você provavelmente deverá usar controle de sessão.

Nesta primeira parte, apenas uma introdução.

Recentemente, lendo em livros e posteriormente na Internet, pude saber mais sobre o protocolo HTTP, de como é a comunicação cliente/servidor. Uma das coisas que podemos aprender e que pode ser importante saber quando estamos desenvolvendo um sistema seguro a fraudes de usuários, é entender que: “No protocolo HTTP nenhuma informação de estado é passada”. Ou seja, não podemos contar com o protocolo HTTP se quisermos verificar se o usuário que fez a requisição anterior é o mesmo que fez a seguinte, isso é a privacidade do usuário sendo tratada aqui e portando, temos que nos virar para encontrar uma solução.

Quando declaramos o inicio de uma sessão e com ela suas variáveis, o PHP armazena em um arquivo comum de dados, no servidor, uma cópia destas informações. Essas informações são encontradas por meio de uma ID única de sessão, gerada pelo próprio HTTP para o usuário e está ID é armazenada no lado do cliente por duas maneiras. Ou pelo uso de cookies, ou pelo envio na URL.

Quando usamos sessões, a única variável que é armazenada no lado do cliente, como dito acima, é a ID de sessão. Quando passada para o servidor, via URL ou cookie, este poderá encontrar as variáveis que antes foram definidas para este determinado usuário.

Algo importa para se dizer é que, hoje, comumente, até as versões mais antigas de browsers possuem recursos de cookies, e, portanto é interessante preservar a ID de sessão em um cookie do que sujar a URL da nossa pagina estamos tratando de SEO aqui.

Claro, mantendo o ID de sessão na URL, você terá maior garantia de que mais usuários terão acesso a paginas controladas por sessões, isso é uma questão de usabilidade. Pense que o usuário poderá estar com os cookies desabilitados. Existem formas de saber se o usuário possui os cookies habilitados em seu navegador e assim pedir gentilmente que os habilite caso não esteja.

Configurando Cookies com o PHP
Você pode configurar cookies utilizando a função setcookie().

Protótipo: Veja o manual.


bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, bool secure [, bool httponly]]]]]] )

Assim sendo, você poderá declarar um cookie da seguinte forma:

code-1.png

A forma acima é a mais simples de definição.

Você poderá definir uma data para que essa variável expire, ou seja, deixe de existir:

code-2.png

Repare que devemos utilizar um numero inteiro para o valor da data no “formato UNIX de ser”. Uma maneira fácil para isso é:

use a função time() para pegar a data atual e adicione o tempo que você quer em segundos. No caso acima, 3600 segundos, que é igual a 1 hora. 😉

Assim, já declarado nosso cookie. Quando o usuário visitar a próxima pagina de seu site (ou recarregar a pagina atual), você terá acesso ao cookie por meio da super global $_COOKIE[‘meu_cookie’].

Mas bem, porque estou falando disso? Quando estamos trabalhando com Sessões, elas fazem tudo isso para nós! 😆

Abraço a todos.


  1. Algumas empresas de grande porte (Yahoo!, por exemplo) não permitem o uso de sessões em seus projetos, devido a dificuldade de escalabilidade que ela tem. Mesma coisa com o Flickr[1]. Mas como nem todos trabalham com projetos desse porte, tá valendo!

    [1] http://www.niallkennedy.com/blog/uploads/flickr_php.pdf

  2. Olá Nando.

    As sessões não descartam totalmente o uso de cookies, a não ser que você transporte a ID de sessão na URL.

    Quando usamos sessões, será guardado em um arquivo no servidor as variáveis criadas nesta. Para acessá-la precisamos da ID.

    Os cookies são usados apenas para guardar a ID de sessão.

    No caso de serviços prestados como o Google e Yahoo! Acredito que eles utilizam as “Session DBs” mesmo, ou seja, não usam arquivos e sim banco de dados.

    Usar banco de dados é mais complicado porque não é um método nativo do php, temos que implementar as funções ou usar de terceiros.

    Se não me engano o principal motivo para não armazenar dados de clientes em cookies é a possibilidade de serem explorados por outros sites.

    Claro, eu posso estar tremendamente errado. 😉

    Pesso desculpas e o espaço está livre a discussões.

  3. Então. No Yahoo! não usam sessão de modo algum. Estou em um projeto que vai ser hospedado lá e é desabilitado seu uso, inclusive, nas guidelides do projeto.

    Acho que a melhor maneira para se salvar sessão usando cookie, é gerar um hash relativo ao ID. Algo como md5(‘–id–salt_hash–‘) e trabalhar sempre com ele. Você não precisa dar um nome como “ID” para seu cookie, mas nomes que não fazem referência à informação. Algo como “xvqws”. Você saberia dizer do que se trata?

    Quanto ao explorar o cookie, isso também é possível de ser feito com sessões, já que ele salva um cookie com o identificador! 😉

    Abraço!

  4. Ah, sim.

    Entendi o seu ponto.

    Algo como criar a propria solução para o controle de sessão.
    Entendi.

    Mas então, que projeto é esse? (Curiosidade!) 🙂

    Obrigado!

  5. Nada muito legal. Apenas um hotsite.

  6. Ah!
    Certo, certo!

    Projetos milionários não se revelam por ai…

    Abraço!

  7. Marcio

    Olá, gostei do artigo, porém ficou uma dúvida. Quer dizer que eu posso me apossar da sessão de outra pessoa? mesmo quando a programação utiliza $_SESSION e não $_COOKIE?

    Pois estou desenvolvendo um sistema pruma grande empresa e me perguntaram qual controle de sessão eu utilizava e eu não soube responder.

    Desde já obrigado.

  8. Olá Marcio.

    É mais ou menos assim.

    Quando declaramos uma variável em $_SESSION, podemos acessala se tivermos a ID da sessão.

    Por padrão, quando declaramos uma sessão o PHP guarda a ID nos cookies do navegador. Portanto, mesmo usando $_SESSION, utilizamos $_COOKIE, porem, não precisamos nos preocupar com os cookies, pois essa é uma tarefa do PHP.
    Uma alternativa é enviar pela URL a ID, sem usar sessão.

    É possível criar uma pagina em PHP que captura todos os cookies do navegador. E uma vez capturados podem ser utilizados para algum outro fim. Infelizmente não poderia lhe ajudar nessa parte.

    Podemos usar $_COOKIE para armazenar pequenas informações do usuário no navegador, porem, isto não poderia ser chamado de uma sessão. Por exemplo, poderíamos guardar a data da ultima visita do usuário e exibir na tela:
    “Olá! Sua ultima visita neste site foi em (00/00/0000)”
    Porem, se a pessoa excluir os cookies, isso não funcionará.

    Espero ter ajudado em alguma de suas duvidas, caso contrario pode fazer mais perguntas.

    Abraço.

  9. Nos próximos artigos irei tratar sobre segurança no uso de sessões.

  10. Olá,

    Andei lendo esse seu artigo sobre o controle de sessões do PHP, achei muito bom, e eu preciso com urgência resolver um problema aqui na empresa relacionado a isso, será que você poderia me ajudar ? Bom o problema é o seguinte: Estou criando um sistema de administração de tarefas entre os funcionários.
    Assim que index.php do sistema é requisitado ele verifica se existe uma variável $_SESSION definida (isset($_SESSION[”])), caso não esteje exibe uma tela de login. Ao efetuar o login e o sistema verificar no banco a senha e conferir com a que o usuário digitou. O usuário autorizado ao entrar no sistema, o script cria uma variável $_SESSION[”](A mesma requisitada no início), então toda página do sistema que o usuário navega, faz essa requisição desta variável $_SESSION, bom até tudo funciona as mil maravilhas. Porém o problema que sem mais nem menos, as vezes em pouco tempo ou mais tempo, a variável some, é como se tivesse perdido a sessão, como se ela tivesse expirado…. essa variável simplesmente some….

    Bom se você puder me ajudar, eu agradeceria muito….

    Obrigado mais uma vez,
    Marcio Pinheiro

    • Filipe

      Verifique o tempo de sessão do servidor, pode acontecer do apache dar uma louca.

      httpd.conf – timeout 300

      (padrão em segundos, pode multiplicar para o tempo que quiser)

      Acontece em alguns servidores compartilhados, mas é raro acontecer em servidores dedicados, todavia, basta verificar isso e usar $_Session de maneira feliz 😀

  11. Gostei muito do artigo..
    graduation !!!

  12. Split

    Estou desenvolvendo um sistema de usuários com a utilização de cookie.
    Quero fazer uma area da pagina que quando o usuario da pagina está logado, apareça o $login_user dele seguido de um link de logout… porém estou recebendo um parse error, está mais/menos no html:

    <?php echo “$id_user Logout“;
    ?>

    Parabéns ao pessoal, tópico sobre cookies muito bom =)
    Abraços

  13. parabens… ótimo tutorial, simples e prático

  14. Mesmo em projetos grandes é possível utilizar sessão com sucesso. Só é preciso tomar alguns cuidados de segurança para evitar que um usuário roube o ID do outro.

  15. Wensbley

    Para: –> Nando Vieira

    Como o yahoo ou outra empresa grande não utiliza sessões (como mencionado por Nando), provavelmente usam cookies¿. E se o cookies dos usuários estiverem desabilitados ficarão impossibilitados de usarem o sistema do yahoo?

    Vamos pensar galera, que outra alternativa teríamos para manter os dados do usuário, id ou o que seja, sem usar estes recursos cookies/sessões?

    Valeu, vou aguardar posts. Obrigado

  16. Gra

    Oi alguém pode me ajudar eu não estou conseguindo destruir minha sessão.
    Tenho uma função SAIR
    private function sair() {

    //se sair destruir a sessao
    // Unset all of the session variables.
    $_SESSION = array();
    // If it’s desired to kill the session, also delete the session cookie.
    // Note: This will destroy the session, and not just the session data!
    if (isset($_COOKIE[session_name()])) {
    //setcookie(session_name(), ”, time()-42000, ‘/’);
    unset($_COOKIE[session_name()]);
    }
    // Finally, destroy the session.
    session_unset();

    session_destroy();

    parent::printMensagemSucesso(“Saída do sistema realizada com sucesso.”);
    }

    na mesma classe na parte do código eu chamo ela tipo:
    if ($_GET[‘acao’] == “sair”) {

    // Desautentica o usuário, destruindo a sessão e redirecionando o usuário
    // para a página de login

    $this->sair();

    }
    Em outra classe tenho um link SAIR quando eu aperto esse link ele passa pela função SAIR e chama o link de login tipo: echo “Sair“;. Mas se eu digitar na URL a próxima página seguinte do login ele aceita sem digitar a senha, como eu faço?

  17. Gra

    Oi alguém pode me ajudar eu não estou conseguindo destruir minha sessão.
    Tenho uma função SAIR
    private function sair() {

    //se sair destruir a sessao
    // Unset all of the session variables.
    $_SESSION = array();
    // If it’s desired to kill the session, also delete the session cookie.
    // Note: This will destroy the session, and not just the session data!
    if (isset($_COOKIE[session_name()])) {
    //setcookie(session_name(), ”, time()-42000, ‘/’);
    unset($_COOKIE[session_name()]);
    }
    // Finally, destroy the session.
    session_unset();

    session_destroy();

    parent::printMensagemSucesso(“Saída do sistema realizada com sucesso.”);
    }

    na mesma classe na parte do código eu chamo ela tipo:
    if ($_GET[‘acao’] == “sair”) {

    // Desautentica o usuário, destruindo a sessão e redirecionando o usuário
    // para a página de login

    $this->sair();

    }
    Em outra classe tenho um link SAIR quando eu aperto esse link ele passa pela função SAIR e chama o link de login tipo: echo “Sair“;. Mas se eu digitar na URL a próxima página seguinte do login ele aceita sem digitar a senha, como eu faço?

  18. Gra

    Onde esta “Sair” em azula é um codigo que chama o link de login.

    Desde já obrigada

  19. Daniel

    Uma pergunta e se eu precisar permitir multi-sessão no mesmo navegador, mais de um usuário conectado, hoje quando tento conectar 2 usuários a sessão do ultimo usuário prevalece e os dados visualizados em ambos são os dados do segundo usuário? Por favor me deem uma dica se isto é possível, por mim espero que digam que não porque esse deveria ser pré-requisito do sistema não uma idéia maluca no fim do projeto.

  1. 1 Links comentados via del.icio.us - 7 » Japs

    […] A quarta parte de hoje são alguns links sobre desenvolvimento: Controle de sessão e PHP, Modelo de orientação a objetos em PHP 5, Minikit: visual effect bag, Sugar Arrays: Porting over JavaScript 1.6 Array methods, Remote Scripting Transport Patent, Amberjack: JavaScript Site Tour Creator, 3D Rendering in JavaScript e 10 things you (probably) didn’t know about PHP. […]




Deixe uma resposta para Nando Vieira Cancelar resposta