Pular para o conteúdo
Salak Security
Sites e aplicações webCódigo, build publicado, cabeçalhos e sessãoApps Lovable, Bolt e CursorBanco exposto, chaves no navegador, permissões só na tela
01 → Diagnóstico Express
R$ 12.500

Sua aplicação foi feita em Lovable ou Bolt? Em até 5 dias úteis você recebe as falhas críticas com prova e o caminho da correção.

Ver a oferta →
Bancos de dadosAcesso, privilégios, criptografia e backupsAPIs e integraçõesAutorização por objeto, limites e contratosPlataformas corporativasEscopo sob medida, vários times e ambientesPipeline e nuvemCI/CD, containers e infraestrutura como códigoVer todas as soluções →
OfertasMétodoGuiasPara quemSobre
Falar com especialistaVer relatório de exemplo
Ver relatórioFalar com especialista
  1. Início
  2. Guias
  3. Chave exposta no frontend
Guia · 7 min de leitura

Chave de API exposta no frontend: risco e como corrigir

Tudo o que vai para o navegador é público, inclusive as variáveis de ambiente com prefixo VITE_. Qual chave pode ficar exposta, qual nunca pode, como achar no seu app e o que fazer quando já vazou.

Por Equipe Salak Security · Atualizado em 31 de outubro de 2026

Neste guia
  1. Tudo o que vai para o navegador é público
  2. Qual chave pode ser pública e qual nunca pode
  3. Como achar chaves expostas no seu app
  4. A chave já vazou: o que fazer, na ordem
  5. Como evitar que aconteça de novo
SoluçãoSites e aplicações webVer →

Tudo o que vai para o navegador é público

Ferramentas de build como Vite e Next.js separam variáveis de ambiente em duas categorias: as que ficam no servidor e as que são embutidas no JavaScript enviado ao navegador. Estas últimas são marcadas por um prefixo, e qualquer visitante consegue lê-las no DevTools.

FerramentaPrefixo que vai para o navegador
Vite (React, Vue, Svelte)VITE_
Next.jsNEXT_PUBLIC_
Create React AppREACT_APP_
ExpoEXPO_PUBLIC_

O prefixo não é um descuido da ferramenta: é um aviso. Ele diz "esta variável será pública". Segredo com esse prefixo é segredo publicado.

Qual chave pode ser pública e qual nunca pode

ServiçoPode ficar no navegadorNunca no navegador
SupabaseChave anon ou publishable, desde que toda tabela tenha RLSservice_role ou chave secreta (sb_secret_…): ignora todo o RLS
FirebaseConfiguração web (apiKey, projectId), desde que as Security Rules estejam certasConta de serviço do Admin SDK (arquivo JSON)
StripeChave publicável (pk_…)Chave secreta (sk_…) e segredo de webhook
OpenAI, Anthropic e similaresNenhumaQualquer chave de API: dá para gastar a sua conta
Google MapsChave restrita por domínio e por APIChave sem restrição
E-mail (Resend, SendGrid)NenhumaQualquer chave: dá para enviar e-mail em seu nome

Como achar chaves expostas no seu app

No app publicado. Abra o site, pressione F12, vá em Sources e use a busca em todos os arquivos por service_role, sk-, sk_live, secret e key. Ou baixe o pacote e procure no terminal:

curl -s https://seu-app.com/ | grep -o '/assets/[^"]*\.js' \
  | xargs -I{} curl -s https://seu-app.com{} \
  | grep -oE '(sk-[A-Za-z0-9_-]{20,}|sk_live_[A-Za-z0-9]{20,}|service_role)'

Chaves do Supabase em formato JWT (começam com eyJ) dizem qual é o papel delas. Cole o trecho do meio, entre os dois pontos, em um decodificador de base64: se aparecer "role":"service_role", é crítico.

No repositório, inclusive no histórico. Uma chave apagada continua nos commits antigos. Ferramentas como o Gitleaks varrem todo o histórico:

gitleaks git . --verbose

A chave já vazou: o que fazer, na ordem

  1. Revogue e gere outra. No painel do serviço, antes de qualquer coisa. Considere que alguém já copiou.
  2. Confira o uso. Logs, faturamento e acessos desde a data em que a chave foi publicada.
  3. Mova a chamada para o servidor. Uma Edge Function do Supabase, uma função serverless ou o seu backend guardam a chave nova; o navegador chama essa função, que confere o usuário antes de usar a chave.
  4. Impeça a volta. Coloque uma varredura de segredos no CI, que falhe o build quando encontrar uma chave.
Supabase: as chaves secretas novas (sb_secret_…) podem ser revogadas uma a uma. Nas chaves antigas em formato JWT, trocar a service_role exige gerar um novo segredo JWT no painel, o que também invalida a chave anon e encerra as sessões dos usuários. Planeje a troca.

Limpar o histórico do git (com git filter-repo) é opcional depois da revogação: a chave antiga já não funciona, e reescrever o histórico atrapalha todo o time.

Como evitar que aconteça de novo

  • Segredo nunca com prefixo público (VITE_, NEXT_PUBLIC_).
  • Toda chamada a serviço pago passa por uma função no servidor, que confere quem está chamando e limita o uso.
  • Varredura de segredos a cada pull request (Gitleaks ou TruffleHog no CI).
  • Revisão do pacote publicado antes de cada lançamento, procurando chaves e source maps.
Auditoria Completa · R$ 22.300Quer saber se o seu sistema tem essas falhas?

A Salak testa o seu sistema com usuários de cada perfil e entrega cada falha com prova, correção recomendada e teste de regressão. Veja como funciona para sites e aplicações web.

Falar com especialistaVer a oferta
Leia também
Guia · 9 minRLS no SupabaseO que é Row Level Security, como escrever políticas e como testar sem enganar a si mesmo.Ler o guia →Guia · 5 minChecklist antes de publicar20 verificações de segurança para fazer antes do lançamento.Ler o guia →
Salak Security

Auditoria de segurança com prova, correção e verificação independente.

Soluções

Apps Lovable, Bolt e CursorSites e aplicações webAPIs e integraçõesBancos de dadosPlataformas corporativasPipeline e nuvemTodas as soluções

Método

MétodoRelatório de exemploOfertas e preçosGuiasPerguntas

Empresa

SobreParceirosTrabalhe conoscoContato

Legal

Política de privacidadeTermos de usoPolítica de cookies
Salak Security
© 2026 Salak Security. Todos os direitos reservados.Divulgação responsável de vulnerabilidades