+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 os dados já cadastrados em nossa tabela, está na hora de fazer a consulta para verificar se a sessão de nosso usuário já passou pelo login ou não.

Este script deve ser utilizado no começo de cada script, logo após a parte da sessão. Assim, sempre poderemos consultar se o usuário está logado ou não.

<?php
// ...
// ...
$tempo_valido = 5; // numero de minutos que a sessão
                   // ficara válida sem que o usuário
                   // continue navegando pelo site

$unixtime_valido = strtotime('NOW') - ($tempo_valido * 60);

$sql = "DELETE FROM online WHERE unixtime < '$unixtime_valido';";
$query = mysql_query($sql);

$sql = "SELECT * FROM online WHERE sessao='$_ID' AND unixtime > '$unixtime_valido';"
$query = mysql_query($sql);

if (mysql_num_rows($query) > 0) {
   $row = mysql_fetch_array($query);
   $online['logado'] = "sim";
   $online['cliente_id'] = $row['cliente_id'];
   $unixtime = strtotime('NOW');
   $sql = "UPDATE online SET unixtime='$unixtime' WHERE sessao='$_ID';";
   $query = mysql_query($sql);
} else {
   $online['logado'] = "nao";
}

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

No script acima apago da tabela todos os registros que estejam com o unixtime abaixo do tempo valido. Assim não sobra lixo na tabela. Verifico então se a sessão está registrada com algum usuário e, se tiver, faço o update do unixtime para ter mais tempo antes do registro se auto-remover. Defino também 2 variáveis - a $online['logado'] com valor 'sim' que deve ser consultada sempre que for necessário verificar se aquela sessão já foi validada e também a variável $online['cliente_id'] que serve para saber qual é o cliente que está logado.

Desta maneira é possivel ter sua sessão propagada e ainda com autenticação. Assim você poderá ter páginas mais dinâmicas e desenvolver portais, se quiser.

Para fazer o logout quando o cliente clicar no botao 'Logout' faça a seguinte rotina:

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

$sql = "DELETE FROM online WHERE sessao = '$_ID';";
$query = mysql_query($sql);

session_destroy();

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

Assim, quando o botão logout for pressionado, os dados da tabela online serão removidos, e a variável $online['logado'] tera o valor 'não'. O script saberá que aquela sessão não está mais logada.

É isso! Espero ter ajudado. Não sei se fui claro em minhas explicações, mas se necessário for, estou aqui para ajudar!

Um abraço,
Vinicius

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.)