• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Clicksharing

[PHP] Cookies de sessão

10 mensagens neste tópico

Devido à curiosidade de alguns relativamente à forma como estão organizadas as sessões no meu site decidi colocar aqui excertos de um tutorial que utilizei para aprender o básico acerca de cookies de sessão:

<?php
//Check if cookie is set
if (!isset($_COOKIE['cookie_info'])) 
{ 
  echo $_COOKIE['cookie_info'];
?>

   <body>
   <form method="POST" action="login.php">
   <br><br><br><br><br><br><br>
   <center><h1>Cookies </h1>
     <Center>
       <table border="0" width="auto">
       <tr>
         <td width="33%">Login Name</td>
         <td width="33%"><input type="text" name="name" size="20"></td>
         <td width="34%"> </td>
       </tr>
       <tr>
         <td width="33%">Password</td>
         <td width="33%"><input type="password" name="pass" size="20"></td>
         <td width="34%"><input type="checkbox" name="set" value="ON">Remember Me</td>
       </tr>
     </table>
   <center>
   <p><input type="submit" value="Submit" name="sub">
   <input type="reset" value="Reset" name="res"></p>
   </center>
   </body>
   </form>
<?php
}
else
{
  //Cookie is set and display the data
  $cookie_info = explode("-", $_COOKIE['cookie_info']);  //Extract the Data
  $name = $cookie_info[0];
  $pass = $cookie_info[1];
  echo "<center><h3>Welcome back $name and your password is $pass"; 
  echo "<a href='logout.php'>Logout</a>";
  exit;
}
?>

Este script vai verificar se o utilizador tem presente no seu computador um cookie com os seus dados de login, utilizando a função

if (!isset($_COOKIE['cookie_info']))

$_COOKIE é a variável global, que funciona como um vector/array. 'cookie_info' é a identificação dos dados que ficaram registados no array, tal como array[1], neste caso temos array['cookie_info'].

Se não estiver registado no cookie, ele apresenta um formulário de login. Se estiver, ele apresenta o conteúdo do cookie.

<?php
if(empty($_POST['name']) || empty($_POST['pass']))
{
?>
   <b>Fill All Details </b>
<?php
   exit;
}
else
{
   //Colllect the details and validate
   $time = time();
   $name = $_POST['name'];
   $pass =md5($_POST['pass']);
   $check = $_POST['set'];
   $db = mysql_connect("localhost", "admin","admin") or die(mysql_error());
   mysql_select_db("test",$db) or die(mysql_error());
   $query = "select * from Login where name='$name' and password='$pass'"; 
   $sql = mysql_query($query) or die(mysql_error());
   $count = mysql_num_rows($sql);

   if ($count == 1)
   {
       $cookie_data = $name.'-'.$pass; 
       if($check=='ON')
       {
           if(setcookie ("cookie_info",$cookie_data, $time+3600)==TRUE)
           {
               echo "Cookie SET".$cookie_data;
?>
               <a href='logout.php'>Logout</a>     
<?php
           }
       }
   }
   else
   {
       echo "Authentication Failed";
       exit;
   }
}
?> 

Este script vai receber os dados do formulário referido anteriormente e vai criar um hash da password utilizando a função md5().

Depois vai verificar na base de dados se o utilizador existe. Se existir utiliza a função setcookie(), que serve para registar um valor no array $_COOKIE[] com o conteúdo ("cookie_info",$cookie_data, $time+3600).

O cookie_info, como viram anteriormente, é a identificação do elemento do array, $cookie_data é a informação que vai ficar associada a cookie_info, $time+3600 significa que o cookie vai expirar dentro da hora actual + 3600 segundos, isto é, o cookie vai durar uma hora.

<?php
$time = time();

if (isset($_COOKIE['cookie_info']))
{
 setcookie ("cookie_info", "", $time - 3600);
 echo "Logged Out";
}

echo $time;
?> 

Este é o mais simples de todos agora que perceberam os anteriores!

Ele, tal como o primeiro script, vai verificar se o cookie está definido, e se estiver, ele vai colocar o prazo de validade do cookie para terminar a uma hora antes da hora actual, e limpa a informação do utilizador (reparem nos "" na função setcookie()).

