O suporte a sessões no PHP consiste em uma maneira de preservar certos dados atráves dos acessos subsequentes. Isto permite a você fazer aplicações mais personalizadas e melhorar a aparência do seu web site
Um visitante acessando o seu web site ganha um identificador único, o assim chamado id de sessão. Este é salvo em um cookie do lado do usuário ou propagado via URL.
O suporte a sessão permite a você registrar um número arbritrário de variáveis que serão preservadas entre as requisições. Quando um visitante acessar o seu site, o PHP irá conferir automaticamente (se session.auto_start estiver definido como 1) ou quando você pedir (explicitamente atráves de session_start() ou implicitamente através de session_register()) quando um id de sessão específico for enviado com a requisição. Se este for o caso, o ambiente anteriormente salvo é recriado.
Se você ativar session.auto_start então você não poderá colocar objetos em suas sessões já que a definição deve ser carregada antes de começar a sessão para poder recriar os objetos da sua sessão.
Todas as variáveis são serializadas depois das solicitações terminarem. Variáveis registradas as quais não estejam definidas são marcadas como sendo não definidas. Nos acessos subsequentes, estas não são definidas pelo módulo da sessão a menos que o usuário defina elas posteriormente.
Alguns tipos de dados não podem ser serializados e assim guardados em sessões. Isso inclui variáveis de resource(recursos) ou objetos com referências circulares (ex. objetos que passam uma referência de si mesmo para outro objeto).
Nota: A manipulação de sessões foi adicionado no PHP 4.0.
Nota: Por favor note que ao trabalhar com sessões que um registro da sessão não é criado até que a variável seja registrada usando a função session_register() ou pela adição de uma nova chave a array superglobal $_SESSION. Isto é verdadeiro não importando se uma sessão foi iniciada usando a função session_start().
Links externos: » Session fixation
O módulo das sessões não pode garantir que a informação que você guarda em uma sessão será visto somente pelo usuário que criou a sessão. Você precisa tomar medidas adicionais de segurança para proteger ativamente a integridade da sessão, dependendo do valor dos dados.
Meça a importância dos dados carregados pelas suas sessões e tome medidas adicionais de proteção -- isto normalmente vem com um preço, menos conveniência para o usuário. Por exemplo, se você quiser proteger os usuários de táticas simples de engenharia social, você deve ativar session.use_only_cookies. Neste caso, os cookies devem estar ativados incondicionalmente do lado do usuário ou as sessões não irão funcionar.
Existem várias maneiras de vazar um id de uma sessão para terceiros. Um id de sessão vazado permite a terceiros acessar a todos os recursos que estão associados ao id específico. Primeiro, URLs carregando ids de sessão. Se você criar um link com um site externo, a URL inclusa no id de sessão deve ser guardada nos logs de referência do site externo. Segundo, um ataque mais ativo pode escutar ao seu tráfego de rede. Se ele não for criptografado, os ids de sessão irão passar como texto simples pela sua rede. A solução aqui é implementar SSL em seu servidor e tornar obrigatório para os seus usuários.
Nenhuma biblioteca externa é necessária para compilar esta extensão.
Nota: Opcionalmente você pode usar alocação de memória compartilhada (mm), desenvolvida por Ralf S. Engelschall, para salvar a sessão. Você terá que baixar » mm e instalá-lo. esta opção não esta disponível para plataformas Windows. Note que o módulo de sessões para o mm não garante que acessos concorrentes a mesma sessão sejam travados propriamente. Pode ser mais apropriado usar um sistema de arquivos baseado em memória compartilhada (como tmpfs em Solaris/Linux, ou /dev/md em BSD) para salvar sessões em arquivos, por que eles são propriamente travados. Os dados das sessões são salvos na memória então se o servidor for reiniciado os dados são excluídos.
Suporte a sessões está habilitado no PHP por definição. Se você não gostaria de construir o seu PHP sem esse suporte, você especificaria a opção --disable-session para configurar. Para utilizar uma alocação de memória dividida (mm) para armazenamento de sessão configure o PHP com --with-mm[=DIR] .
A versão para Windows do PHP tem suporte embutido para esta extensão. Você não precisa carregar nenhuma extensão adicional para utilizar essas funções.
Nota: Por definição, todos os dados relaciondos uma uma sessão em particular serão guardados num arquivo no diretório especificado pela opção session.save_path INI . Um arquivo para cada sessão (apesar de quaisquer dados estarem associados com essa sessão) será criada. Isto é devido ao fato de que uma sessão é aberta (um aquivo é criado) mas até então nenhum dado é escrito nesse arquivo. Note que este comportamento é um efeito colateral da limitação do traalho com o arquivo de sistema e é possível que um manipulador de sessão customizado(tal como é usado em banco de dados) não manterá registro de sessões que não guardaram nenhum dado.
O comportamento dessas funções podem ser modificado pelas configurações do php.ini.
Nome | Padrão | Modificável | Mudanças |
---|---|---|---|
session.save_path | "/tmp" | PHP_INI_ALL | |
session.name | "PHPSESSID" | PHP_INI_ALL | |
session.save_handler | "files" | PHP_INI_ALL | |
session.auto_start | "0" | PHP_INI_ALL | |
session.gc_probability | "1" | PHP_INI_ALL | |
session.gc_divisor | "100" | PHP_INI_ALL | |
session.gc_maxlifetime | "1440" | PHP_INI_ALL | |
session.serialize_handler | "php" | PHP_INI_ALL | |
session.cookie_lifetime | "0" | PHP_INI_ALL | |
session.cookie_path | "/" | PHP_INI_ALL | |
session.cookie_domain | "" | PHP_INI_ALL | |
session.cookie_secure | "" | PHP_INI_ALL | Available since PHP 4.0.4. |
session.cookie_httponly | "" | PHP_INI_ALL | Available since PHP 5.2.0. |
session.use_cookies | "1" | PHP_INI_ALL | |
session.use_only_cookies | "0" | PHP_INI_ALL | Disponível desde o PHP 4.3.0 |
session.referer_check | "" | PHP_INI_ALL | |
session.entropy_file | "" | PHP_INI_ALL | |
session.entropy_length | "0" | PHP_INI_ALL | |
session.cache_limiter | "nocache" | PHP_INI_ALL | |
session.cache_expire | "180" | PHP_INI_ALL | |
session.use_trans_sid | "0" | PHP_INI_ALL | PHP_INI_ALL no PHP <= 4.2.3. PHP_INI_PERDIR no PHP < 5. Disponível desde o PHP 4.0.3. |
session.bug_compat_42 | "1" | PHP_INI_ALL | Disponível desde o PHP 4.3.0 |
session.bug_compat_warn | "1" | PHP_INI_ALL | Disponível desde o PHP 4.3.0 |
session.hash_function | "0" | PHP_INI_ALL | Disponível desde o PHP 5.0.0 |
session.hash_bits_per_character | "4" | PHP_INI_ALL | Disponível desde o PHP 5.0.0 |
url_rewriter.tags | "a=href,area=href,frame=src,form=,fieldset=" | PHP_INI_ALL | Disponível desde o PHP 4.0.4. |
O sistema de gerenciamento de sessões suporta um número de opções de configuração que você pode colocar em seu arquivo php.ini. Nós daremos um breve resumo.
Há um argumento N opcional para esta dietiva que determina o número de níveis de diretório que seus arquivos de sessão serão extendidos. Por exemplo, definindo para '5;/tmp' pode levar a criação de um arquivo de sessão e localização como /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If . Para fazer uso do N você deve criar todos estes diretórios antes de usar. Um pequeno script shell existe em ext/session para fazer isto, ele é chamado mod_files.sh. Também note se N é usada e maior do que and greater than 0 então a "automatic garbage collection" não será executada, veja uma cópia do php.ini para mais informação. Veja, se você usa N if you use N, be certifique-se de cercar session.save_path com "aspas" porque o separador (;) é também usado para comentátios no php.ini.
Se você deixar isto definido num diretório de leitura público, tal como /tmp (o padrão), outros usuários no servidor poderão raptar sessõoes pegando a lista de arquivos nesse diretório.
Nota: Antes do PHP 4.3.6 os usuários de Windows tem que mudar esta variável para fazer funções de sessão no PHP. Certifique-se de especifica um caminho válido, ex.: c:/temp.
Nota: Se scripts diferentes tem valores diferentes para session.gc_maxlifetime mas compartilham o mesmo lugar para guardar os dados da sessão então o script com o menor valor estara limpando os dados. Neste caso, use esta diretiva em conjunto com session.save_path.
Nota: Se você está usando o file-based session handler como padrão, seu sistema de arquivos deve manter registrado quantidade de acessos (atime). Windows FAT dessa forma não faz, então você terá que sugerir outro modo para manipular a coleção de lixo de sua sessão se você está num sistema FAT ou quaisquer outros fs onde quantidade de acessos (atime tracking) não está disponível.
Nota: Para PHP 4.1.2 ou inferior, ele só é habilitado se fizer a opção na compilação com --enable-trans-sid. A partir do PHP 4.2.0, está sempre compilado. Gerenciamentode sessões baseadas na URL tem riscos de segurança adicionais comparados ao gerenciamento baseado em cookies. Usuários podem enviar uma URL que contenha uma ID de sessão ativa para seus amigos por e-mail ou usuários pode salvar uma URL que contenha uma ID de sessão para seus bookmarks e acessar seu site com a mesma ID de sessão sempre, por exemplo.
Nota: Isto foi introduzido no PHP 5.
Nota: Isto foi introduzido no PHP 5.
Nota: Se você quer conformidade XHTML, remova a entrada form e utilize as tags <fieldset> em volta dos campos de formulário.
As definições de configuraçãotrack_vars e register_globals influenciam como as variáveis de sessão são guardadas e restauradas.
Nota: No PHP 4.0.3, track_vars está sempre ligada.
Esta extensão não possui nenhum tipo resource.
As contantes abaixo são definidas por esta extensão e somente estarão disponíveis quando a extensão foi compilada com o PHP ou carregada dinamicamente durante a execução.
Nota: A partir do PHP 4.1.0, $_SESSION está disponível como uma variável global como $_POST, $_GET, $_REQUEST e assim por diante. Diferentemente de $HTTP_SESSION_VARS, $_SESSION é sempre global. Entretanto, você não precisa usar a palavra global para $_SESSION. por favor note que esta documentação foi modifcada para usar $_SESSION em todos os lugares. Você pode substituir $HTTP_SESSION_VARS por $_SESSION, se você prefirir. Também note que você precisa começar a sua sessão usando session_start() antes que $_SESSION esteja disponível.
As chaves para a array associativa $_SESSION estão sujeitas ao mesmas limitações que as os nomes de variáveis regulares do PHP, ex elas não podem começar com um numero e devem começar com uma letra ou sublinhado;. Para maiores detalhes veja a sessão sobre variaveis neste manual.
Se register_globals estiver desativado, apenas membros da matriz associativa global $_SESSION podem ser registrados como variáveis de sessão. As variavéis de sessão restauradas apenas estarão disponíveis na array $_SESSION.
O uso de $_SESSION (ou $HTTP_SESSION_VARS com PHP 4.0.6 ou anterior) é recomendado para melhor segurança e facilidade de leitura do código. Com $_SESSION, não há necessidade de usar as funções session_register(), session_unregister(), session_is_registered(). Variáveis de sessão são acessíveis como qualquer outra variável.
Example#1 Registrando uma variável com $_SESSION.
<?php
session_start();
// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
?>
Example#2 Desregistrando uma variável com $_SESSION e register_globals desabilitado.
<?php
session_start();
// Use $HTTP_SESSION_VARS with PHP 4.0.6 or less
unset($_SESSION['count']);
?>
NÃO desregistre toda a $_SESSION com unset($_SESSION) já que isso irá desativar o registro de variáveis de sessão atráves da superglobal $_SESSION.
Você não pode usar referências em variáveis de sessão já que não existe uma maneira de restaurar uma referência a outra variável.
Se register_globals estiver ativada, então cada variável global pode ser registrada como uma variável de sessão. Após o reinicio da sessão, estas variáveis serão restauradas a suas variáveis globais correspondentes. Já que o PHP deve saber quais variáveis globais devem ser registradas como variáveis de sessão, o usuário precisa registrar as variáveis com a função session_register(). Você pode evitar isso simplesmente definindo entradas em $_SESSION.
Antes do PHP 4.3, se você estiver usando $_SESSION e você desabilitou register_globals, não use session_register(), session_is_registered() ou session_unregister(). Desabilitar register_globals é recomendado por motivo de segurança e performance.
Se register_globals estiver ativada, então as variáveis globais e as entradas em $_SESSION irão automaticamente referenciar os mesmos valores que estejam registrados na instancia da sessão anterior. Entretanto, se a variável for registrada por $_SESSION então a variável global estará disponível a partir da proxima requisição.
Existe um defeito no PHP 4.2.3 e anterior. Se você registrar uma nova variável de sessão usando session_register(), a entrada no escopo global e a entrada em $_SESSION não irão se referir ao mesmo valor até o próximo session_start(). Ex: uma modificação na variável global recém registrada não será refletida pela entrada em $_SESSION. Isto foi corrigido no PHP 4.3.
Existem dois métodos para a propagação do id de sessão:
O módulo de sessão suporta ambos os métodos. Cookies são melhores, mas como eles nem sempre estão disponíveis, nós também provemos um caminho alternativo. O segundo metodo embute o id de sessão diretamente nas URLs.
O PHP é capaz de transformar os links transparentemente. A menos que você esteja usando o PHP 4.2 ou posterior, você precisa ativar isso manualmente ao compilar o PHP. No Unix, passe --enable-trans-sid para o configure. Se esta opção de compilação e a opção em tempo execução session.use_trans_sid estiverem ativadas, URIs relativas serão modificadas para conter o id de sessão automaticamente.
Nota: A diretiva arg_separator.output php.ini permite a você personalizar o separador de argumentos. Para estar em completa conformidade com XHTML, especifique & aqui.
Alternativamente, você pode usar a constante SID a qual é definida se uma sessão é iniciada. Se o cliente não enviou um cookie de sessão apropriado, ela tem a forma session_name=session_id. Se não, ela expande para uma string vazia. Assim, você pode colocá-la incondicionalmente em URLs.
O exemplo a seguir mostra como registrar uma variável, e como criar um link corretamente para outra pagina usando SID.
Example#3 Contando o número de visitas de um único usuário
<?php
if (!session_is_registered('count')) {
session_register('count');
$count = 1;
} else {
$count++;
}
?>
<p>
Hello visitor, you have seen this page <?php echo $count; ?> times.
</p>
<p>
To continue, <a href="nextpage.php?<?php echo strip_tags(SID); ?>">click
here</a>.
</p>
A função strip_tags() é usada ao mostrar o SID para previnir ataques relacionados a XSS.
Mostrar o SID, como mostrado acima, não é necessário se --enable-trans-sid foi usado para compilar o PHP.
Nota: É assumido para URLs não relativas que apontem para sites externos e assim não é adicionado o SID, já que seria um risco de segurança vazar o SID para um servidor diferente.
Para implementar as sessões em banco de dados, ou qualquer outro método de armazenamento, você precisara usar session_set_save_handler() para criar um conjunto de funções de armazenamento.