CORS mal configurado: as armadilhas do curinga e do reflexo
Cross-Origin Resource Sharing (CORS) controla quais outros sites podem ler as respostas da sua API. Uma política com curinga ou com origem refletida pode deixar qualquer site fazer requisições autenticadas e ler os resultados.
O que é
Os navegadores bloqueiam leituras entre origens por padrão. Os cabeçalhos CORS afrouxam isso de forma seletiva. Access-Control-Allow-Origin: * abre as respostas para todos os sites.
Uma falha mais sutil é o reflexo de origem: o servidor devolve no cabeçalho allow-origin qualquer Origin que a requisição trouxe, o que na prática confia em todo mundo enquanto parece específico.
Por que importa
Se a sua API serve dados de usuários e permite credenciais, uma política CORS ampla demais deixa um site malicioso ler os dados de uma vítima logada direto da sua API.
O reflexo combinado com Access-Control-Allow-Credentials: true é especialmente perigoso — ele anula a proteção de mesma origem que normalmente mantém os dados dos usuários privados.
Como corrigir
Valide o Origin da requisição contra uma lista fixa de domínios confiáveis e só então devolva-o.
const ALLOWED = new Set(["https://app.yourdomain.com"]);
const origin = req.headers.get("origin") ?? "";
const allow = ALLOWED.has(origin) ? origin : "";
// only set the header when allow is non-emptyOs navegadores proíbem Access-Control-Allow-Origin: * junto com credenciais, então às vezes os apps refletem a origem no lugar — e é justamente essa a vulnerabilidade. Use uma allowlist estrita em vez disso.
Se um endpoint não precisa de acesso entre origens, não envie nenhum cabeçalho CORS. Abra só as rotas específicas que realmente precisam.
FAQ
Access-Control-Allow-Origin: * é sempre ruim?
Não para recursos realmente públicos e sem credenciais (por exemplo, uma fonte pública ou uma API de dados abertos). É perigoso para qualquer coisa ligada a uma sessão de usuário.
O CORS protege o meu servidor?
Não — o CORS é aplicado pelo navegador, não pelo servidor. Ele governa o que o JavaScript de outros sites pode ler, não se uma requisição chega até você.
Seu app está afetado?
O AppSafe verifica isso e dezenas de outros problemas em um único escaneamento grátis.
Escanear meu app grátisGuias relacionados
Introspecção pública do GraphQL: por que é um problema e como desativá-la
Uma única query retorna o seu schema inteiro. Desative em produção.
As flags de cookie Secure, HttpOnly e SameSite
Três flags que impedem o roubo dos cookies de sessão.
Métodos HTTP perigosos: como TRACE, PUT e DELETE são anunciados
Uma resposta OPTIONS que lista TRACE ou DELETE revela mais do que deveria.
API keys expostas no JavaScript do cliente
Tudo no seu bundle é público. Trate assim.