Checklist · Pré-lançamento
Checklist de segurança antes de lançar um app vibe-coded
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.
Secrets e variáveis de ambiente
~5 minNenhuma chave privada usa NEXT_PUBLIC_ ou VITE_
CríticoBusque 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íticoExecute: git log --all --full-history -- .env .env.local .env.production — se retornar commits, o arquivo foi commitado.
.gitignore cobre todos os arquivos de ambiente
AltoConfirme que .gitignore contém: .env, .env.local, .env.production, .env.*.local
Chaves de produção diferentes das de desenvolvimento
AltoBanco 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
AltoNo 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édioEm next.config.ts, confirme: productionBrowserSourceMaps: false. Source maps em produção expõem o código-fonte original.
Banco de dados
~8 minRow Level Security ativo em todas as tabelas Supabase
CríticoNo 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íticoNo 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íticoBusque "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
AltoA 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édioDev e produção devem usar bancos separados. Acesso ao banco de produção deve ser restrito e auditado.
Autenticação e autorização
~10 minTodos os endpoints de mutação verificam sessão
CríticoEm 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íticoRevise 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íticoQualquer 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
AltoNo 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édioSessõ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édioLogout 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 minCORS restrito às origens que você controla
AltoInspecione 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
AltoCada 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
AltoRotas 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
AltoWebhooks 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édioEm 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 minContent-Security-Policy configurado
AltoF12 → Network → clique no documento HTML → Response Headers. Verifique presença de Content-Security-Policy. Ausente = XSS irrestrito.
Strict-Transport-Security (HSTS) presente
AltoResponse headers deve conter Strict-Transport-Security: max-age=... — força HTTPS e protege contra downgrade attacks.
X-Frame-Options ou frame-ancestors no CSP
AltoProtege contra clickjacking. Deve estar X-Frame-Options: DENY ou frame-ancestors 'none' no CSP.
X-Content-Type-Options: nosniff presente
MédioPrevine 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
AltoVerifique 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 minRepositório privado (se aplicável)
AltoSe 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
AltoNo 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édioRevise 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édioExecute 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átisSem cadastro · Resultado por e-mail em minutos