#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:
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:
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
Pingback on Nov 19th, 2006 às 16:33
[…] 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. […]
Segunda-feira, Outubro 30, 2006 at 14:38
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
Segunda-feira, Outubro 30, 2006 at 16:14
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.
Segunda-feira, Outubro 30, 2006 at 16:22
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!
Segunda-feira, Outubro 30, 2006 at 16:30
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!
Segunda-feira, Outubro 30, 2006 at 16:32
Nada muito legal. Apenas um hotsite.
Segunda-feira, Outubro 30, 2006 at 16:39
Ah!
Certo, certo!
Projetos milionários não se revelam por ai…
Abraço!
Quarta-feira, Novembro 1, 2006 at 14:30
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.
Quarta-feira, Novembro 1, 2006 at 17:35
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.
Quarta-feira, Novembro 1, 2006 at 17:38
Nos próximos artigos irei tratar sobre segurança no uso de sessões.
Quinta-feira, Novembro 16, 2006 at 17:35
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
Segunda-feira, Maio 4, 2009 at 1:56
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 😀
Quarta-feira, Dezembro 6, 2006 at 12:15
Gostei muito do artigo..
graduation !!!
Domingo, Novembro 4, 2007 at 18:35
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
Segunda-feira, Setembro 29, 2008 at 2:21
parabens… ótimo tutorial, simples e prático
Terça-feira, Junho 23, 2009 at 13:52
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.
Sexta-feira, Setembro 11, 2009 at 10:16
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
Quarta-feira, Dezembro 28, 2011 at 15:56
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?
Quarta-feira, Dezembro 28, 2011 at 15:59
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?
Quarta-feira, Dezembro 28, 2011 at 16:00
Onde esta “Sair” em azula é um codigo que chama o link de login.
Desde já obrigada
Terça-feira, Junho 5, 2012 at 14:00
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.