[{"data":1,"prerenderedAt":727},["ShallowReactive",2],{"blog-pt-stripe-secret-key-in-frontend":3,"blog-index-pt":484},{"id":4,"title":5,"body":6,"category":437,"cover":438,"coverAlt":439,"description":440,"draft":441,"extension":442,"faq":443,"image":462,"keywords":463,"meta":471,"navigation":472,"ogTitle":473,"path":474,"published":475,"seo":476,"stem":477,"tldr":478,"updated":475,"__hash__":483},"blog_pt\u002Fblog\u002Fstripe-secret-key-in-frontend.md","Uma chave secreta da Stripe no frontend pode mover dinheiro",{"type":7,"value":8,"toc":425},"minimark",[9,18,33,42,47,55,58,63,68,71,75,78,182,193,203,207,210,213,219,226,229,232,236,239,273,276,281,284,287,291,294,301,304,307,311,323,332,337,340,356,360,393,396,403],[10,11,12,13,17],"p",{},"Abra seu app no ar num navegador, veja o código-fonte da página e procure por\n",[14,15,16],"code",{},"sk_live_",". Se voltar uma sequência comprida, você tem uma chave secreta da\nStripe exposta no seu frontend, e qualquer visitante que você já teve poderia\ntê-la copiado.",[10,19,20,21,25,26,29,30,32],{},"Aqui está o ponto em que o conselho geral sobre chaves de API erra: a Stripe te\ndá duas chaves ativas, elas se parecem quase por inteiro, e ",[22,23,24],"strong",{},"uma das duas\ndeve estar no seu app."," A chave que começa com ",[14,27,28],{},"pk_live_"," pertence ali. A\nchave que começa com ",[14,31,16],{}," tem, nas palavras da própria Stripe, permissões\nsem restrição sobre todas as APIs. Elas diferem por um caractere no meio de uma\nsequência comprida, e é aí que está a maior parte do motivo de isso continuar\nacontecendo.",[10,34,35,36,41],{},"Entre 12 e 14 de agosto de 2026 rodamos nove verificações externas em 30.998\napps no ar construídos com Lovable, Bolt, v0, Replit e Base44. Três deles\nentregavam uma chave secreta da Stripe ativa, e outros dois uma restrita, o que\nfaz disso uma das coisas mais raras que a varredura encontrou; essas mesmas nove\nverificações acharam uma chave de API do Google em 1.142 apps. As três chaves\nsecretas saíram com nota D, porque um único achado crítico limita a nota ali por\nmelhor que esteja todo o resto. Os números completos estão no\n",[37,38,40],"a",{"href":39},"\u002Fresearch\u002Fvibe-coded-app-security-2026","nosso relatório de escaneamento",".",[43,44,46],"h2",{"id":45},"uma-chave-secreta-da-stripe-exposta-no-frontend-é-um-problema","Uma chave secreta da Stripe exposta no frontend é um problema?",[10,48,49,50,52,53,41],{},"Sim, se a sequência começa com ",[14,51,16],{},". Não, se começa com ",[14,54,28],{},[10,56,57],{},"A Stripe emite duas chaves ativas porque as duas metades de um pagamento\nacontecem em dois lugares diferentes. Imagine o balcão de uma loja. A maquininha\nfica virada para o cliente e está parafusada à vista de todo mundo, e o pior que\num estranho consegue fazer com ela é te pagar. A caixa registradora atrás do\nbalcão é outra coisa completamente. Ela abre, guarda o dinheiro do dia, e na\ngaveta de baixo tem uma ficha de cada cliente com o endereço escrito.",[10,59,60,62],{},[14,61,28],{}," é a maquininha. O trabalho dela é montar um formulário de pagamento\ndentro do navegador de outra pessoa, e a documentação da Stripe diz que chaves\npublicáveis podem ser expostas sem problema no código do frontend.",[10,64,65,67],{},[14,66,16],{}," é a chave da caixa. A Stripe descreve as chaves secretas como tendo\npermissões sem restrição sobre todas as APIs, que é a mesma frase lida do outro\nlado: não existe nada na sua conta que ela não alcance.",[10,69,70],{},"Seu app precisa da maquininha no navegador só para conseguir cobrar. Da chave da\ncaixa ele nunca deveria precisar.",[43,72,74],{"id":73},"pk_live_-e-sk_live_-como-diferenciar","pk_live_ e sk_live_: como diferenciar",[10,76,77],{},"Leia o segundo caractere do prefixo. É esse o teste inteiro.",[79,80,81,100],"table",{},[82,83,84],"thead",{},[85,86,87,91,94,97],"tr",{},[88,89,90],"th",{},"Chave",[88,92,93],{},"Começa com",[88,95,96],{},"Segura no navegador?",[88,98,99],{},"O que faz",[101,102,103,124,143,160],"tbody",{},[85,104,105,109,114,121],{},[106,107,108],"td",{},"Publicável",[106,110,111],{},[14,112,113],{},"pk_live_…",[106,115,116],{},[117,118,120],"key-verdict",{"type":119},"safe","É o lugar dela",[106,122,123],{},"Monta o formulário de pagamento e tokeniza um cartão. Não lê clientes nem move dinheiro.",[85,125,126,129,134,140],{},[106,127,128],{},"Secreta",[106,130,131],{},[14,132,133],{},"sk_live_…",[106,135,136],{},[117,137,139],{"type":138},"danger","Nunca",[106,141,142],{},"Permissões sem restrição sobre todas as APIs da Stripe, em toda a sua conta.",[85,144,145,148,153,157],{},[106,146,147],{},"Restrita",[106,149,150],{},[14,151,152],{},"rk_live_…",[106,154,155],{},[117,156,139],{"type":138},[106,158,159],{},"Só as permissões que você marcou ao criar. Continua sendo uma credencial válida em mãos alheias.",[85,161,162,165,174,179],{},[106,163,164],{},"De teste",[106,166,167,170,171],{},[14,168,169],{},"sk_test_",", ",[14,172,173],{},"pk_test_",[106,175,176],{},[117,177,178],{"type":138},"Não",[106,180,181],{},"Toca só o seu ambiente de testes. Um problema menor com o mesmo hábito por trás.",[10,183,184,185,188,189,192],{},"O meio do prefixo é a segunda coisa a ler. ",[14,186,187],{},"_test_"," não alcança nada além do seu\nambiente de testes, então uma chave de teste vazada não te custa dinheiro; ela\nainda assim publica como a sua integração foi montada, e a orientação da Stripe\né tratar como comprometida qualquer chave secreta ou restrita vista onde não\ndeveria estar. Contas mais novas podem carregar também uma chave de organização\nque começa com ",[14,190,191],{},"sk_org_"," e opera sobre mais de uma conta da Stripe ao mesmo\ntempo. Ela segue a mesma regra, e um vazamento ali vai mais longe que uma conta\nsozinha.",[194,195,197],"callout",{"type":196},"warn",[10,198,199,202],{},[22,200,201],{},"Nada quebra quando você cola a errada."," Um checkout montado com a chave\nsecreta funciona. Os pagamentos entram, o painel enche, e o app se comporta\nexatamente como se comportaria com a chave publicável, porque a chave secreta\npode fazer tudo o que a publicável faz e bastante mais. Não existe erro para\nnotar nem aviso para fechar, e é por isso que esse achado costuma ter meses\nquando alguém finalmente o lê num escaneamento.",[43,204,206],{"id":205},"o-que-alguém-consegue-fazer-com-uma-chave-secreta-da-stripe-vazada","O que alguém consegue fazer com uma chave secreta da Stripe vazada",[10,208,209],{},"Tudo o que você faz no seu próprio painel e que não peça senha.",[10,211,212],{},"Não \"obter acesso não autorizado\". Em concreto, com nada além da sequência e um\nterminal: ler sua lista completa de clientes, com nomes, e-mails, endereços de\ncobrança e os quatro últimos dígitos de cada cartão. Ler todos os pagamentos que\nvocê já recebeu, e pelo que cada cliente pagou. Emitir reembolsos. Criar\ncobranças e links de pagamento em seu nome. Cancelar assinaturas.",[214,215],"diagram",{"alt":216,"caption":217,"src":218},"Uma grade com quatro linhas de ícones à esquerda: uma maquininha de cartão, três pessoas, duas moedas empilhadas e uma pilha de linhas de tabela. Duas colunas têm os títulos pk_live_ e sk_live_. Na coluna pk_live_ a linha da maquininha tem um tique verde e as outras três linhas têm cruzes apagadas. Na coluna sk_live_ as quatro linhas têm tiques vermelhos.","As duas chaves estão no mesmo arquivo. A segunda coluna é o que aquele caractere a mais compra, e cada tique vermelho ali é um pedido que dá certo.","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fwhat-each-key-can-do-1600x820.png",[10,220,221,222,225],{},"Depois tem o uso que não tem nada a ver com você. Sua conta vira um lugar para\nrodar ",[22,223,224],{},"card testing",", o termo da própria Stripe para um golpista que passa\nnúmeros de cartão roubados pela integração de qualquer um até achar os que ainda\nfuncionam. Os cartões são de outras pessoas. As recusas, as contestações e as\nexplicações são suas.",[10,227,228],{},"O que em geral eles não conseguem é pagar a si mesmos. Um reembolso volta para o\ncartão que fez o pagamento original, e um repasse vai para a conta bancária\ncadastrada, que é a sua. Isso soa como boa notícia e não é: significa que o dano\nchega como dinheiro seu indo embora, fichas dos seus clientes copiadas e sua\nconta usada para a fraude de outra pessoa, em vez de como uma transferência que\nvocê poderia apontar e perseguir.",[10,230,231],{},"Nada disso exige um atacante sofisticado. A documentação da própria Stripe diz\nque agentes fraudulentos varrem sem parar bases de código públicas atrás de\nchaves expostas, e esses scanners não precisam saber quem você é para achar a\nsua.",[43,233,235],{"id":234},"como-trocar-uma-chave-secreta-da-stripe-sem-derrubar-os-pagamentos","Como trocar uma chave secreta da Stripe sem derrubar os pagamentos",[10,237,238],{},"Crie primeiro a substituta, coloque no ar e só então expire a antiga. Nessa\nordem.",[240,241,242,249,255,261,267],"ol",{},[243,244,245,248],"li",{},[22,246,247],{},"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é.",[243,250,251,254],{},[22,252,253],{},"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.",[243,256,257,260],{},[22,258,259],{},"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.",[243,262,263,266],{},[22,264,265],{},"Expire a chave antiga."," A Stripe descreve assim mesmo: expirar uma chave secreta ou restrita impede que ela faça qualquer outra chamada à API.",[243,268,269,272],{},[22,270,271],{},"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ê.",[10,274,275],{},"Se a chave já está solta e você prefere perder alguns pagamentos a deixá-la\nativa por mais uma hora, faça ao contrário. Trocar uma chave bloqueia ela na\nhora e gera uma nova, e a Stripe observa que os endpoints de webhook criados com\na chave antiga continuam ativos, então seu processamento de eventos sobrevive à\nemergência.",[214,277],{"alt":278,"caption":279,"src":280},"Três painéis numerados da esquerda para a direita. No primeiro, uma janela de app se liga a uma única plaquinha de chave. No segundo apareceu uma segunda plaquinha, o app agora se liga a essa, e a primeira está desenhada apagada e sem linha. No terceiro a primeira plaquinha está riscada e sumiu, e o app fica ligado só à plaquinha nova.","A sobreposição no painel do meio é o ponto todo. As duas chaves ficam ativas ao mesmo tempo, e é isso que permite a troca sem um buraco no seu checkout.","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Frolling-the-key-1600x620.png",[10,282,283],{},"Falta um passo, e é o que a maioria faz primeiro: apagar a chave do seu código.\nFaça, e tenha clareza do que isso resolve. Seus visitantes já baixaram o arquivo\nque a carregava, esse arquivo está em caches de navegador que você não controla,\ne o valor antigo continua no seu histórico de versões. Expirar a chave na Stripe\né o que fecha a porta. Tirar a linha é o que impede você de mandar de novo.",[10,285,286],{},"Chaves publicáveis, aliás, não podem ser expiradas de jeito nenhum. A Stripe\nnunca construiu esse controle, porque aquela chave nunca foi para ser privada.",[43,288,290],{"id":289},"o-que-é-uma-chave-restrita-da-stripe-e-quando-ela-é-a-resposta","O que é uma chave restrita da Stripe, e quando ela é a resposta",[10,292,293],{},"Uma chave feita sob medida para um trabalho em vez de para todos.",[10,295,296,297,300],{},"Uma chave restrita começa com ",[14,298,299],{},"rk_live_"," e carrega apenas as permissões que você\nmarca ao criá-la. Uma chave que pode ler faturas não consegue emitir um\nreembolso. Uma chave que pode criar cobranças não consegue ler sua lista de\nclientes. A Stripe recomenda sair das chaves secretas para as restritas\nexatamente por isso, e é um bom conselho sobre o código que roda no seu\nservidor.",[10,302,303],{},"Não é um jeito de tornar aceitável uma chave no navegador. Dois dos 30.998 apps\nda nossa varredura entregavam uma chave restrita no frontend, e os dois saíram\ncom nota C. Nosso escaneamento trata uma chave restrita como achado alto onde\numa secreta é crítico, e um único achado alto limita a nota em C. Quem achar\naquela chave continua levando cada permissão que você marcou, de onde estiver.",[10,305,306],{},"Onde uma chave restrita ganha o lugar dela é no caso intermediário\ndesconfortável, e apps feitos com IA produzem bastante deles. Uma ferramenta de\nautomação que precisa ler seus repasses. Um script de relatório que alguém\nescreveu para você no Fiverr. Uma Edge Function que só cria um tipo de cobrança.\nCada um roda num servidor e cada um precisa de uma fração da sua conta, então\ncada um ganha a própria chave com aquela fração marcada, e no dia em que uma\nvazar você revoga uma chave em vez de refazer toda a fiação da sua integração.",[43,308,310],{"id":309},"como-conferir-o-que-seu-app-está-entregando-de-verdade","Como conferir o que seu app está entregando de verdade",[10,312,313,314,316,317,319,320,322],{},"Comece na mão, porque não custa nada e não precisa instalar nada. Abra seu site\nno ar, veja o código-fonte da página e procure por ",[14,315,16],{},", depois\n",[14,318,299],{},", depois ",[14,321,28],{},". Achar a terceira e não as duas primeiras é o\nresultado que você quer.",[10,324,325,326,328,329,331],{},"O que uma busca no código-fonte perde é o JavaScript que a página carrega\ndepois, e num app feito com Lovable, Bolt ou Replit isso é quase tudo. Nosso\nscanner gratuito abre seu app num navegador de verdade, espera os bundles\nchegarem e lê esses. Ele classifica o que encontra em vez de casar sequências em\nformato de chave, então ",[14,327,28],{}," volta marcada como correta e ",[14,330,16],{}," volta\ncomo achado crítico, e as duas nunca caem na mesma pilha.",[214,333],{"alt":334,"caption":335,"src":336},"A marca da Reeve sobre uma grade de nove ícones de contorno, um por verificação: uma chave, um cilindro de banco de dados, um documento, um cadeado, uma caixa com tampa, um par de colchetes de código, um globo, uma roseta de certificado e um calendário.","Chaves são uma de nove verificações somente de leitura. As outras são o motivo de uma nota dizer mais que uma busca no seu próprio código-fonte.","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fnine-checks-1600x420.png",[10,338,339],{},"A nota, a pontuação e as contagens aparecem na tela em uns 20 segundos, sem\nconta. Se você der um e-mail, vem junto a lista detalhada, com uma correção\nescrita para o builder que você usou e que dá para colar direto.",[10,341,342,343,346,347,351,352,41],{},"Três coisas que o escaneamento não faz, e são os motivos de dar para apontar ele\nsem medo para um app no ar que cobra de verdade: ele nunca faz login, nunca\nescreve nada, e nunca guarda uma chave que encontra. Um segredo exposto é\nguardado como uma dica mascarada no formato ",[14,344,345],{},"sk_live_…a1b2",", e o valor real é\njogado fora.\n",[37,348,350],{"href":349},"\u002F#scan","Escaneie seu app",", ou leia antes\n",[37,353,355],{"href":354},"\u002Fsecurity-scanner","o que cada uma das nove verificações olha",[43,357,359],{"id":358},"o-que-fazer-agora","O que fazer agora",[361,362,363],"key-takeaways",{},[364,365,366,378,381,384,387,390],"ul",{},[243,367,368,369,371,372,374,375,377],{},"Leia o segundo caractere antes de qualquer coisa. ",[14,370,28],{}," no seu bundle está certa e não pede nada; ",[14,373,16],{}," e ",[14,376,299],{}," pedem.",[243,379,380],{},"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.",[243,382,383],{},"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.",[243,385,386],{},"Mova para um servidor o que precisava daquela chave: uma Edge Function, uma rota serverless, qualquer coisa que não seja o navegador.",[243,388,389],{},"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.",[243,391,392],{},"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.",[10,394,395],{},"Uma chave da Stripe costuma chegar tarde. O app sai, roda por um tempo, e aí um\ndia você adiciona o checkout, e é esse deploy que coloca pela primeira vez uma\ncredencial de cobrança no bundle. O escaneamento que você rodou no lançamento\nera a fotografia de um app que ainda não conseguia receber dinheiro.",[10,397,398,402],{},[37,399,401],{"href":400},"\u002Fpricing","O Reeve Monitor"," foi feito para essa brecha. Ele roda as nove\nverificações de novo a cada hora em até três apps, acompanha a disponibilidade a\ncada 60 segundos, avisa você no dia em que um resultado muda em vez de esperar\nvocê olhar, e manda um relatório mensal em linguagem simples. Uma chave que\nchega ao bundle num deploy de quinta entra no escaneamento daquela hora. Custa\n$12 por mês de tabela, com sete dias grátis antes de cobrar, e a página de\npreços às vezes está abaixo do número daqui e nunca acima.",[10,404,405,406,410,411,415,416,420,421,41],{},"Se você prefere seguir por lista, o\n",[37,407,409],{"href":408},"\u002Fchecklist","checklist de segurança de 10 minutos"," cobre isso junto com as\noutras coisas que vale fechar num app recém-lançado. Para a pergunta mais ampla\nde quais chaves têm lugar num navegador, temos\n",[37,412,414],{"href":413},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","um guia para diferenciar chaves publicáveis de secretas",",\n",[37,417,419],{"href":418},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","a mesma pergunta para uma chave da OpenAI",",\ne ",[37,422,424],{"href":423},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","um censo do que 30.998 apps entregavam de verdade",{"title":426,"searchDepth":427,"depth":427,"links":428},"",3,[429,431,432,433,434,435,436],{"id":45,"depth":430,"text":46},2,{"id":73,"depth":430,"text":74},{"id":205,"depth":430,"text":206},{"id":234,"depth":430,"text":235},{"id":289,"depth":430,"text":290},{"id":309,"depth":430,"text":310},{"id":358,"depth":430,"text":359},"Noções de segurança","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcover-1200x630.png","Uma caixa registradora de loja com a gaveta do dinheiro aberta e uma chave esquecida na fechadura da frente da máquina.","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í.",false,"md",[444,447,450,453,456,459],{"q":445,"a":446},"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.",{"q":448,"a":449},"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.",{"q":451,"a":452},"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.",{"q":454,"a":455},"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.",{"q":457,"a":458},"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.",{"q":460,"a":461},"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.","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",[464,465,466,467,468,469,470],"chave secreta da stripe exposta","chave sk_live no frontend","chave da stripe vazada o que fazer","chave restrita da stripe","minha chave publicável da stripe é segura","trocar chave de api da stripe","chave da stripe no bundle javascript",{},true,"Chave secreta da Stripe exposta no seu frontend?","\u002Fblog\u002Fstripe-secret-key-in-frontend","2026-09-19",{"title":5,"description":440},"blog\u002Fstripe-secret-key-in-frontend",[479,480,481,482],"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.","g6yRv4zKXzw6TghtOfXSnSiWFnIBx6kDAZAK-l8KTgg",[485,492,498,504,510,511,517,523,529,535,541,547,553,559,565,571,577,583,589,595,601,606,611,617,623,629,635,641,647,653,659,665,671,677,683,689,694,700,706,712,717,723],{"path":486,"title":487,"description":488,"published":489,"category":490,"image":491,"draft":441},"\u002Fblog\u002Fsupabase-backup-auth-users","Por que seu dump do Supabase não tem usuários dentro","Rode supabase db dump sozinho e você recebe a forma do seu banco e nenhuma das linhas dele, sem o schema auth onde seus usuários moram.","2026-09-23","Backups","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":493,"title":494,"description":495,"published":496,"category":437,"image":497,"draft":441},"\u002Fblog\u002Fdomain-and-certificate-expiry","Domínio expirado, site fora do ar: o que acontece agora","Seu domínio expirou e seu site está fora do ar. O relógio que começa a correr, por que o certificado é o problema menor, e como conferir os dois.","2026-09-22","\u002Fblog\u002Fdomain-and-certificate-expiry\u002Fcard-800x500.png",{"path":499,"title":500,"description":501,"published":502,"category":437,"image":503,"draft":441},"\u002Fblog\u002Fis-lovable-safe","O Lovable é seguro? O que vimos em 18.554 aplicativos Lovable","O Lovable é seguro? Passamos 18.554 aplicativos Lovable no ar por nove verificações. A plataforma foi a mais limpa de cinco. Os achados estavam nos aplicativos.","2026-09-21","\u002Fblog\u002Fis-lovable-safe\u002Fcard-800x500.png",{"path":505,"title":506,"description":507,"published":508,"category":437,"image":509,"draft":441},"\u002Fblog\u002Fvibe-coded-app-security-checklist","O checklist de segurança do vibe coding, em nove verificações","Um checklist de segurança do vibe coding com nove itens, cada um verificável no seu app de fora por qualquer pessoa, e cada um com um teste de uma linha.","2026-09-20","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",{"path":474,"title":5,"description":440,"published":475,"category":437,"image":462,"draft":441},{"path":512,"title":513,"description":514,"published":515,"category":437,"image":516,"draft":441},"\u002Fblog\u002Fvite-and-next-public-env-vars","Variáveis de ambiente do Vite expostas: o prefixo diz publique isto","Variáveis de ambiente do Vite expostas no seu app: fizeram o que o prefixo pediu. VITE_ e NEXT_PUBLIC_ significam publique isto, e a IA nunca soube o custo.","2026-09-18","\u002Fblog\u002Fvite-and-next-public-env-vars\u002Fcard-800x500.png",{"path":518,"title":519,"description":520,"published":521,"category":437,"image":522,"draft":441},"\u002Fblog\u002Fbase44-source-maps","Segurança no Base44: o que um scan aponta e o que é seu para corrigir","Segurança no Base44 em 5.438 apps escaneados: três achados em quase todos são da plataforma, o source map é o selo do Base44, e a sua parte é uma lista curta.","2026-09-17","\u002Fblog\u002Fbase44-source-maps\u002Fcard-800x500.png",{"path":524,"title":525,"description":526,"published":527,"category":437,"image":528,"draft":441},"\u002Fblog\u002Fis-cursor-ai-safe","O Cursor AI é seguro? O editor, o código e o app que você publicou","O Cursor AI é seguro? Três perguntas em uma busca: o que o Cursor guarda, o que o código que ele escreve erra, e se o app que você publicou está aberto.","2026-09-16","\u002Fblog\u002Fis-cursor-ai-safe\u002Fcard-800x500.png",{"path":530,"title":531,"description":532,"published":533,"category":437,"image":534,"draft":441},"\u002Fblog\u002Fis-replit-safe","O Replit é seguro? O que vimos em 3.042 aplicativos Replit no ar","O Replit é seguro? Passamos 3.042 aplicativos Replit no ar por nove verificações externas. Os achados estavam no aplicativo publicado, não no host.","2026-09-15","\u002Fblog\u002Fis-replit-safe\u002Fcard-800x500.png",{"path":536,"title":537,"description":538,"published":539,"category":490,"image":540,"draft":441},"\u002Fblog\u002Fsupabase-storage-backup","Supabase storage backup: sua cópia do banco não tem nenhum arquivo","Um Supabase storage backup é uma tarefa à parte. Os backups do banco guardam a lista dos seus arquivos e nenhum deles, então cada upload fica quebrado.","2026-09-14","\u002Fblog\u002Fsupabase-storage-backup\u002Fcard-800x500.png",{"path":542,"title":543,"description":544,"published":545,"category":490,"image":546,"draft":441},"\u002Fblog\u002Fsupabase-point-in-time-recovery","Point-in-time recovery do Supabase: preço e limites","O point-in-time recovery do Supabase rebobina seu banco para qualquer segundo da última semana. Custa $100 por mês além do Pro e cobre só o banco.","2026-09-13","\u002Fblog\u002Fsupabase-point-in-time-recovery\u002Fcard-800x500.png",{"path":548,"title":549,"description":550,"published":551,"category":490,"image":552,"draft":441},"\u002Fblog\u002Fsupabase-project-paused-recover","Projeto Supabase pausado? Seus dados continuam lá","O Supabase pausou seu projeto depois de uma semana sem atividade. Nada foi apagado, Restaurar fica ao lado do nome e você tem um ano antes disso mudar.","2026-09-12","\u002Fblog\u002Fsupabase-project-paused-recover\u002Fcard-800x500.png",{"path":554,"title":555,"description":556,"published":557,"category":437,"image":558,"draft":441},"\u002Fblog\u002Fsafest-ai-app-builder","Qual builder de apps com IA é mais seguro? 30.998 apps testados","Qual builder de apps com IA é mais seguro? Escaneamos 30.998 apps no ar do Lovable, Base44, Replit, v0 e Bolt. O builder não é o que decide sua nota.","2026-09-11","\u002Fblog\u002Fsafest-ai-app-builder\u002Fcard-800x500.png",{"path":560,"title":561,"description":562,"published":563,"category":437,"image":564,"draft":441},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Ative Row Level Security em toda tabela do Supabase e comprove","Ativar Row Level Security no Supabase sem política fecha a tabela por completo. Uma política sem a chave ligada não faz nada. Aqui está o SQL, e o teste.","2026-09-10","\u002Fblog\u002Fenable-rls-on-every-supabase-table\u002Fcard-800x500.png",{"path":566,"title":567,"description":568,"published":569,"category":437,"image":570,"draft":441},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","Supabase \"RLS disabled in public\": o que o aviso não vê","O Supabase marca \"RLS disabled in public\" como erro. Ele não diz nada sobre a política de leitura que deixa a sua tabela igualmente aberta.","2026-09-09","\u002Fblog\u002Fsupabase-rls-disabled-in-public\u002Fcard-800x500.png",{"path":572,"title":573,"description":574,"published":575,"category":437,"image":576,"draft":441},"\u002Fblog\u002Frotate-supabase-service-role-key","Como rotacionar uma chave service_role do Supabase vazada","O Supabase manda fechar o vazamento primeiro. Outros guias mandam rotacionar agora. O que vale depende de para onde a sua chave service_role vazou.","2026-09-08","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",{"path":578,"title":579,"description":580,"published":581,"category":437,"image":582,"draft":441},"\u002Fblog\u002Fvibe-coding-security-scanners-compared","Scanners de segurança para vibe coding comparados, o nosso incluído","O melhor scanner de segurança para vibe coding depende de três perguntas que nenhuma lista de recursos responde. Dez ferramentas comparadas, com preços.","2026-09-07","\u002Fblog\u002Fvibe-coding-security-scanners-compared\u002Fcard-800x500.png",{"path":584,"title":585,"description":586,"published":587,"category":437,"image":588,"draft":441},"\u002Fblog\u002Fsupabase-security-checker","Supabase security checker: faça você mesmo as cinco verificações","Um Supabase security checker lê o seu app publicado em vez das configurações do projeto. Aqui estão as cinco verificações e como fazer cada uma sozinho.","2026-09-06","\u002Fblog\u002Fsupabase-security-checker\u002Fcard-800x500.png",{"path":590,"title":591,"description":592,"published":593,"category":437,"image":594,"draft":441},"\u002Fblog\u002Fvibe-coding-security-scanner","Scanner de segurança para vibe coding: o que ele não vê","Um scanner de segurança para vibe coding lê seu app no ar, de fora. O que isso cobre, as quatro coisas que ele não consegue ver e como ler o resultado.","2026-09-05","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",{"path":596,"title":597,"description":598,"published":599,"category":437,"image":600,"draft":441},"\u002Fblog\u002Fmissing-security-headers","Cabeçalhos de segurança faltando: quando isso importa","Cabeçalhos de segurança faltando é o achado que nosso scanner mais imprime. Contra o que eles protegem e quando são a linha menos urgente do relatório.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":418,"title":602,"description":603,"published":604,"category":437,"image":605,"draft":441},"Sua chave de API da OpenAI está exposta no frontend. Troque-a.","Uma chave de API da OpenAI exposta no frontend não pode ser presa a um domínio. Troque-a hoje, mova a chamada para o seu servidor e limite o gasto.","2026-09-03","\u002Fblog\u002Fopenai-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":423,"title":607,"description":608,"published":609,"category":437,"image":610,"draft":441},"Chave de API exposta no frontend: o que 30.998 apps entregam","Uma chave de API exposta no seu frontend costuma ser uma chave do Google Maps. Escaneamos 30.998 apps vibe-coded e contamos quais segredos vazam de verdade.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":612,"title":613,"description":614,"published":615,"category":490,"image":616,"draft":441},"\u002Fblog\u002Fsupabase-backup-tools-compared","Ferramentas de backup do Supabase comparadas, a nossa incluída","Quatro tipos de ferramenta de backup do Supabase, o que cada uma copia de verdade e quando uma GitHub Action gratuita ganha de pagar, nós inclusive.","2026-09-01","\u002Fblog\u002Fsupabase-backup-tools-compared\u002Fcard-800x500.png",{"path":618,"title":619,"description":620,"published":621,"category":437,"image":622,"draft":441},"\u002Fblog\u002Freplit-secrets-explained","Como usar secrets no Replit, e o que ainda assim é publicado","Como usar secrets no Replit: adicionar um, ler de volta e resolver as duas causas do undefined. E as chaves que a ferramenta Secrets não consegue proteger.","2026-08-31","\u002Fblog\u002Freplit-secrets-explained\u002Fcard-800x500.png",{"path":624,"title":625,"description":626,"published":627,"category":490,"image":628,"draft":441},"\u002Fblog\u002Fback-up-supabase-free-tier","Backups do plano gratuito do Supabase: como fazer sem terminal","No plano gratuito do Supabase não existe backup nenhum: a cópia é você que faz. Como fazer uma pelo painel e o que a rota do CSV deixa para trás.","2026-08-30","\u002Fblog\u002Fback-up-supabase-free-tier\u002Fcard-800x500.png",{"path":630,"title":631,"description":632,"published":633,"category":437,"image":634,"draft":441},"\u002Fblog\u002Fis-supabase-secure","O Supabase é seguro? É. Seu projeto é outra pergunta","O Supabase é seguro? A plataforma é auditada, criptografada e passa por pentests. A documentação deles diz onde isso termina e começam suas configurações.","2026-08-29","\u002Fblog\u002Fis-supabase-secure\u002Fcard-800x500.png",{"path":636,"title":637,"description":638,"published":639,"category":437,"image":640,"draft":441},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Onde ficam as chaves de API do Supabase: anon, service_role e URL","A URL do projeto, a chave anon e a chave service_role ficam todas numa página do painel. Aqui está onde ela fica, e qual dos quatro valores vai no seu app.","2026-08-28","\u002Fblog\u002Fwhere-to-find-supabase-api-keys\u002Fcard-800x500.png",{"path":642,"title":643,"description":644,"published":645,"category":437,"image":646,"draft":441},"\u002Fblog\u002Fnew-row-violates-row-level-security-policy","New row violates row-level security policy no Supabase. E agora?","\"New row violates row-level security policy\" significa que o Supabase recusou uma escrita. O conserto rápido reabre a tabela para qualquer um.","2026-08-27","\u002Fblog\u002Fnew-row-violates-row-level-security-policy\u002Fcard-800x500.png",{"path":648,"title":649,"description":650,"published":651,"category":437,"image":652,"draft":441},"\u002Fblog\u002Fcors-wildcard-security-risk","Um curinga CORS é um risco de segurança? Quase nunca.","Um curinga CORS é um risco de segurança? Em geral é o padrão do seu builder e não entrega nada que o seu servidor já não desse a qualquer um que pedisse.","2026-08-26","\u002Fblog\u002Fcors-wildcard-security-risk\u002Fcard-800x500.png",{"path":654,"title":655,"description":656,"published":657,"category":490,"image":658,"draft":441},"\u002Fblog\u002Fsupabase-branching-is-not-a-backup","Branching do Supabase não é backup. Ele só anda para a frente.","Por que o branching do Supabase não é backup: um branch começa sem os seus dados e um merge só leva o esquema. Para que ele serve e o que usar no lugar.","2026-08-25","\u002Fblog\u002Fsupabase-branching-is-not-a-backup\u002Fcard-800x500.png",{"path":660,"title":661,"description":662,"published":663,"category":490,"image":664,"draft":441},"\u002Fblog\u002Fhow-to-restore-a-supabase-backup","Como restaurar um backup do Supabase, e o que quebra depois","Como restaurar um backup do Supabase pelo painel ou por um arquivo de dump, o que a restauração substitui e por que o seu app pode continuar quebrado no fim.","2026-08-24","\u002Fblog\u002Fhow-to-restore-a-supabase-backup\u002Fcard-800x500.png",{"path":666,"title":667,"description":668,"published":669,"category":437,"image":670,"draft":441},"\u002Fblog\u002Fsupabase-storage-bucket-public","Seu bucket do Supabase Storage é público. Isso é um problema?","Um bucket público do Supabase Storage significa que quem tem a URL de um arquivo pode abri-lo. Não significa que alguém possa listar o que está lá dentro.","2026-08-23","\u002Fblog\u002Fsupabase-storage-bucket-public\u002Fcard-800x500.png",{"path":672,"title":673,"description":674,"published":675,"category":437,"image":676,"draft":441},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","Uma chave de API do Google no frontend é um problema?","Uma chave de API do Google exposta no seu frontend é a chave que nosso scanner mais encontra, e quase sempre está tudo bem. Um ajuste gratuito decide isso.","2026-08-22","\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend\u002Fcard-800x500.png",{"path":678,"title":679,"description":680,"published":681,"category":490,"image":682,"draft":441},"\u002Fblog\u002Fai-agent-deleted-my-database","Um agente de IA apagou meus dados do Supabase. O que eu recupero?","Um agente de IA apagou dados do seu banco. O que você recupera já estava decidido antes de ele rodar, e os próximos minutos decidem o resto.","2026-08-21","\u002Fblog\u002Fai-agent-deleted-my-database\u002Fcard-800x500.png",{"path":684,"title":685,"description":686,"published":687,"category":437,"image":688,"draft":441},"\u002Fblog\u002Fcan-anyone-read-your-supabase-database","Qualquer um consegue ler seu banco Supabase? Testamos 3.680 apps","Qualquer um consegue ler seu banco de dados Supabase sem fazer login? Escaneamos 30.998 apps no ar criadas com builders de IA e medimos quantas dizem que sim.","2026-08-18","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",{"path":690,"title":691,"description":692,"published":687,"category":437,"image":693,"draft":441},"\u002Fblog\u002Fsource-maps-exposed-in-production","Source maps expostos: seu app está publicando o código original","Um source map exposto deixa qualquer um ler o código original do seu app, comentários incluídos. A verificação de 30 segundos e o que importa de verdade.","\u002Fblog\u002Fsource-maps-exposed-in-production\u002Fcard-800x500.png",{"path":695,"title":696,"description":697,"published":698,"category":437,"image":699,"draft":441},"\u002Fblog\u002Fsupabase-new-api-keys","As novas chaves de API do Supabase: qual vai no seu app?","O Supabase trocou anon e service_role por chaves publicáveis e secretas. Qual delas pertence ao seu app e qual nunca deve estar lá?","2026-08-12","\u002Fblog\u002Fsupabase-new-api-keys\u002Fcard-800x500.png",{"path":701,"title":702,"description":703,"published":704,"category":490,"image":705,"draft":441},"\u002Fblog\u002Fdoes-supabase-back-up-my-database","O Supabase faz backup do meu banco de dados? Depende do plano.","O Supabase faz backup do seu banco de dados? Todo dia nos planos pagos, e nada no gratuito. Como descobrir o que você tem e o que essa cópia não cobre.","2026-08-11","\u002Fblog\u002Fdoes-supabase-back-up-my-database\u002Fcard-800x500.png",{"path":707,"title":708,"description":709,"published":710,"category":437,"image":711,"draft":441},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","O Supabase Row Level Security está ligado. A tabela continua pública.","Ligar o Supabase Row Level Security não protege uma tabela. Quem protege são as políticas, e a que consertou o seu app pode deixar qualquer um entrar.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":713,"title":714,"description":715,"published":710,"category":490,"image":716,"draft":441},"\u002Fblog\u002Fversion-history-is-not-a-backup","O histórico de versões não é backup. Ele não desfaz um delete.","Lovable e Bolt guardam um histórico de versões do seu código. Seu banco de dados é um serviço à parte, e voltar atrás não traz os seus dados de volta.","\u002Fblog\u002Fversion-history-is-not-a-backup\u002Fcard-800x500.png",{"path":718,"title":719,"description":720,"published":721,"category":490,"image":722,"draft":441},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Três formas de fazer backup de um banco Supabase, e o que falta","O painel, o pg_dump e um serviço gerenciado. O que cada um salva de verdade, o que deixa de fora sem avisar e qual sobrevive a perder a conta.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":413,"title":724,"description":725,"published":721,"category":437,"image":726,"draft":441},"Quais chaves de API são seguras no navegador e quais não são","Sua chave anon do Supabase foi feita para ser pública. Sua chave service_role não, e ela ignora todas as regras que você criar. Como diferenciar as duas.","\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend\u002Fcard-800x500.png",1790150954256]