Todos os guias
Severidade CríticaSegredos expostos

API keys expostas no JavaScript do cliente

Tudo que é enviado ao navegador — scripts inline, JS empacotado, source maps — pode ser lido por qualquer um. Chaves secretas (OpenAI, a secreta do Stripe, AWS, URLs de banco de dados) embutidas no código do frontend estão, na prática, publicadas.

O que é

As ferramentas de build embutem as variáveis de ambiente em tempo de compilação. Se você referenciar um segredo no código do cliente, ele acaba no bundle de JavaScript que todo visitante baixa.

Há uma distinção crucial: chaves publicáveis/anônimas (pk_live do Stripe, a config web do Firebase) são feitas para serem públicas, mas chaves secretas (sk_live, chaves service-role, API keys de provedores) não são e nunca devem chegar ao navegador.

Por que importa

Uma chave de provedor vazada deixa qualquer um acumular consumo na sua conta — contas de LLM, cobranças de SMS, gastos de nuvem — ou acessar os dados que a chave autoriza.

Os atacantes varrem bundles de JavaScript em massa procurando padrões de chaves. Um segredo commitado costuma ser abusado poucos minutos depois de entrar no ar.

Como corrigir

Mantenha os segredos no servidor

Chame as APIs de terceiros a partir de uma rota de servidor ou backend, nunca do navegador. O navegador conversa com o seu endpoint; o seu endpoint guarda a chave.

// app/api/summarize/route.ts (server-only)
export async function POST(req: Request) {
  const { text } = await req.json();
  const r = await fetch("https://api.openai.com/v1/responses", {
    method: "POST",
    headers: { Authorization: `Bearer ${process.env.OPENAI_API_KEY}` },
    body: JSON.stringify({ model: "gpt-4o-mini", input: text }),
  });
  return Response.json(await r.json());
}
Use o prefixo NEXT_PUBLIC_ com cuidado

No Next.js, só as variáveis com o prefixo NEXT_PUBLIC_ são expostas ao navegador. Nunca coloque um segredo atrás desse prefixo — use-o apenas para valores que podem ser públicos sem risco.

Rotacione as chaves vazadas

Se um segredo foi enviado ao navegador, revogue-o e emita um novo. Removê-lo do próximo build não invalida as cópias que já foram coletadas.

FAQ

Minha chave publicável do Stripe (pk_live) é um problema no frontend?

Não — as chaves publicáveis são feitas para serem públicas. O risco é a chave secreta (sk_live), que precisa ficar no servidor.

Posso simplesmente ofuscar a chave?

Não. A ofuscação é trivialmente reversível. A única correção é manter o segredo totalmente fora do cliente.

Seu app está afetado?

O AppSafe verifica isso e dezenas de outros problemas em um único escaneamento grátis.

Escanear meu app grátis