[{"data":1,"prerenderedAt":664},["ShallowReactive",2],{"blog-pt-rotate-supabase-service-role-key":3,"blog-index-pt":423},{"id":4,"title":5,"body":6,"category":380,"cover":381,"coverAlt":382,"description":383,"draft":384,"extension":385,"faq":386,"image":401,"keywords":402,"meta":411,"navigation":412,"ogTitle":413,"path":414,"published":415,"seo":416,"stem":417,"tldr":418,"updated":415,"__hash__":422},"blog_pt\u002Fblog\u002Frotate-supabase-service-role-key.md","Como rotacionar uma chave service_role do Supabase vazada",{"type":7,"value":8,"toc":365},"minimark",[9,24,27,30,33,41,52,55,70,81,85,88,95,101,104,110,114,120,123,148,151,154,161,170,176,206,218,223,231,241,245,248,265,275,281,285,288,291,294,304,308,311,314,320,324,355],[10,11,12,13,17,18,23],"p",{},"Alguém disse que a sua chave ",[14,15,16],"code",{},"service_role"," do Supabase está no seu app, onde\nqualquer um consegue ler. Antes de mudar qualquer coisa, tenha certeza de que é\nessa mesma a chave que encontraram: ",[19,20,22],"a",{"href":21},"\u002F#scan","nosso scan gratuito"," lê o seu site\nno ar do jeito que um estranho leria e diz qual chave do Supabase ele realmente\nenxerga ali. Sem conta e sem instalar nada.",[10,25,26],{},"O conselho que vem depois de um achado desses é quase sempre uma palavra só:\nrotacione. Aí você vai procurar como se faz, e as fontes se contradizem. A\nprópria documentação do Supabase abre o guia de rotação mandando corrigir a causa\ndo vazamento antes de começar. Meia dúzia de guias de terceiros manda rotacionar\nna hora e perguntar depois.",[10,28,29],{},"Esta é a parte que nenhum dos dois escreve: os dois estão certos, para situações\ndiferentes, e a pergunta que separa uma da outra é para onde a chave vazou.",[10,31,32],{},"Uma coisa para deixar clara antes de tudo. Apagar a chave do seu código tira a\nsua própria cópia do chaveiro. Rotacionar troca a fechadura. Só a segunda alcança\nas cópias que outras pessoas já têm.",[34,35,37,38,40],"h2",{"id":36},"é-mesmo-a-chave-service_role","É mesmo a chave ",[14,39,16],{},"?",[10,42,43,44,47,48,51],{},"Num projeto novo os primeiros caracteres respondem. ",[14,45,46],{},"sb_secret_"," no começo é a\nsecreta. ",[14,49,50],{},"sb_publishable_"," é a chave que deve estar no seu app, e encontrar ela\nali não é achado nenhum.",[10,53,54],{},"Tenha certeza antes de fazer qualquer coisa drástica, porque a chave que aparece\nnum app feito com vibe coding costuma ser justamente a que pertence àquele lugar.",[10,56,57,58,61,62,64,65,69],{},"Projetos mais antigos entregam outro par, ",[14,59,60],{},"anon"," e ",[14,63,16],{},", e as duas são\nquase idênticas: mesmo formato, mesmo tamanho, nenhum prefixo para ler. A seção\ndo meio de uma dessas chaves não é criptografada. Ela decodifica em algumas\nlinhas de texto simples, e uma delas informa o papel.\n",[19,66,68],{"href":67},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quais chaves de API são seguras no frontend","\npercorre as duas verificações.",[10,71,72,73,75,76,80],{},"O motivo para ter certeza é que isso é mais raro do que os avisos sugerem.\nEscaneamos 30.998 apps feitos com vibe coding em agosto de 2026 e encontramos\numa chave ",[14,74,16],{}," publicada em 3 deles. Uma chave de API do Google, que\ncostuma ser inofensiva e muitas vezes fica restrita a um domínio, apareceu em\n1.142. ",[19,77,79],{"href":78},"\u002Fresearch\u002Fvibe-coded-app-security-2026","A contagem completa está aqui",".",[34,82,84],{"id":83},"rotacionar-primeiro-ou-fechar-o-vazamento-primeiro","Rotacionar primeiro ou fechar o vazamento primeiro?",[10,86,87],{},"Depende de a chave já ser pública, e a linha entre os dois casos é limpa.",[10,89,90,94],{},[91,92,93],"strong",{},"Se a chave está no JavaScript que os seus visitantes baixam, ela já é\npública."," Qualquer pessoa que carregou o seu site enquanto ela estava ativa tem\numa cópia, e todo crawler automático que estava atrás exatamente dessa sequência\ntambém tem. Nada do que você mudar no código alcança essas cópias. Rotacione\nprimeiro, depois feche a origem.",[10,96,97,100],{},[91,98,99],{},"Se ela só chegou a um repositório privado, um arquivo de log, uma variável de\nCI ou uma conversa, a exposição é limitada."," Se aqui você rotacionar primeiro,\nvai fazer isso duas vezes, porque o próximo deploy empurra o valor antigo de\nvolta para fora de onde quer que ele venha e a chave nova sai atrás da antiga.\nFeche a origem e depois rotacione.",[10,102,103],{},"O guia do Supabase foi escrito para o segundo caso. Os guias apressados foram\nescritos para o primeiro. Se você está lendo isto porque um scanner achou a\nchave na sua URL no ar, você está no primeiro caso.",[105,106],"diagram",{"alt":107,"caption":108,"src":109},"Duas faixas. A de cima começa numa janela de navegador e passa pelo passo um, uma chave com uma seta de rotação, e depois pelo passo dois, um par de sinais de maior e menor. A de baixo começa num arquivo e percorre os mesmos dois passos na ordem inversa, primeiro os sinais e depois a chave.","As mesmas duas tarefas, na ordem invertida. O que decide é se a cópia vazada já está solta pelo mundo.","\u002Fblog\u002Frotate-supabase-service-role-key\u002Ftwo-orders-1600x640.png",[34,111,113],{"id":112},"como-rotacionar-uma-chave-secreta-do-supabase","Como rotacionar uma chave secreta do Supabase",[10,115,116,117,119],{},"Se o seu projeto tem chaves ",[14,118,46],{},", isso se resolve no painel e sem\nindisponibilidade.",[10,121,122],{},"Um projeto pode manter mais de uma chave secreta ao mesmo tempo, cada uma com o\nseu nome, e é isso que deixa a operação segura: você adiciona a nova antes de\ntirar a antiga, então no meio do caminho nada fica quebrado.",[124,125,126,134,142,145],"ol",{},[127,128,129,130,133],"li",{},"Abra o projeto, vá em ",[91,131,132],{},"Settings → API Keys"," e crie uma chave secreta nova.",[127,135,136,137,141],{},"Coloque ela em todo lugar onde a antiga era usada, e tudo isso deveria estar\nnum servidor: edge functions, webhooks, jobs agendados, um backend seu.\n",[19,138,140],{"href":139},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","Onde esses valores ficam"," se você\nnunca abriu essa página.",[127,143,144],{},"Faça o deploy e depois passe pelas partes do app que leem e escrevem dados.\nUma chave secreta errada falha alto e na hora, que é o caso bom.",[127,146,147],{},"Só então apague a chave comprometida.",[10,149,150],{},"O passo 4 é permanente. O Supabase apaga uma chave secreta de verdade: sem\ndesfazer, sem religar, sem cópia guardada que você possa buscar. É por isso que\nele vem por último.",[10,152,153],{},"Apagar uma chave secreta não desloga os seus usuários. Uma chave de API diz qual\naplicação está chamando o seu banco de dados, e o token de sessão de um\nvisitante diz qual usuário ele é. O segundo é conferido contra a chave de\nassinatura do projeto, e esse é um valor separado que você não encostou.",[34,155,157,158,160],{"id":156},"por-que-uma-chave-service_role-antiga-do-supabase-não-pode-ser-rotacionada","Por que uma chave ",[14,159,16],{}," antiga do Supabase não pode ser rotacionada",[10,162,163,164,166,167,169],{},"Porque não existe botão para isso. A nota de solução de problemas do Supabase\ndiz que a rotação direta dos segredos antigos ",[14,165,60],{},", ",[14,168,16],{}," e JWT não é\nmais suportada, e aponta para as chaves novas.",[10,171,172,173,175],{},"Então invalidar uma chave ",[14,174,16],{}," antiga que vazou é uma migração e não\numa rotação:",[124,177,178,189,195,200],{},[127,179,180,183,184,61,186,188],{},[91,181,182],{},"Crie as chaves novas."," Isso acrescenta ",[14,185,50],{},[14,187,46],{}," ao\nlado do par antigo. Os dois sistemas funcionam ao mesmo tempo e nada quebra.",[127,190,191,194],{},[91,192,193],{},"Mova o seu frontend para a chave publicável."," No Lovable ou no Bolt isso\ncostuma ser um valor nas configurações do projeto e não uma linha de código.",[127,196,197],{},[91,198,199],{},"Mova todo uso do lado do servidor para a chave secreta.",[127,201,202,205],{},[91,203,204],{},"Desative as chaves antigas"," nas configurações do projeto.",[10,207,208,209,211,212,214,215,217],{},"O passo 4 é um botão só e ele vale para as duas chaves antigas. ",[14,210,60],{}," e\n",[14,213,16],{}," são JWTs assinados pelo mesmo segredo, então o botão que revoga\numa revoga a outra, e um frontend que ainda carrega a chave ",[14,216,60],{}," antiga para\nde funcionar no instante em que você vira isso. É por isso que o passo 2 vem\nantes.",[105,219],{"alt":220,"caption":221,"src":222},"Um painel de configurações com quatro linhas. As duas de cima, sb_publishable_ e sb_secret_, trazem cada uma um ponto preenchido e um valor legível. Abaixo de um divisor, anon e service_role aparecem apagadas com os valores mascarados por pontinhos, e uma chave de colchete liga essas duas linhas a um único botão na posição desligada.","Desativar as chaves antigas é um controle só para as duas. A chave anon que o seu app usa sai junto com a chave service_role que você quer invalidar.","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fone-switch-two-keys-1600x720.png",[10,224,225,226,230],{},"Desativar tem volta, e essa é a única boa notícia desta parte: se algo que você\nesqueceu ainda estiver usando uma chave antiga, dá para ligar de novo enquanto\nconserta. ",[19,227,229],{"href":228},"\u002Fblog\u002Fsupabase-new-api-keys","O que a migração envolve"," está contado\ncom mais calma lá.",[232,233,235],"callout",{"type":234},"warn",[10,236,237,240],{},[91,238,239],{},"Até o passo 4 a chave vazada continua funcionando."," Os passos 1 a 3\nacrescentam uma segunda porta de entrada; não tiram nada. Num projeto em que a\nchave já é pública, é exatamente isso que torna essa ordem desconfortável, e é o\nmotivo para fazer os quatro passos um atrás do outro. Uma migração pela metade\ndeixa a chave antiga ativa e o seu app rodando em dois sistemas de chave ao\nmesmo tempo.",[34,242,244],{"id":243},"de-onde-a-chave-vazou-e-como-fechar-isso","De onde a chave vazou, e como fechar isso",[10,246,247],{},"Três causas explicam quase tudo, e as três estão dentro do seu próprio projeto.",[10,249,250,260,261,264],{},[91,251,252,253,256,257,80],{},"Um prefixo ",[14,254,255],{},"VITE_"," ou ",[14,258,259],{},"NEXT_PUBLIC_"," Isso não é uma configuração de\nsegurança que alguém esqueceu de ligar. É uma instrução para o build: coloque\neste valor no bundle. Uma variável chamada ",[14,262,263],{},"VITE_SUPABASE_SERVICE_ROLE_KEY"," foi\ncompilada no seu JavaScript de propósito, por uma ferramenta que fez exatamente\no que mandaram.",[10,266,267,270,271,274],{},[91,268,269],{},"Um valor colado direto num componente."," Nenhum prefixo envolvido e nenhum\narquivo ",[14,272,273],{},".env",", só a chave parada numa linha de código porque era o jeito mais\nrápido de fazer uma consulta devolver alguma coisa.",[10,276,277,280],{},[91,278,279],{},"Trabalho que pertence a um servidor."," Apagar uma conta, escrever numa tabela\nonde os seus usuários não podem escrever, ler linhas de todo mundo. A chave foi\npuxada porque o navegador não dava conta do serviço, e a saída é mover o\nserviço: uma edge function, uma rota serverless, qualquer coisa que os seus\nvisitantes não baixem.",[34,282,284],{"id":283},"como-eu-sei-se-alguém-usou","Como eu sei se alguém usou?",[10,286,287],{},"Normalmente você não tem como ter certeza. O que dá para fazer é estreitar a\njanela e olhar dentro dela.",[10,289,290],{},"A janela abre com o deploy que publicou a chave pela primeira vez e fecha quando\nvocê a desativou. O seu projeto Supabase guarda logs da API e do banco, e é para\nesse intervalo que eles precisam ser filtrados. O que você procura são leituras\ne escritas que não consegue explicar: requisições a tabelas que o seu app nunca\ntoca, tráfego em horários em que ninguém estava usando, exclusões que ninguém\nfez.",[10,292,293],{},"Depois confira os dados em si. Contagens de linhas contra o que você espera, os\nseus próprios registros de conta, qualquer coisa com um carimbo de data que se\nmoveu enquanto ninguém trabalhava. Uma mensagem no suporte sobre dados que\nmudaram sozinhos é como a maior parte desses casos é descoberta de verdade, e\nela chega semanas depois.",[10,295,296,297,299,300,80],{},"Uma chave ",[14,298,16],{}," não alcança o seu meio de pagamento nem o seu envio de\ne-mail. Ainda assim vale saber se ela era a única chave no seu bundle, porque as\nque gastam dinheiro vazam pelo mesmo caminho:\n",[19,301,303],{"href":302},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","o que 30.998 apps estavam publicando",[34,305,307],{"id":306},"confira-o-seu-app-no-ar-antes-de-dar-por-encerrado","Confira o seu app no ar antes de dar por encerrado",[10,309,310],{},"Carregue o site numa janela anônima, abra o JavaScript que o navegador baixou e\nprocure ali o valor antigo. Procure depois o novo, que também não deveria estar\nlá.",[10,312,313],{},"Duas coisas fazem valer a conferência na mão. Um build pode servir um bundle em\ncache por um tempo depois do deploy, então o arquivo que um visitante recebe nem\nsempre é o que você acabou de construir. E uma chave pode estar em mais de um\nlugar: um segundo ponto de entrada, um service worker, um build antigo ainda\nsendo servido de um caminho que ninguém aponta.",[10,315,316,317,80],{},"Nosso scan gratuito faz essa parte de fora, na URL que os seus visitantes usam\nde verdade, e decodifica uma chave do Supabase o suficiente para ler o papel,\nentão uma chave publicável volta com um visto. Leva uns vinte segundos e não\npede conta: ",[19,318,319],{"href":21},"escaneie o seu app",[34,321,323],{"id":322},"o-que-fazer-agora","O que fazer agora",[325,326,327],"key-takeaways",{},[328,329,330,340,343,346,349,352],"ul",{},[127,331,332,333,335,336,339],{},"Confirme a chave primeiro. ",[14,334,46],{}," na frente, ou ",[14,337,338],{},"\"role\": \"service_role\""," dentro de uma mais antiga. Uma chave publicável no seu frontend não é achado.",[127,341,342],{},"Se ela está no bundle que os seus visitantes baixam, rotacione antes de mexer no código. Editar o app não alcança as cópias que já saíram.",[127,344,345],{},"Se ela só vazou para um repositório, um log ou uma conversa, feche a origem primeiro, para o seu próximo deploy não empurrar a chave nova para fora na sequência.",[127,347,348],{},"Num projeto novo: crie uma segunda chave secreta, mova o código do servidor para ela, faça o deploy e depois apague a antiga. Apagar é definitivo.",[127,350,351],{},"Num projeto antigo não existe botão de rotação. Crie as chaves novas, mova o frontend e o servidor para elas e depois desative o par antigo com o único botão que vale para os dois.",[127,353,354],{},"Procure no seu bundle no ar depois. Um build em cache pode servir o valor antigo por um tempo depois do deploy.",[10,356,296,357,359,360,364],{},[14,358,16],{}," lê e escreve toda linha do seu banco de dados. A pior\nversão dessa história termina com uma tabela vazia, e se essas linhas voltam\ndepende\n",[19,361,363],{"href":362},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","do que você estava salvando","\nantes de tudo isso acontecer.",{"title":366,"searchDepth":367,"depth":367,"links":368},"",3,[369,372,373,374,376,377,378,379],{"id":36,"depth":370,"text":371},2,"É mesmo a chave service_role?",{"id":83,"depth":370,"text":84},{"id":112,"depth":370,"text":113},{"id":156,"depth":370,"text":375},"Por que uma chave service_role antiga do Supabase não pode ser rotacionada",{"id":243,"depth":370,"text":244},{"id":283,"depth":370,"text":284},{"id":306,"depth":370,"text":307},{"id":322,"depth":370,"text":323},"Noções de segurança","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcover-1200x630.png","Um cadeado com duas chaves idênticas ao lado, desenhadas no mesmo tamanho, uma clara e uma apagada.","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.",false,"md",[387,390,393,396,398],{"q":388,"a":389},"Rotacionar a chave quebra o meu app no ar?","Não, se você seguir a ordem. Num projeto com as chaves novas, você adiciona uma segunda chave secreta, move o código do seu servidor para ela, faz o deploy e só então apaga a antiga, então nunca existe um momento sem uma chave funcionando. Num projeto antigo o risco é outro: desativar o par antigo também desativa a chave anon que o seu frontend usa, então o app cai a menos que ele já esteja na chave publicável quando você virar essa chave.",{"q":391,"a":392},"Dá para rotacionar as chaves antigas anon e service_role?","Não. A documentação de solução de problemas do Supabase diz que a rotação direta dos segredos antigos anon, service_role e JWT não é mais suportada. Invalidar uma chave antiga vazada significa criar as novas chaves sb_publishable_ e sb_secret_, mover o seu app e o código do seu servidor para elas e depois desativar o par antigo nas configurações do projeto.",{"q":394,"a":395},"Apago a chave antiga ou desativo?","Você não escolhe, porque os dois sistemas de chave se comportam de formas diferentes. Uma chave sb_secret_ nova é apagada, em definitivo, sem nenhuma forma de trazer de volta. O par antigo é desativado, e desativar tem volta: se algo que você esqueceu ainda estiver usando uma chave antiga, dá para ligar de novo enquanto você conserta.",{"q":284,"a":397},"Normalmente você não tem como ter certeza. Reduza isso a uma janela: a chave ficou utilizável desde o deploy que a publicou pela primeira vez até o momento em que você a desativou. Filtre os logs da API e do banco do seu projeto Supabase para esse intervalo e procure leituras e escritas que você não consegue explicar; depois confira os dados em si, contagens de linhas e carimbos de data que não batem com nada que você tenha feito.",{"q":399,"a":400},"Preciso rotacionar a chave anon também?","Num projeto antigo você não tem escolha: desativar o par antigo leva as duas chaves de uma vez, então o seu frontend precisa da chave publicável nova antes de você virar o botão. Num projeto novo a chave publicável foi feita para ser pública e não há motivo para mexer nela. O que vale conferir nos dois casos é o Row Level Security, porque é a única coisa entre uma chave publicável e todo o seu banco de dados.","\u002Fblog\u002Frotate-supabase-service-role-key\u002Fcard-800x500.png",[403,404,405,406,407,408,409,410],"rotacionar chave service role supabase","como rotacionar a service role key no supabase","chave service role do supabase vazada","chave service role do supabase exposta","rotação de chaves supabase","revogar chave api supabase","desativar chaves api antigas supabase","service role key no frontend",{},true,"Rotacionar uma chave service_role vazada, na ordem certa","\u002Fblog\u002Frotate-supabase-service-role-key","2026-09-08",{"title":5,"description":383},"blog\u002Frotate-supabase-service-role-key",[419,420,421],"Se a sua chave service_role do Supabase está no JavaScript que um navegador baixa, rotacione antes de consertar qualquer coisa. A cópia que já saiu não expira.","Se ela só chegou a um repositório privado ou a um log, feche a origem primeiro, ou a chave nova vai sair atrás da antiga no próximo deploy.","Uma chave service_role antiga não pode ser rotacionada. Invalidar uma delas significa criar as novas chaves sb_secret_, mover o app para elas e desativar o par antigo com um botão que vale para os dois.","4k4c4MY5O1RAmt9AIM2fUj5WCXCWqIXxGhGB9_1rnf0",[424,431,437,443,449,455,461,467,473,479,485,491,497,503,509,515,516,522,528,534,540,546,551,557,563,569,575,580,586,592,598,604,610,616,622,628,633,638,644,650,655,660],{"path":425,"title":426,"description":427,"published":428,"category":429,"image":430,"draft":384},"\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":432,"title":433,"description":434,"published":435,"category":380,"image":436,"draft":384},"\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":438,"title":439,"description":440,"published":441,"category":380,"image":442,"draft":384},"\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":444,"title":445,"description":446,"published":447,"category":380,"image":448,"draft":384},"\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":450,"title":451,"description":452,"published":453,"category":380,"image":454,"draft":384},"\u002Fblog\u002Fstripe-secret-key-in-frontend","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í.","2026-09-19","\u002Fblog\u002Fstripe-secret-key-in-frontend\u002Fcard-800x500.png",{"path":456,"title":457,"description":458,"published":459,"category":380,"image":460,"draft":384},"\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":462,"title":463,"description":464,"published":465,"category":380,"image":466,"draft":384},"\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":468,"title":469,"description":470,"published":471,"category":380,"image":472,"draft":384},"\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":474,"title":475,"description":476,"published":477,"category":380,"image":478,"draft":384},"\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":480,"title":481,"description":482,"published":483,"category":429,"image":484,"draft":384},"\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":486,"title":487,"description":488,"published":489,"category":429,"image":490,"draft":384},"\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":492,"title":493,"description":494,"published":495,"category":429,"image":496,"draft":384},"\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":498,"title":499,"description":500,"published":501,"category":380,"image":502,"draft":384},"\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":504,"title":505,"description":506,"published":507,"category":380,"image":508,"draft":384},"\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":510,"title":511,"description":512,"published":513,"category":380,"image":514,"draft":384},"\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":414,"title":5,"description":383,"published":415,"category":380,"image":401,"draft":384},{"path":517,"title":518,"description":519,"published":520,"category":380,"image":521,"draft":384},"\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":523,"title":524,"description":525,"published":526,"category":380,"image":527,"draft":384},"\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":529,"title":530,"description":531,"published":532,"category":380,"image":533,"draft":384},"\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":535,"title":536,"description":537,"published":538,"category":380,"image":539,"draft":384},"\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":541,"title":542,"description":543,"published":544,"category":380,"image":545,"draft":384},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","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":302,"title":547,"description":548,"published":549,"category":380,"image":550,"draft":384},"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":552,"title":553,"description":554,"published":555,"category":429,"image":556,"draft":384},"\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":558,"title":559,"description":560,"published":561,"category":380,"image":562,"draft":384},"\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":564,"title":565,"description":566,"published":567,"category":429,"image":568,"draft":384},"\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":570,"title":571,"description":572,"published":573,"category":380,"image":574,"draft":384},"\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":139,"title":576,"description":577,"published":578,"category":380,"image":579,"draft":384},"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":581,"title":582,"description":583,"published":584,"category":380,"image":585,"draft":384},"\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":587,"title":588,"description":589,"published":590,"category":380,"image":591,"draft":384},"\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":593,"title":594,"description":595,"published":596,"category":429,"image":597,"draft":384},"\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":599,"title":600,"description":601,"published":602,"category":429,"image":603,"draft":384},"\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":605,"title":606,"description":607,"published":608,"category":380,"image":609,"draft":384},"\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":611,"title":612,"description":613,"published":614,"category":380,"image":615,"draft":384},"\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":617,"title":618,"description":619,"published":620,"category":429,"image":621,"draft":384},"\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":623,"title":624,"description":625,"published":626,"category":380,"image":627,"draft":384},"\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":629,"title":630,"description":631,"published":626,"category":380,"image":632,"draft":384},"\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":228,"title":634,"description":635,"published":636,"category":380,"image":637,"draft":384},"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":639,"title":640,"description":641,"published":642,"category":429,"image":643,"draft":384},"\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":645,"title":646,"description":647,"published":648,"category":380,"image":649,"draft":384},"\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":651,"title":652,"description":653,"published":648,"category":429,"image":654,"draft":384},"\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":362,"title":656,"description":657,"published":658,"category":429,"image":659,"draft":384},"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":67,"title":661,"description":662,"published":658,"category":380,"image":663,"draft":384},"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",1790150954786]