+3

Propagação de Sessões e Autenticação de Usuários no MySQL

criado por Vinicius G Mommensohn em 11/09/2003 8:26pm
Com seu banco de dados criado, chegou a hora de fazer o login. Não descreverei neste artigo como verificar se o login ou senha digitado está correto ou não. Considerarei os dados já válidos.

É importante que, ao começar qualquer script trabalhando-se com sessões, deve-se ter as funções para se "pegar" o id da sessão:

<?php
session_start();
$_ID = session_id();

// ...
// ...
?>

Da maneira acima, sempre que precisar do ID da sessão, você terá pela variável $_ID.

Vamos supor que a variável que recebe o login seja 'login'. Uma vez submetido os dados, procuraremos na tabela de clientes o ID referente ao login em questão.

<?php
// ...
// ...

$sql = "SELECT * FROM clientes WHERE login='$_POST[login]';";
$query = mysql_query($sql);
$row = mysql_fetch_array($query);

$cliente_id = row[id];

// ...
// ...
?>

No script acima, conseguimos o ID da tabela 'clientes' referente ao login feito. Vamos agora inserir os dados que temos na nossa tabela online:

<?php
// ...
// ...

$unixtime = strtotime('NOW');
$sql = "INSERT INTO online (cliente_id, sessao, unixtime) VALUES ('$cliente_id', '$_ID', '$unixtime');";
$query = mysql_query($sql);

// ...
// ...
?>

Isto deve ser colocado no seu script de autenticação, para que logo após ter os dados verificados, já se faça a inserção dos mesmos na tabela 'online'.

Alguns de vocês podem estar se perguntando porque não utilizei o campo UNIXTIME do próprio mysql para guardar o valor da variável $unixtime. Eu faço isto pelo costume, mas independente da maneira, o importante é ter o unixtime em sua tabela. Será com este dado que faremos o "logout forçado" de quem não apertar para fazer o logout. Explicarei melhor isto na próxima página.

Comentários:

Mostrando 1 - 10 de 38 comentários
??
31/05/2005 10:56am (~15 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 (~15 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é?
29/01/2005 4:06pm (~15 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
07/09/2004 11:06pm (~16 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?
07/09/2004 10:54pm (~16 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
05/09/2004 11:18am (~16 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 (~16 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 (~17 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.
11/10/2003 9:10pm (~17 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.
10/10/2003 6:47pm (~17 anos atrás)

Novo Comentário:

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