Como configurar CORS corretamente e evitar vulnerabilidades
CORS (Cross-Origin Resource Sharing) é essencial para APIs modernas, mas configurações permissivas podem expor dados sensíveis. Veja como fazer certo.
O que é CORS
CORS é um mecanismo de segurança dos navegadores que controla quais origens (domínios) podem acessar recursos de um servidor. Por padrão, navegadores bloqueiam requisições cross-origin — o servidor precisa explicitamente autorizar origens confiáveis através de headers HTTP.
Os principais headers CORS são:
Access-Control-Allow-Origin— quais origens podem acessar o recursoAccess-Control-Allow-Credentials— se cookies e headers de autenticação são permitidosAccess-Control-Allow-Methods— quais métodos HTTP são permitidos (GET, POST, etc.)Access-Control-Allow-Headers— quais headers customizados são aceitos
Por que uma configuração permissiva é perigosa
Uma configuração CORS incorreta pode permitir que sites maliciosos façam requisições autenticadas à sua API em nome do usuário:
- Origin refletido + credentials: o servidor reflete qualquer origin no header de resposta junto com
credentials: true. Isso permite que qualquer site acesse a API com os cookies do usuário. - Wildcard + credentials: usar
Access-Control-Allow-Origin: *com credentials habilitados (navegadores bloqueiam, mas a intenção demonstra misconfiguração). - null origin permitido: aceitar
Origin: nullpode ser explorado via iframes sandboxed.
Um atacante pode criar uma página maliciosa que faz requisições autenticadas à sua API. Se o CORS estiver permissivo, os dados do usuário logado podem ser extraídos sem que ele perceba.
Como o SAFETAGGY detecta
Na varredura básica, o SAFETAGGY verifica:
- Se o servidor reflete o header Origin do requisitante na resposta
- Se Access-Control-Allow-Credentials está habilitado junto com origin permissivo
- Se origin wildcard (*) está configurado em endpoints autenticados
- Se o origin null é aceito
- Se métodos HTTP perigosos (PUT, DELETE) estão permitidos sem restrição de origin
Verifique a configuração CORS do seu site em segundos.
Como configurar CORS corretamente
1. Next.js API Routes
// src/app/api/data/route.ts
import { NextResponse } from 'next/server';
const ALLOWED_ORIGINS = [
'https://www.seusite.com.br',
'https://app.seusite.com.br',
];
export async function GET(req: Request) {
const origin = req.headers.get('origin') ?? '';
const isAllowed = ALLOWED_ORIGINS.includes(origin);
const response = NextResponse.json({ data: '...' });
if (isAllowed) {
response.headers.set('Access-Control-Allow-Origin', origin);
response.headers.set('Access-Control-Allow-Credentials', 'true');
}
return response;
}
// Preflight handler
export async function OPTIONS(req: Request) {
const origin = req.headers.get('origin') ?? '';
const isAllowed = ALLOWED_ORIGINS.includes(origin);
return new Response(null, {
status: 204,
headers: {
...(isAllowed && {
'Access-Control-Allow-Origin': origin,
'Access-Control-Allow-Credentials': 'true',
}),
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Max-Age': '86400',
},
});
}2. Express.js (cors middleware)
import cors from 'cors';
const allowedOrigins = [
'https://www.seusite.com.br',
'https://app.seusite.com.br',
];
app.use(cors({
origin: (origin, callback) => {
// Permite requests sem origin (mobile apps, curl)
if (!origin) return callback(null, true);
if (allowedOrigins.includes(origin)) {
return callback(null, true);
}
return callback(new Error('Bloqueado pelo CORS'));
},
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE'],
allowedHeaders: ['Content-Type', 'Authorization'],
maxAge: 86400,
}));3. Nginx
# /etc/nginx/conf.d/cors.conf
map $http_origin $cors_origin {
default "";
"https://www.seusite.com.br" $http_origin;
"https://app.seusite.com.br" $http_origin;
}
server {
location /api/ {
add_header Access-Control-Allow-Origin $cors_origin always;
add_header Access-Control-Allow-Credentials "true" always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
if ($request_method = OPTIONS) {
add_header Access-Control-Max-Age 86400;
return 204;
}
}
}Checklist de segurança CORS
- Nunca use
Access-Control-Allow-Origin: *em APIs autenticadas - Nunca reflita o header Origin sem validar contra uma whitelist
- Não aceite
Origin: null - Limite os métodos HTTP ao mínimo necessário
- Use
Access-Control-Max-Agepara cachear preflight requests - Teste CORS com
curl -H "Origin: https://evil.com"para verificar se origins maliciosos são bloqueados
Teste seu site agora
O SAFETAGGY verifica automaticamente a configuração CORS do seu site e identifica misconfigurações perigosas. Resultado em menos de 60 segundos.
Fazer varredura gratuita