Desta forma o cookie já é considerado como expirado e o utilizador faz logout, ao mesmo tempo que a sua informação foi eliminada, tornado assim o logout uma forma segura de evitar quase todas as tentativas de hacking.

Site de origem: http://www.phpfreaks.com/tutorials/120/2.php

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah! não referi numa desvantagem que isto tem com o internet explorer.

Normalmente o IE não aceita estes cookies (seguranças estupidas da MicroSoft), e então têm de seguir estes passos:

http://helpcenter.suntrust.com/knowbase/root/public/snbb14192.htm

Resolver este problema dava-me geito, pois também o tenho no site.

Com o firefox já não ha este problema!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boa introdução!

Só tenho dois reparos a fazer, a função md5() não encripta, devolve uma hash. O algoritmo md5 é um algoritmo de hash e não de encriptação. A encriptação implica que é possível obter de novo o valor inicial e o md5 não permite isso.

Quanto ao cookie, não deveriam ser guardados os dados pessoais do utilizador no cookie. Deveria ser guardada um identificador da sessão do utilizador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boa introdução!

Só tenho dois reparos a fazer, a função md5() não encripta, devolve uma hash. O algoritmo md5 é um algoritmo de hash e não de encriptação. A encriptação implica que é possível obter de novo o valor inicial e o md5 não permite isso.

Quanto ao cookie, não deveriam ser guardados os dados pessoais do utilizador no cookie. Deveria ser guardada um identificador da sessão do utilizador.

eu por caso no meu tenho bin2hex(md5()) lol.

O identificador de sessão iría fazer alguma diferença em que sentido?

Também cheguei a pensar nisso mas depois pensei, que se não for a password a permitir a entrada se for esse identificador de sessão, vai dar ao mesmo, pk ambos podem ser hackeados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A diferença é que o identificador de sessão será único para cada visita e terá um tempo de vida limitado, se o cookie for roubado, então o ladrão acaba por ficar com um identificador que, ou tem pouco tempo de vida ou já expirou, de qualquer forma o ladrão não fica a conhecer a hash da passe e não sabe o nome de utilizador.

Pode ser apenas um pormenor e oferecer uma defesa limitada, mas é mais uma defesa a acrescentar ao leque. Podemos sempre vencer pelo cansaço :thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como integrarias isso no codigo?

Define a logica, não tou a ver como é k faria isso com este script.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um identificador é uma string única, normalmente baseada no tempo do sistema, que é colocada no servidor e também enviada ao utilizador.

Sempre que o servidor detecte que um identificador de sessão expirou elimina-o. Desta forma quando um utilizador tenta aceder a algum recurso no sistema envia o identificador que o servidor lhe indicou antes, o servidor verifica se o identificador existe e, caso esteja tudo correcto, aceita o pedido do utilizador.

No teu código bastaria criares o identificador quando um utilizador se liga. Guardas esse identificador na base de dados e no cookie que envias para o sistema. Sempre que necessário verificas esse identificador pedindo-o ao cookie.

Neste caso, e vendo que os scripts apenas se referem à autenticação, bastaria escreveres o identificador em vez de escreveres a palavra passe e o nome de utilizador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah! não referi numa desvantagem que isto tem com o internet explorer.

Normalmente o IE não aceita estes cookies (seguranças estupidas da MicroSoft), e então têm de seguir estes passos:

http://helpcenter.suntrust.com/knowbase/root/public/snbb14192.htm

Resolver este problema dava-me geito, pois também o tenho no site.

Com o firefox já não ha este problema!

Isso tem a ver com as definições, não com o navegador em si.

Se definires para aceitar cookies, então o cookie é aceite.

Eu não uso nem IE nem FF, uso Opera, mas em qualquer um dos 3 isso dos cookies dá para gerir, ou seja, se tiveres o FF preparado para não aceitar os cookies, ele tambem não os aceita.

Pessoalmente, não gosto de utilizar cookies, faço tudo com SESSION, so utilizo cookies em casos muito específicos, casos em que não há mesmo outra alternativa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora