Cookies
Esta aula aborda o gerenciamento de cookies em PHP, incluindo a criação com setcookie(), leitura via $_COOKIE, definição do tempo de vida e configurações de segurança como HttpOnly e Secure. O conteúdo é prático, com exemplos de código e boas práticas para uso seguro de cookies.
Cookies são pequenos arquivos de texto armazenados no navegador do cliente, usados para manter informações entre requisições HTTP, como preferências de usuário, carrinhos de compra ou sessões. Em PHP, o gerenciamento de cookies é feito principalmente com a função setcookie() e a superglobal $_COOKIE. Nesta aula, veremos como criar, ler e configurar cookies com segurança.
É importante entender que cookies são enviados pelo servidor no cabeçalho HTTP Set-Cookie e armazenados pelo navegador. Nas requisições subsequentes, o navegador envia de volta o cookie no cabeçalho Cookie. PHP automaticamente disponibiliza esses valores em $_COOKIE.
setcookie
A função setcookie() define um cookie a ser enviado ao navegador. Sua sintaxe básica é:
setcookie(string $name, string $value = "", int $expires_or_options = 0, string $path = "", string $domain = "", bool $secure = false, bool $httponly = false): boolO primeiro parâmetro é o nome do cookie, e o segundo é o valor. O terceiro parâmetro define o tempo de expiração (timestamp Unix). Se omitido (0), o cookie expira ao fechar o navegador (cookie de sessão). Os demais parâmetros controlam escopo e segurança.
Exemplo básico:
Neste exemplo, o cookie é válido para todo o site (path "/") e expira após 3600 segundos (1 hora). A função deve ser chamada antes de qualquer saída HTML, pois envia cabeçalhos HTTP.
Lendo cookies
Para ler um cookie enviado pelo navegador, usa-se a superglobal $_COOKIE, que é um array associativo. O valor está disponível apenas após a requisição seguinte ao envio do cookie (o cookie não está disponível na mesma requisição em que foi definido).
Exemplo de leitura:
É sempre recomendável verificar se o índice existe com isset() para evitar warnings. Lembre-se: o valor do cookie é texto; se precisar de arrays, serialize ou use JSON.
Tempo de vida
O tempo de vida de um cookie é controlado pelo parâmetro expires_or_options (timestamp Unix). Se definido como 0 ou omitido, o cookie é temporário (expira ao fechar o navegador). Valores positivos definem uma data futura.
Exemplos:
Para remover um cookie, defina seu valor como "" e expiração no passado (ex.: time() - 3600).
Segurança (HttpOnly, Secure)
Cookies podem conter informações sensíveis, então o PHP oferece flags de segurança:
- Secure: O cookie só é enviado em conexões HTTPS. Impede interceptação em redes não seguras.
- HttpOnly: O cookie não é acessível via JavaScript (document.cookie), mitigando ataques XSS.
- SameSite: Controla envio em requisições cross-site (não é parâmetro direto, mas pode ser configurado via array de opções).
No PHP 7.3+, você pode passar um array associativo como terceiro parâmetro para maior clareza:
time() + 3600,
'path' => '/',
'domain' => 'exemplo.com',
'secure' => true,
'httponly' => true,
'samesite' => 'Strict' // ou 'Lax', 'None'
]);
?>Recomenda-se sempre usar httponly e secure (se HTTPS) para cookies de autenticação. O atributo SameSite ajuda a prevenir CSRF.
Boas práticas
- Nunca armazene senhas ou dados extremamente sensíveis em cookies; prefira sessões no servidor.
- Valide e sanitize valores de cookies ao ler, pois podem ser manipulados pelo cliente.
- Use prefixos como
__Host-ou__Secure-para cookies com escopo restrito (não abordado em detalhes, mas relevante). - Sempre defina um path e, se possível, um domínio específico para evitar vazamentos.
Referências
- PHP: setcookie - Manual
- PHP: $_COOKIE - Manual
- MDN: Cookies HTTP
- OWASP: HttpOnly
- MDN: Set-Cookie header
- PHP: Cookies - Manual
Exercícios
Crie um script PHP que defina um cookie chamado
cor_fundocom valorazulque expire em 2 dias. Em seguida, leia o cookie e exiba uma mensagem.✓ Resposta:Escreva um código que remova o cookie
usuario(definido anteriormente) definindo-o com expiração no passado.✓ Resposta:Explique por que um cookie definido com
setcookie()não está disponível em$_COOKIEna mesma requisição.✓ Resposta:Porque o cookie é enviado ao navegador no cabeçalho HTTP da resposta, e só estará disponível na próxima requisição, quando o navegador o envia de volta no cabeçalho da requisição.
$_COOKIEreflete os cookies recebidos na requisição atual, não os que acabaram de ser definidos.Crie um script que defina um cookie seguro (Secure) e HttpOnly, com nome
sessao_id, valorabc123, válido por 1 hora, path/, e SameSiteLax. Use a sintaxe de array.✓ Resposta:time() + 3600, 'path' => '/', 'secure' => true, 'httponly' => true, 'samesite' => 'Lax' ]); ?>Qual a diferença entre um cookie de sessão (expira ao fechar o navegador) e um cookie persistente? Dê um exemplo de uso para cada.
✓ Resposta:Cookie de sessão é armazenado apenas na memória do navegador e é deletado quando o navegador é fechado. Exemplo: manter o status de login temporário. Cookie persistente tem data de expiração definida e permanece no disco do usuário até expirar ou ser removido. Exemplo: lembrar preferências de tema por semanas.