+1

Passando, com segurança, a ID de um sessão no modo transparente

criado por Daniel Braga em 11/03/2004 11:20am
No PHP há duas maneiras de propagar a ID de uma sessão entre as páginas de uma aplicação Web: por cookies e por parâmetro na URL. A primeira é mais simples, mas quando o navegador não suportar cookies torna-se ineficiente. Nestas condições a única opção disponível é usar parâmetros na URL.

As variáveis de sessão são armazenadas no servidor em arquivos do tipo texto. Quando uma sessão é iniciada (usando session_start(), por exemplo) automaticamente é criado um arquivo para receber os nomes e os valores das variáveis da sessão. No entanto, quando o internauta fecha o navegador o arquivo não é excluído. Para o arquivo ser excluído é necessário chamar a função session_destroy().

Veja esta situação:

O usuário José da Silva está registrado no seu site. Ele pode acessar áreas restritas e executar tarefas exclusivas de usuários registrados. Entretanto, por um motivo qualquer, você bloqueia este usuário.

Mas José da Silva é daqueles internautas que a cada página visitada, guarda o endereço no bookmark do navegador. No bookmark ele tem o endereço de uma página da área restrita; este endereço está com uma ID de sessão como parâmetro; no servidor, a sessão não foi destruída com session_destroy(). Se o José da Silva acessar a página usando o endereço do bookmark, dependendo de como a aplicação trabalha com as permissões de usuários, ele terá condições de executar tarefas exclusivas de usuários registrados.


A situação acima caracteriza o fator insegurança quando passamos a ID da sessão como um parâmetro na URL.

Comentários:

Mostrando 1 - 10 de 28 comentários
Vocês acham que é possível apagar o id da sessão mesmo depois de um session_destroy()?
29/07/2005 10:48am (~11 anos atrás)

Fiquei satisfeito com a solução apresentada no artigo, supriu minhas necessidades.

valeu
11/05/2004 12:15pm (~12 anos atrás)

Daniel Braga disse:
Se você der unset ou destroy será quase a mesma coisa, mas com destroy vc terá que chamar session_start() novamente, sendo que nas duas situações a sessão continuará com a mesma ID e a sessão estará vazia

O propósito do código é exatamente este: se a sessão expirou, a aplicação deverá ter novos valores nas variáveis e que sejam válidos e seguros.
30/04/2004 7:43am (~12 anos atrás)

OK Daniel,

Eu entendi, vamos supoter que o cara está navegando na minha sessão, fechou o browser, sendo assim não ativou o session_destroy, e o arquivo ficou no servidor.

Vamos supor que outro dia ele volter e use o session ID que estava na URL, ae o SEU código vai ver que o TIME expirou, ae nesse ponto, vc limpa as variaveis com o session_unset, mas ai todas as variaveis foram para o espaco e eu preciso delas pra continuar a aplicação, ou seja, vou ter que mandar o cara ir para o login, já não é melhor eu dar session_destroy???

Abraços,
Max
29/04/2004 10:16pm (~12 anos atrás)

Éder Baum disse:
Estou com um problema grave.
No meu site ao usuário cadastrar-se é enviado um email para confirmação de registro, até ai tudo bem. Porém descobri que se este email for do hotmail e o navegador for Explorer e ele clicar no link pelo servidor hotmail minha página vai abrir como um frame, e consequentemente o Explorer não vai aceitar cookies.

Tudo bem a solução seria passar o id da seção via URL, mas como meu sistema é enorme fica impossivel fcar caçando todos os links.

Existe algum meio de eu passar o ID da seção via URL por meio de uma função ou algo assim, e que isso se propague para todos os links???
21/03/2004 3:53pm (~12 anos atrás)

Não. O ponto que quis abordar não era bem esse... Visei a relação Cookie x Sessions, que pelos que testes que efetuei aqui, não apresentaram relações. Pelo que entendi do seu artigo, sem Cookies, Sessions não funcionam...

Desculpe-me se interpretei de maneira errônea seu artigo.
17/03/2004 11:23am (~12 anos atrás)

Daniel Braga disse:

E você estava passando a ID da sessão na query string?
17/03/2004 7:55am (~12 anos atrás)

Acessei as páginas administrativas que já tenho prontas. Excelente. Salvei a URL nos Favoritos e desabilitei os cookies. Reiniciei o navegador e tentei acessar... Acesso Negado, como já se esperava... Então... Fiz login e a session foi criada normalmente... =)

Testei no IE6 e Firefox... Ambos não apresentaram erros, nem efeitos inesperados...
16/03/2004 3:11pm (~12 anos atrás)

oi gente..to usando esse codigo q o daniel mandou ai pra gente..numa include...

na pagina q verifica o login...dou um echo na variavel de sessao q criei para o login e ele me mostra o login correto...

nessa mesma pagina..chamo uma funcao q ta em outra engina pra atualizar os dados do cara...e dou, dentro da funcao um outro echo na variavel de sessao do login e me mostra corretamente de nvo...

depois ainda na pagina que verifica o login...eu chamo a funcao url("home.php");
essa funcao nada mais é q um location.href em java script q eu fiz...

na pagina home.php eu dou um terceiro echo na variavel de sessao do loginname
ai ja aparece diferente...
meu login é girakrok..e aparece intranet...

alguem sabe pq isso acontece?
antes de cada echo eu to colocando a include com esse codigo da sessao...

[]´s
15/03/2004 8:38am (~12 anos atrás)

Jair Issa disse:
Bem eu nao uso Cookie.. somente Session

os unicos Dados eu que deveria armazenar em cookie seria o Idioma escolhido para o usuario, porem este estou armazenando na tabela de usuarios.

Os Sistemas que faço sao para empresas, nao um Forum.. e nao armazeno usuario e senha, para outra pessoa nao utilizar o nome de outro.

Mas normal.. é só verificar se esta ativo ou nao... e bola pra frente..


14/03/2004 5:37pm (~12 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)