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 recurso
  • Access-Control-Allow-Credentials — se cookies e headers de autenticação são permitidos
  • Access-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: null pode 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-Age para 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