Propagação de Sessões e Autenticação de Usuários no MySQL
Tenho certeza de que muitos de vocês que estão lendo este artigo já tiveram alguma vez alguma dúvida de como fazer uma propagação eficiente de sessão sem se preocupar em perder o ID da mesma. Pois bem, neste artigo, pretendo demonstrar o método que uso para fazer tal propagação e ainda com a possibilidade de uma autenticação.
Dessa maneira, é possível fazer um sistema de cadastro e login para ter controle dos usuários que tem acesso a certas áreas do site. Este sistema de cadastro não será abordado neste artigo, mas sim a parte de login.
Trabalhando com sessões e autenticação, é possível disponibilizar um material completo para nossos usuários e sem a necessidade de uma nova autenticação no meio do caminho. Basta o usuário logar-se uma vez e, por um tempo determinado ou até que o mesmo faça o logout, a autenticação estaria válida.
Utilizaremos para isto uma única tabela no banco de dados. Vamos chamar ela de 'online' (ou qualquer outro nome que você queira). Segue abaixo um dump:
Sempre que vou construir tabelas em meu banco de dados, procuro extrapolar um pouco no tamanho dos campos. Isto porque nunca sei exatamente das minhas necessidades futuras e, se por algum motivo, elas aumentarem, não terei muitos problemas em me adaptar.
Meu banco de dados de cadastro utiliza o mesmo princípio do descrito acima. O primeiro campo sempre possui o nome 'ID', formato BIGINT e com auto increment. Isto porque, além de ter um indexador para a tabela, faz com que tenha uma referencia na hora de fazer alguma busca. Em vez de um código, procuro pelo próprio ID. O campo 'cliente_id' da tabela acima vai receber o ID da tabela clientes, quando alguém fazer o logon válido. Assim, saberei de qual cliente a sessão faz parte.
Dessa maneira, é possível fazer um sistema de cadastro e login para ter controle dos usuários que tem acesso a certas áreas do site. Este sistema de cadastro não será abordado neste artigo, mas sim a parte de login.
Trabalhando com sessões e autenticação, é possível disponibilizar um material completo para nossos usuários e sem a necessidade de uma nova autenticação no meio do caminho. Basta o usuário logar-se uma vez e, por um tempo determinado ou até que o mesmo faça o logout, a autenticação estaria válida.
Utilizaremos para isto uma única tabela no banco de dados. Vamos chamar ela de 'online' (ou qualquer outro nome que você queira). Segue abaixo um dump:
CREATE TABLE online ( id bigint(20) NOT NULL auto_increment, sessao varchar(50) default NULL, cliente_id bigint(20) default NULL, unixtime bigint(20) default NULL, PRIMARY KEY (id) );
Sempre que vou construir tabelas em meu banco de dados, procuro extrapolar um pouco no tamanho dos campos. Isto porque nunca sei exatamente das minhas necessidades futuras e, se por algum motivo, elas aumentarem, não terei muitos problemas em me adaptar.
Meu banco de dados de cadastro utiliza o mesmo princípio do descrito acima. O primeiro campo sempre possui o nome 'ID', formato BIGINT e com auto increment. Isto porque, além de ter um indexador para a tabela, faz com que tenha uma referencia na hora de fazer alguma busca. Em vez de um código, procuro pelo próprio ID. O campo 'cliente_id' da tabela acima vai receber o ID da tabela clientes, quando alguém fazer o logon válido. Assim, saberei de qual cliente a sessão faz parte.
??
31/05/2005 10:56am
(~19 anos atrás)
gostei do script e estou utilizando ele atualmente, mas estou com um pequeno problema quando uso o firefox, estou com impressão as janelas do navegador compartilham váriaveis de sessão, pois quando efetuo o login em uma janela, outras janelas conseseguem acessar paginas privilegiadas, diferentemente do internet explorer, que nao perimite. Desta forma, tem como eu monitorar quando uma janela é fechada para destruir a sessão.
31/05/2005 10:44am
(~19 anos atrás)
Pessoal,
Como eu posso fazer pra propagar uma sessão por URL (cookies desabilitados) por formulário???
por exemplo: pra propagar a sessão qd a pessoa está sendo direcionada pelas páginas por link ou redirecionamento eu faço assim:
...
?>
<a href=xxx.php?<?php SID?>></a>
<?php
....
O ID da sessão passa e eu tenho acesso normal à sessão.
Até aí td bem...
mas como eu faço pra propagar o SID através de um formulário??
Isso funcionaria:
...
?>
<form method=get action=exemplo.php?<?php SID?>>
<?php
...
E se funciona, eu tenho que usar method get?
Outra coisa: Usando BD postgres, os scripts desse artigo também funcionam? fazendo-se, claro, as devidas modificações qt a forma de acessar o BD e manipula-lo (mudando mysql_num_rows para pg_num_rows, p.e.). Isto é, a idéia é a mesma, né?
Como eu posso fazer pra propagar uma sessão por URL (cookies desabilitados) por formulário???
por exemplo: pra propagar a sessão qd a pessoa está sendo direcionada pelas páginas por link ou redirecionamento eu faço assim:
...
?>
<a href=xxx.php?<?php SID?>></a>
<?php
....
O ID da sessão passa e eu tenho acesso normal à sessão.
Até aí td bem...
mas como eu faço pra propagar o SID através de um formulário??
Isso funcionaria:
...
?>
<form method=get action=exemplo.php?<?php SID?>>
<?php
...
E se funciona, eu tenho que usar method get?
Outra coisa: Usando BD postgres, os scripts desse artigo também funcionam? fazendo-se, claro, as devidas modificações qt a forma de acessar o BD e manipula-lo (mudando mysql_num_rows para pg_num_rows, p.e.). Isto é, a idéia é a mesma, né?
29/01/2005 4:06pm
(~20 anos atrás)
Poder vc até pode. Mas ai tem 2 coisas. Os cookies ficam armazenados no servidor por um periodo pequeno de tempo (configurado) e no computador do cliente. O do computador não iria te servir pra nada, a nao ser para conseguir a ID da sessão. Com o id da sessão, vc poderia conseguir abrir a sessão do outro, mas somente entrando praticamente juntos (depende do tempo da sessão). É complicado fazer isso, e, se não me engano, o php já possui proteções para esse tipo de coisa. Ai é só testando mesmo!
[]s
Vinicius
[]s
Vinicius
07/09/2004 11:06pm
(~20 anos atrás)
Caro Vinicius
Eu não posso simplesmente copiar o teu cookie enquanto vc está logado e entrar no sistema com o teu usuário?
Eu não posso simplesmente copiar o teu cookie enquanto vc está logado e entrar no sistema com o teu usuário?
07/09/2004 10:54pm
(~20 anos atrás)
Para vc tirar os cookies de sua sessão, vc deve mecher em seu php.ini ou então setar o valor com o comando ini_set (se o servidor permitir).
O que vc deve setar é a variavel session.use_cookies como 0 (zero). Assim ele não mais utilizará cookies em suas transções de sessão.
O problema disso tudo, eu acho e me corrijam se eu estiver errado, é que você não poderá mais setar variaveis como $_SESSION[var] pq não terá aonde salvar esses valores. Ai, só passando os dados pelo metodo get.
O php acima de 4.2 já vem com o --enable-trans-sid. Isso significa que, se vc não tiver utilizando os cookies, ele já faz essa transação. Caso contrário, é vc passar o valor como:
<a href="pagina.php?<?= strip_tags(SID); ?>">Link</a>
Espero ter ajudado.
[]s
Vinicius
O que vc deve setar é a variavel session.use_cookies como 0 (zero). Assim ele não mais utilizará cookies em suas transções de sessão.
O problema disso tudo, eu acho e me corrijam se eu estiver errado, é que você não poderá mais setar variaveis como $_SESSION[var] pq não terá aonde salvar esses valores. Ai, só passando os dados pelo metodo get.
O php acima de 4.2 já vem com o --enable-trans-sid. Isso significa que, se vc não tiver utilizando os cookies, ele já faz essa transação. Caso contrário, é vc passar o valor como:
<a href="pagina.php?<?= strip_tags(SID); ?>">Link</a>
Espero ter ajudado.
[]s
Vinicius
05/09/2004 11:18am
(~20 anos atrás)
Utilizei session_start(); para criar sessões em um sistema seguro. Mesmo enviando por post o id da sessão o PHP sempre cria dois cookie PHPSESSID um com o id da sessao e outro com o endereco onde está sendo executado o script.Como faço para inibir esta criação de cookie e ao mesmo tempo propagar a seção? É possível?
04/09/2004 12:43pm
(~20 anos atrás)
O seu sistema esta otimo, adorei, eu meu site eu fiz um eu mesmo muito parecido, com tempo de login e tudo, e quanto ao id ser seguro ou não, é correto, mesmo que reinicie o server, vc nunca tera um id igual, é como uma chave unica do server, atualmente é a unica coisa em que confio pra um login
21/10/2003 6:51pm
(~21 anos atrás)
Olá Ricardo,
Obrigado pelo elogio. Quanto a sua dúvida acredito que não teremos este tipo de problema uma vez que até onde eu conheco, o session id tem, como um dos parametros para sua formação, o unixtime do sistema (que é unico!). Se estiver errado por favor me corrija.
Obrigado pelo elogio. Quanto a sua dúvida acredito que não teremos este tipo de problema uma vez que até onde eu conheco, o session id tem, como um dos parametros para sua formação, o unixtime do sistema (que é unico!). Se estiver errado por favor me corrija.
11/10/2003 9:10pm
(~21 anos atrás)
Gostaria de elogiar o artigo, realmente está muito bom. Mas tenha uma dúvida:
Não é perigoso utilizar o session id? Se o servidor for reiniciado, o id pode não ser único. Causa problemas de segurança e consistência.
Não é perigoso utilizar o session id? Se o servidor for reiniciado, o id pode não ser único. Causa problemas de segurança e consistência.
10/10/2003 6:47pm
(~21 anos atrás)