Noções de segurança
Uma chave secreta da Stripe no frontend pode mover dinheiro
Uma chave secreta da Stripe exposta no seu frontend pode reembolsar, cobrar e ler cada ficha de cliente que você tem. Sua chave pk_live_ é que deve estar aí.

Em resumo
- Uma chave secreta da Stripe exposta no seu frontend é o vazamento que é cobrado da sua conta: reembolsos, cobranças novas e cada ficha de cliente que você tem.
- pk_live_ pertence ao seu app e sempre pertenceu. sk_live_ difere dela por um caractere e tem permissões sem restrição sobre toda a sua conta na Stripe.
- Crie primeiro a chave substituta, coloque no ar e só então expire a antiga. Apagar a linha do seu código não traz de volta nada que alguém já baixou.
- Encontramos uma chave secreta da Stripe ativa em 3 de 30.998 apps escaneados. Os três saíram com nota D.
Abra seu app no ar num navegador, veja o código-fonte da página e procure por
sk_live_. Se voltar uma sequência comprida, você tem uma chave secreta da
Stripe exposta no seu frontend, e qualquer visitante que você já teve poderia
tê-la copiado.
Aqui está o ponto em que o conselho geral sobre chaves de API erra: a Stripe te
dá duas chaves ativas, elas se parecem quase por inteiro, e uma das duas
deve estar no seu app. A chave que começa com pk_live_ pertence ali. A
chave que começa com sk_live_ tem, nas palavras da própria Stripe, permissões
sem restrição sobre todas as APIs. Elas diferem por um caractere no meio de uma
sequência comprida, e é aí que está a maior parte do motivo de isso continuar
acontecendo.
Entre 12 e 14 de agosto de 2026 rodamos nove verificações externas em 30.998 apps no ar construídos com Lovable, Bolt, v0, Replit e Base44. Três deles entregavam uma chave secreta da Stripe ativa, e outros dois uma restrita, o que faz disso uma das coisas mais raras que a varredura encontrou; essas mesmas nove verificações acharam uma chave de API do Google em 1.142 apps. As três chaves secretas saíram com nota D, porque um único achado crítico limita a nota ali por melhor que esteja todo o resto. Os números completos estão no nosso relatório de escaneamento.
Uma chave secreta da Stripe exposta no frontend é um problema?
Sim, se a sequência começa com sk_live_. Não, se começa com pk_live_.
A Stripe emite duas chaves ativas porque as duas metades de um pagamento acontecem em dois lugares diferentes. Imagine o balcão de uma loja. A maquininha fica virada para o cliente e está parafusada à vista de todo mundo, e o pior que um estranho consegue fazer com ela é te pagar. A caixa registradora atrás do balcão é outra coisa completamente. Ela abre, guarda o dinheiro do dia, e na gaveta de baixo tem uma ficha de cada cliente com o endereço escrito.
pk_live_ é a maquininha. O trabalho dela é montar um formulário de pagamento
dentro do navegador de outra pessoa, e a documentação da Stripe diz que chaves
publicáveis podem ser expostas sem problema no código do frontend.
sk_live_ é a chave da caixa. A Stripe descreve as chaves secretas como tendo
permissões sem restrição sobre todas as APIs, que é a mesma frase lida do outro
lado: não existe nada na sua conta que ela não alcance.
Seu app precisa da maquininha no navegador só para conseguir cobrar. Da chave da caixa ele nunca deveria precisar.
pk_live_ e sk_live_: como diferenciar
Leia o segundo caractere do prefixo. É esse o teste inteiro.
| Chave | Começa com | Segura no navegador? | O que faz |
|---|---|---|---|
| Publicável | pk_live_… | É o lugar dela | Monta o formulário de pagamento e tokeniza um cartão. Não lê clientes nem move dinheiro. |
| Secreta | sk_live_… | Nunca | Permissões sem restrição sobre todas as APIs da Stripe, em toda a sua conta. |
| Restrita | rk_live_… | Nunca | Só as permissões que você marcou ao criar. Continua sendo uma credencial válida em mãos alheias. |
| De teste | sk_test_, pk_test_ | Não | Toca só o seu ambiente de testes. Um problema menor com o mesmo hábito por trás. |
O meio do prefixo é a segunda coisa a ler. _test_ não alcança nada além do seu
ambiente de testes, então uma chave de teste vazada não te custa dinheiro; ela
ainda assim publica como a sua integração foi montada, e a orientação da Stripe
é tratar como comprometida qualquer chave secreta ou restrita vista onde não
deveria estar. Contas mais novas podem carregar também uma chave de organização
que começa com sk_org_ e opera sobre mais de uma conta da Stripe ao mesmo
tempo. Ela segue a mesma regra, e um vazamento ali vai mais longe que uma conta
sozinha.
O que alguém consegue fazer com uma chave secreta da Stripe vazada
Tudo o que você faz no seu próprio painel e que não peça senha.
Não "obter acesso não autorizado". Em concreto, com nada além da sequência e um terminal: ler sua lista completa de clientes, com nomes, e-mails, endereços de cobrança e os quatro últimos dígitos de cada cartão. Ler todos os pagamentos que você já recebeu, e pelo que cada cliente pagou. Emitir reembolsos. Criar cobranças e links de pagamento em seu nome. Cancelar assinaturas.
Depois tem o uso que não tem nada a ver com você. Sua conta vira um lugar para rodar card testing, o termo da própria Stripe para um golpista que passa números de cartão roubados pela integração de qualquer um até achar os que ainda funcionam. Os cartões são de outras pessoas. As recusas, as contestações e as explicações são suas.
O que em geral eles não conseguem é pagar a si mesmos. Um reembolso volta para o cartão que fez o pagamento original, e um repasse vai para a conta bancária cadastrada, que é a sua. Isso soa como boa notícia e não é: significa que o dano chega como dinheiro seu indo embora, fichas dos seus clientes copiadas e sua conta usada para a fraude de outra pessoa, em vez de como uma transferência que você poderia apontar e perseguir.
Nada disso exige um atacante sofisticado. A documentação da própria Stripe diz que agentes fraudulentos varrem sem parar bases de código públicas atrás de chaves expostas, e esses scanners não precisam saber quem você é para achar a sua.
Como trocar uma chave secreta da Stripe sem derrubar os pagamentos
Crie primeiro a substituta, coloque no ar e só então expire a antiga. Nessa ordem.
- No painel da Stripe, crie uma chave secreta nova. Deixe a antiga em paz por enquanto; as duas funcionam ao mesmo tempo, e é essa sobreposição que mantém seu checkout de pé.
- Coloque a chave nova onde a antiga morava, e isso deve ser um servidor, uma Edge Function ou uma rota serverless. Nunca o app que o navegador baixa.
- Faça o deploy e então receba um pagamento real. Uma cobrança que dá certo é a única prova de que a chave nova está ligada direito.
- Expire a chave antiga. A Stripe descreve assim mesmo: expirar uma chave secreta ou restrita impede que ela faça qualquer outra chamada à API.
- Leia seu histórico de pagamentos do período em que a chave ficou exposta, e seus e-mails da Stripe atrás de qualquer coisa que não foi você.
Se a chave já está solta e você prefere perder alguns pagamentos a deixá-la ativa por mais uma hora, faça ao contrário. Trocar uma chave bloqueia ela na hora e gera uma nova, e a Stripe observa que os endpoints de webhook criados com a chave antiga continuam ativos, então seu processamento de eventos sobrevive à emergência.
Falta um passo, e é o que a maioria faz primeiro: apagar a chave do seu código. Faça, e tenha clareza do que isso resolve. Seus visitantes já baixaram o arquivo que a carregava, esse arquivo está em caches de navegador que você não controla, e o valor antigo continua no seu histórico de versões. Expirar a chave na Stripe é o que fecha a porta. Tirar a linha é o que impede você de mandar de novo.
Chaves publicáveis, aliás, não podem ser expiradas de jeito nenhum. A Stripe nunca construiu esse controle, porque aquela chave nunca foi para ser privada.
O que é uma chave restrita da Stripe, e quando ela é a resposta
Uma chave feita sob medida para um trabalho em vez de para todos.
Uma chave restrita começa com rk_live_ e carrega apenas as permissões que você
marca ao criá-la. Uma chave que pode ler faturas não consegue emitir um
reembolso. Uma chave que pode criar cobranças não consegue ler sua lista de
clientes. A Stripe recomenda sair das chaves secretas para as restritas
exatamente por isso, e é um bom conselho sobre o código que roda no seu
servidor.
Não é um jeito de tornar aceitável uma chave no navegador. Dois dos 30.998 apps da nossa varredura entregavam uma chave restrita no frontend, e os dois saíram com nota C. Nosso escaneamento trata uma chave restrita como achado alto onde uma secreta é crítico, e um único achado alto limita a nota em C. Quem achar aquela chave continua levando cada permissão que você marcou, de onde estiver.
Onde uma chave restrita ganha o lugar dela é no caso intermediário desconfortável, e apps feitos com IA produzem bastante deles. Uma ferramenta de automação que precisa ler seus repasses. Um script de relatório que alguém escreveu para você no Fiverr. Uma Edge Function que só cria um tipo de cobrança. Cada um roda num servidor e cada um precisa de uma fração da sua conta, então cada um ganha a própria chave com aquela fração marcada, e no dia em que uma vazar você revoga uma chave em vez de refazer toda a fiação da sua integração.
Como conferir o que seu app está entregando de verdade
Comece na mão, porque não custa nada e não precisa instalar nada. Abra seu site
no ar, veja o código-fonte da página e procure por sk_live_, depois
rk_live_, depois pk_live_. Achar a terceira e não as duas primeiras é o
resultado que você quer.
O que uma busca no código-fonte perde é o JavaScript que a página carrega
depois, e num app feito com Lovable, Bolt ou Replit isso é quase tudo. Nosso
scanner gratuito abre seu app num navegador de verdade, espera os bundles
chegarem e lê esses. Ele classifica o que encontra em vez de casar sequências em
formato de chave, então pk_live_ volta marcada como correta e sk_live_ volta
como achado crítico, e as duas nunca caem na mesma pilha.
A nota, a pontuação e as contagens aparecem na tela em uns 20 segundos, sem conta. Se você der um e-mail, vem junto a lista detalhada, com uma correção escrita para o builder que você usou e que dá para colar direto.
Três coisas que o escaneamento não faz, e são os motivos de dar para apontar ele
sem medo para um app no ar que cobra de verdade: ele nunca faz login, nunca
escreve nada, e nunca guarda uma chave que encontra. Um segredo exposto é
guardado como uma dica mascarada no formato sk_live_…a1b2, e o valor real é
jogado fora.
Escaneie seu app, ou leia antes
o que cada uma das nove verificações olha.
O que fazer agora
O que fazer
- Leia o segundo caractere antes de qualquer coisa.
pk_live_no seu bundle está certa e não pede nada;sk_live_erk_live_pedem. - Crie primeiro a chave substituta e confirme um pagamento real com ela, e só então expire a antiga na Stripe. Expirar é o que fecha a porta.
- Apagar a chave do seu código não fecha nada sozinho. O arquivo que a carregava já foi baixado, está em cache e está no seu histórico de versões.
- Mova para um servidor o que precisava daquela chave: uma Edge Function, uma rota serverless, qualquer coisa que não seja o navegador.
- Leia seu histórico de pagamentos e sua lista de clientes do período em que a chave ficou ativa. A troca interrompe o que vem a seguir e não diz nada sobre o que já aconteceu.
- Dê a cada tarefa do servidor a própria chave restrita com só as permissões de que ela precisa, para o próximo vazamento custar uma chave e não todas.
Uma chave da Stripe costuma chegar tarde. O app sai, roda por um tempo, e aí um dia você adiciona o checkout, e é esse deploy que coloca pela primeira vez uma credencial de cobrança no bundle. O escaneamento que você rodou no lançamento era a fotografia de um app que ainda não conseguia receber dinheiro.
O Reeve Monitor foi feito para essa brecha. Ele roda as nove verificações de novo a cada hora em até três apps, acompanha a disponibilidade a cada 60 segundos, avisa você no dia em que um resultado muda em vez de esperar você olhar, e manda um relatório mensal em linguagem simples. Uma chave que chega ao bundle num deploy de quinta entra no escaneamento daquela hora. Custa $12 por mês de tabela, com sete dias grátis antes de cobrar, e a página de preços às vezes está abaixo do número daqui e nunca acima.
Se você prefere seguir por lista, o checklist de segurança de 10 minutos cobre isso junto com as outras coisas que vale fechar num app recém-lançado. Para a pergunta mais ampla de quais chaves têm lugar num navegador, temos um guia para diferenciar chaves publicáveis de secretas, a mesma pergunta para uma chave da OpenAI, e um censo do que 30.998 apps entregavam de verdade.
Perguntas frequentes
Minha chave publicável da Stripe é segura no frontend?
É. Uma chave que começa com pk_live_ deve estar na página, e a Stripe diz isso na própria documentação: chaves publicáveis podem ser expostas sem problema no código do frontend. Ela monta o formulário de pagamento e tokeniza um cartão. Não consegue ler seus clientes, mover dinheiro nem reembolsar nada. Se um scanner ou um conhecido disse que você tem uma chave da Stripe exposta, leia o segundo caractere antes de fazer qualquer outra coisa, porque uma chave pk_live_ dentro do seu bundle é a sua integração funcionando exatamente como a Stripe projetou.
O que alguém consegue fazer com uma chave secreta da Stripe vazada?
Tudo o que você faz no seu próprio painel e que não peça senha. Dá para ler sua lista completa de clientes com nomes, e-mails, endereços de cobrança e os quatro últimos dígitos de cada cartão, ler todos os pagamentos que você já recebeu, emitir reembolsos até esvaziar seu saldo, criar cobranças e links de pagamento, e passar números de cartão roubados pela sua conta para achar os que ainda funcionam. Esse último a Stripe chama de card testing, e ele chega até você como contestações e recusas numa conta que você achava tranquila.
Como troco uma chave da Stripe sem parar os pagamentos?
Crie primeiro a substituta. No painel da Stripe, crie uma chave secreta nova, coloque onde a antiga morava no seu servidor, faça o deploy e confirme um pagamento real com a chave nova. Só então expire a antiga, o que impede qualquer outra chamada à API. Se a chave já está pública e você prefere perder alguns pagamentos a deixá-la ativa, troque na hora: a troca bloqueia a chave imediatamente e gera uma nova, e a Stripe observa que os endpoints de webhook criados com a chave antiga continuam ativos.
O que é uma chave restrita da Stripe?
Uma chave feita sob medida para um único trabalho. Uma chave restrita começa com rk_live_ e carrega apenas as permissões que você marca ao criá-la, então uma chave que pode ler faturas não consegue emitir um reembolso. A Stripe recomenda sair das chaves secretas para as restritas exatamente por isso. Leia como um conselho sobre o código do seu servidor, não como um jeito de tornar aceitável uma chave no navegador: uma chave restrita dentro do seu bundle continua sendo uma credencial que um estranho pode usar, e nosso escaneamento a classifica como achado alto.
A Stripe me avisa se minha chave vazar?
Às vezes, e você não pode contar com isso. A Stripe diz que varre a internet de forma ativa atrás de chaves de API vazadas, com ferramentas como o scanner de tokens do GitHub, e que pode avisar você ou desativar uma chave que encontrar. A própria página de boas práticas acrescenta que a detecção não é garantida. Essa varredura funciona melhor em repositórios de código públicos, e uma chave compilada dentro do JavaScript do seu próprio domínio não é um repositório. Trate como comprometida qualquer chave que você viu onde ela não deveria estar, tendo a Stripe dito algo ou não.
Uma chave de teste (sk_test_) é perigosa no meu frontend?
É um problema bem menor que o de uma chave ativa e mesmo assim vale fechar. Uma chave de teste toca só o seu ambiente de testes, então ninguém leva seu dinheiro com ela. O que ela entrega é um mapa funcional de como a sua integração está montada, e costuma significar que o mesmo hábito de copiar e colar está a um deploy de mandar a chave ativa. A Stripe trata como comprometida qualquer chave secreta ou restrita vista onde não deveria estar. Expire e mova a chamada para um servidor.