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
- Login to post comments




