Curso de PHP: Customizando as sessões ($_SESSION)


No post passado foi ensinado o básico sobre sessões. Mas cada aplicação tem seus requisitos, e o PHP permite que você personalise bastante as sessões.

 

session_id()

Toda sessão tem um ID, por qual é mantida uma ligação com o usuário. Normalmente por cookie, esse ID é informado para o PHP, assim ele pode resgatar os valores armazenados da sessão do usuário.

O ID da sessão pode ser obtido chamando a função session_id():

<?php
    $id_da_sessao = session_id();
   
    echo 'O ID da sessão atual é: ' . $id_da_sessao;

O código acima não imprimirá somente a frase, mas nenhum ID. Por quê?

Porque nós não inicializamos a sessão. Se você for trabalhar com sessão, sempre inicializa-se com session_start().

<?php
    $id_da_sessao = session_id();
   
    session_start();
   
    echo 'O ID da sessão antes de iniciar: ' . $id_da_sessao;
    echo '<br />';
    echo 'O ID da sessão depois de iniciar: ' . session_id();

Agora, note que na segunda frase impressa, contém uma sequência de caracteres que identifica a sessão. É uma sequência que contém uma mistura aleatória de letras e números, propositalmente, para diminuir o risco de dois usuários utilizarem a mesma sessão.

Note, que você pode clicar em no "Refresh" ou "Recarregar" (tecla F5) no seu navegador que o mesmo ID é impresso, pois, esse id é mantido em um cookie no browser do usuário.

Até agora, só usamos o session_id() para retornar o ID da sessão atual, mas podemos indicar qual o ID da sessão. Veja:

<?php
   
    session_id(100);
    
    session_start();
   
    echo 'O ID da sessão atual: ' . session_id();
 

É só passar como argumento na chamada do session_id(). Qual a vantagem disso? Você pode ajustar para usar a sua função aleatória para identificar as sessões.

<?php
   
    session_id(rand(1, 99999));
   
    session_start();
   
    echo 'O ID da sessão atual: ' . session_id();
   

 

session_regenerate_id();

O session_regenerate_id troca o ID da sessão atual. Lembre-se que citei que o ID da sessão é armazenado no cookie. Sendo possível que alguém tenha acesso ao cookie do usuário, ele pode usar indevidamente a sessão desse usuário.

Como, em geral, as sessões iniciam quando o usuário acessam pela primeira vez o site, e só é destruida quando o usuário fecha o navegador, usando as configurações padrões, o mesmo número de sessão é utilizado até ela ser destruída. Isso facilita para  os usuários maliciosos possam roubar a sessão do usuário, de alguma forma lendo o cookie e recuperando um ID de sessão que será válido por um bom tempo.

Uma forma de dificultar essas ações é re-gerar o ID:

<?php
    
    session_start();   
   
    $id_da_sessao = session_id();
   
    session_regenerate_id();
   
    echo 'O ID da sessão antes de mudar: ' . $id_da_sessao;
    echo '<br />';
    echo 'O ID da sessão depois de mudar: ' . session_id();
 

Sendo assim, a cada requisição que o usuário realizar, um novo ID de sessão será gerado. E para ter certeza que nenhuma informação possa ser recuperada com o ID antigo, basta informar ao PHP para descartar essas informações (as informações ligadas ao ID anterior, pois, os dados da sessão atual serão mantidos com o novo ID) basta passar o valor true como parâmetro para a função session_regenerate_id().

<?php
   
    session_start();   
   
    $id_da_sessao = session_id();
   
    session_regenerate_id(true);
    
    echo 'O ID da sessão antes de mudar: ' . $id_da_sessao;
    echo '<br />';
    echo 'O ID da sessão depois de mudar: ' . session_id();

Utilizando esse método, há um único incoveniente que se o usuário tentar voltar ou avançar pelos botões de navegação do navegador o resultado não será o esperado.

 

session_set_cookie_params()

Outra forma de controle das sessões é definir até quando e como ela é válida. O padrão é "Até o browser ser fechado". Mas isso é garantido 100%? Não. Nesse ponto temos que confiar que o browser respeite as configurações de cada cookie. A função session_set_cookie_params realiza tais configurações e ela deve ser chamada antes do session_start. Usando a função session_set_cookie_params podemos definir o tempo de duração do cookie da sessão passando como primeiro parâmetro, em segundos:

<?php
    session_set_cookie_params(60);   
    session_start();    
   
    echo 'O ID da sessão atual: ' . session_id();

O código acima define que a sessão dure 1 minuto. Se você quiser voltar ao padrão "Até o navegador ser fechado" passe o valor 0 (zero) como parâmetro.

Você pode ainda restringir a pasta que esse cookie estará disponível. Por padrão, o caminho configurado para o cookie de sessão é o "/" que indica a raiz do site. Então, todas as páginas a que estão dentro da raiz do site podem receber esse cookie. Mas por exemplo, você pode definir que o cookie da sessão só seja enviada para todas as páginas que estiverem dentro da pasta "admin" e subpastas, basta passar o nome da pasta, ou o caminho no segundo parâmetro:

<?php
    session_set_cookie_params(60, '/admin');   
    session_start();

Então, se você acessar http://example.com/admin/login/index.php você estará acessando a sessão acima. Mas se você acessar http://example.com/qualquer/index.php  Você não usará a sessão acima.

Você pode restringir que o cookie da sessão esteja disponível apenas a um subdomínio, setando no terceiro parâmetro:

<?php
    session_set_cookie_params(60, '/', 'subdominio.exemplo.com');   
    session_start();

Você pode indicar que o cookie só seja transferido usando https, setando o quarto parâmetro:

<?php
    session_set_cookie_params(60, '/', '', true);
    session_start();

E por último, você pode indicar que o cookie só esteja disponível para trasmissão, ou seja, não permitir a leitura do conteúdo do cookie via Javascript, reduzindo o risco de ter uma sessão roubada usando javascript. Para isso, basta passar o valor true no quinto parâmetro:

<?php
    session_set_cookie_params(60, '/', '', false, true);
    session_start();

As informações passadas aqui são as mais comuns de serem utilizadas no seu dia-a-dia, mas se você precisar de alguma outra funcionalidade, consulte a documentação: http://www.php.net/manual/pt_BR/ref.session.php