Checklist · Pré-lançamento

Checklist de segurança antes de lançar um app vibe-coded

Publicado em 27 mar 2026·31 verificações · ~30 min

Este checklist cobre as 31 verificações de segurança mais importantes antes de colocar um app vibe-coded em produção. Está organizado por categoria, com estimativa de tempo para cada bloco. Cada item inclui exatamente como verificar — não apenas o que verificar. Execute na ordem: secrets e banco de dados primeiro, porque um erro nessas categorias pode expor dados de usuários imediatamente após o lançamento.

Crítico
Alto
Médio

Secrets e variáveis de ambiente

~5 min

Nenhuma chave privada usa NEXT_PUBLIC_ ou VITE_

Crítico

Busque no bundle: grep -r "sk-" .next/static/ e grep -r "eyJ" .next/static/ após um build local. Qualquer resultado é crítico.

Guia detalhado →

Arquivo .env não está no repositório Git

Crítico

Execute: git log --all --full-history -- .env .env.local .env.production — se retornar commits, o arquivo foi commitado.

.gitignore cobre todos os arquivos de ambiente

Alto

Confirme que .gitignore contém: .env, .env.local, .env.production, .env.*.local

Chaves de produção diferentes das de desenvolvimento

Alto

Banco de dados, Stripe, OpenAI e outros serviços devem ter chaves separadas por ambiente. Chave de dev comprometida não pode afetar produção.

Variáveis de ambiente configuradas no painel do provedor de deploy

Alto

No Vercel/Netlify/Railway: confirme que todas as variáveis estão configuradas em Settings → Environment Variables — não apenas localmente.

Source maps desabilitados em produção (Next.js)

Médio

Em next.config.ts, confirme: productionBrowserSourceMaps: false. Source maps em produção expõem o código-fonte original.

Banco de dados

~8 min

Row Level Security ativo em todas as tabelas Supabase

Crítico

No Supabase SQL Editor: SELECT tablename, rowsecurity FROM pg_tables WHERE schemaname = 'public'; — todos devem retornar true.

Guia detalhado →

Políticas RLS cobrindo SELECT, INSERT, UPDATE e DELETE

Crítico

No Supabase Dashboard → Authentication → Policies: cada tabela deve ter políticas explícitas para cada operação usada pelo app.

service_role key ausente do frontend

Crítico

Busque "service_role" no bundle: grep -r "service_role" .next/static/ — deve retornar vazio. A service_role ignora o RLS.

Conexão com banco usa SSL em produção

Alto

A URL de conexão do banco deve incluir ?sslmode=require. Verifique nas variáveis de ambiente do provedor de deploy.

Sem dados de produção reais em ambiente de desenvolvimento

Médio

Dev e produção devem usar bancos separados. Acesso ao banco de produção deve ser restrito e auditado.

Autenticação e autorização

~10 min

Todos os endpoints de mutação verificam sessão

Crítico

Em uma aba anônima, abra o console e execute: fetch('/api/seu-endpoint', { method: 'POST', body: JSON.stringify({}) }). Deve retornar 401, não 200.

IDs de recursos vêm da sessão, não do body da requisição

Crítico

Revise cada API route: o userId/ownerId usado nas queries deve ser session.user.id, nunca request.body.userId.

Rotas administrativas protegidas por verificação de role

Crítico

Qualquer rota /api/admin/* deve verificar tanto a autenticação quanto a role do usuário antes de executar.

Middleware de autenticação ativo e sem bypasses

Alto

No middleware.ts: confirme que nenhuma rota protegida está comentada ou tem condição de bypass ativa. Busque por "TODO" e "temporário".

Tokens de sessão com expiração adequada

Médio

Sessões não devem durar indefinidamente. Configure JWT expiry ou session maxAge de acordo com a sensibilidade dos dados.

Logout invalida o token no servidor

Médio

Logout deve invalidar o token/sessão no servidor, não apenas no cliente. Tokens localStorage deletados do cliente ainda funcionam se não invalidados.

API e endpoints

~7 min

CORS restrito às origens que você controla

Alto

Inspecione as API routes em busca de Access-Control-Allow-Origin: * — substitua por lista explícita das origens do seu domínio.

Validação de entrada em todos os endpoints

Alto

Cada API route deve validar tipo, formato e limites dos dados recebidos antes de usar. Strings sem limite de tamanho são um vetor de DoS.

Rate limiting nas rotas que chamam serviços pagos

Alto

Rotas que chamam OpenAI, Stripe ou outros serviços pagos devem ter rate limiting por IP ou por usuário autenticado.

Webhooks verificam assinatura antes de processar

Alto

Webhooks do Stripe, GitHub e outros devem verificar a assinatura HMAC do payload. Sem isso, qualquer pessoa pode enviar eventos falsos.

Erros de API não expõem stack traces ou detalhes internos

Médio

Em produção, mensagens de erro devem ser genéricas para o cliente. Stack traces nunca devem aparecer em respostas de API.

Headers de segurança e frontend

~5 min

Content-Security-Policy configurado

Alto

F12 → Network → clique no documento HTML → Response Headers. Verifique presença de Content-Security-Policy. Ausente = XSS irrestrito.

Strict-Transport-Security (HSTS) presente

Alto

Response headers deve conter Strict-Transport-Security: max-age=... — força HTTPS e protege contra downgrade attacks.

X-Frame-Options ou frame-ancestors no CSP

Alto

Protege contra clickjacking. Deve estar X-Frame-Options: DENY ou frame-ancestors 'none' no CSP.

X-Content-Type-Options: nosniff presente

Médio

Previne que o browser interprete arquivos com tipo MIME incorreto. Simples de adicionar no next.config ou no servidor.

SSL/TLS válido e sem protocolos obsoletos

Alto

Verifique com testssl ou use o scanner do Defenty. TLS 1.0 e 1.1 são obsoletos e devem estar desabilitados.

Repositório e deploy

~5 min

Repositório privado (se aplicável)

Alto

Se o projeto não é open source, o repositório deve ser privado. Repositórios públicos expõem lógica de negócio e podem conter secrets históricos.

Preview deployments usam banco e chaves separados de produção

Alto

No Vercel: configure variáveis de ambiente diferentes para Preview vs Production. Previews não devem ter acesso ao banco de produção.

Acesso de colaboradores revisado

Médio

Revise quem tem acesso ao repositório, ao Vercel/Netlify e ao Supabase Dashboard. Remova acessos de colaboradores que saíram do projeto.

Dependências sem vulnerabilidades conhecidas

Médio

Execute npm audit no diretório do projeto. Vulnerabilidades críticas e altas devem ser corrigidas antes do lançamento.

Encontrou problemas. E agora?

Priorize pela criticidade. Itens marcados como Crítico — especialmente secrets expostos e banco sem RLS — devem ser corrigidos antes do lançamento, sem exceção. Um app em produção com esses problemas pode ter dados de usuários comprometidos nas primeiras horas após o lançamento.

Itens de risco Alto devem ser resolvidos antes do lançamento ou imediatamente após — defina uma data. Itens de risco Médio podem compor o backlog da primeira sprint pós-lançamento, mas não devem ser ignorados indefinidamente.

Automatize parte deste checklist com o Defenty

O QuickScan cobre automaticamente: secrets no bundle JavaScript, headers de segurança, SSL/TLS, tecnologias vulneráveis e subdominios expostos — em minutos, sem cadastro.

Escanear meu app agora — grátis

Sem cadastro · Resultado por e-mail em minutos

Leia também