Cookies em PHP: Setando um com segurança (e sem ser ignorado pelo navegador)

“Você achava que setcookie() era simples… até que o Chrome falou não reconheço essa sua relação insegura aí, parceiro.”

Sim, hoje a gente vai falar de cookies. Não os de chocolate — os do PHP. E sim, tem um jeito certo de setar. Spoiler: se você só usa setcookie('nome', 'valor') e acha que tá tudo certo… não tá.

O básico (ou o que você achava que bastava)

setcookie("usuario", "anderson", time() + 3600, "/");

Legal. Expira em 1 hora. Está disponível no site todo. E é totalmente ignorado em certas situações porque você não configurou os parâmetros modernos que os navegadores querem. Clássico.

Bem-vindo ao mundo real: Secure, HttpOnly, SameSite

Desde 2020+, o Chrome e cia tão exigentes. E com razão. Se você não declarar o SameSite, ele assume Lax (o que nem sempre funciona como você espera).

Aqui vai o jeito certo, versão 2025 style:

setcookie("usuario", "anderson", [
    "expires" => time() + (30 * 24 * 60 * 60), // 1 mês
    "path" => "/",
    "secure" => true,         // só HTTPS. Se for HTTP, vai chorar
    "httponly" => true,       // JS não toca nesse cookie
    "samesite" => "Lax"       // não é o mais chato, mas também não é promíscuo
]);

Entendendo o SameSite

  • Strict: só o seu site mesmo. Exclusivo. Antissocial. Não manda o cookie nem se o cara clicar num link.
  • Lax: “ok, se o usuário clicar num link pro meu site, pode mandar”. Perfeito pra login tradicional.
  • None: “pode tudo” — mas só se tiver Secure=true. Sem HTTPS, o cookie vaza lágrimas.

E se você não usar nada disso?

Seu cookie provavelmente não vai ser enviado em requisições de fora, pode não funcionar em navegadores modernos e você vai passar uma hora achando que seu sistema de login quebrou… quando na real foi só o navegador te protegendo de você mesmo.

E o clássico erro do dev iniciante?

echo "Olá mundo!";
setcookie("usuario", "anderson", time() + 3600, "/"); // 👎

Resultado: Headers already sent. Porque você mandou conteúdo antes de setar o cookie. E sim, até um espaço antes do <?php pode dar ruim.

Conclusão

Se vai usar cookies, faz direito. Usa Secure, HttpOnly, SameSite, define validade decente e evita dor de cabeça. Ou segue usando setcookie() pelado e torce pro navegador não te ignorar.


Postado por 0xk3mp3r entre um deploy e outro.

#protocoloKemper
#kemperStyle
#php
#segurançaWeb
#0xk3mp3r

Rolar para cima