[{"data":1,"prerenderedAt":1087},["ShallowReactive",2],{"blog-pt-is-bolt-safe":3,"blog-index-pt":737},{"id":4,"title":5,"body":6,"category":695,"cover":696,"coverAlt":697,"description":698,"draft":699,"extension":700,"faq":701,"image":716,"keywords":717,"meta":726,"navigation":727,"ogTitle":5,"path":728,"published":729,"seo":730,"stem":731,"tldr":732,"updated":729,"__hash__":736},"blog_pt\u002Fblog\u002Fis-bolt-safe.md","O Bolt é seguro? O que vimos em 1.123 aplicativos Bolt",{"type":7,"value":8,"toc":679},"minimark",[9,18,26,29,34,37,40,62,65,69,82,218,221,227,243,247,250,260,271,283,286,297,301,304,307,367,374,382,389,394,398,401,404,426,434,438,441,444,449,459,463,466,469,485,492,496,499,506,513,516,520,523,561,565,571,581,600,603,614,631,634,642,646,668],[10,11,12,13,17],"p",{},"Você construiu algo no Bolt, apertou Publish, e agora ele mora num endereço que\ntermina em ",[14,15,16],"code",{},"bolt.host",". Antes de mandar esse link para clientes de verdade, você\ndigitou \"bolt é seguro\" numa busca, e o que voltou foi uma lista de cinco\nvulnerabilidades que, pelo que dizem, estão em quase todo aplicativo Bolt, com\num scanner à venda no fim da página.",[10,19,20,21,25],{},"Eis o erro dessas listas: ",[22,23,24],"strong",{},"elas colocam todo risco no mesmo nível, e nos\naplicativos Bolt no ar a maioria deles quase não aparece."," Source maps,\ncabeçalhos cross-origin abertos e rotas de API sem proteção aparecem ali de\nigual para igual com chaves vazadas e tabelas abertas. Nos nossos dados, os três\nprimeiros apareceram em 13, 1 e 4 aplicativos de mais de mil. Os outros dois são\nonde estavam os achados.",[10,27,28],{},"Entre 12 e 14 de agosto de 2026, passamos as mesmas nove verificações externas\nque qualquer pessoa pode rodar de graça na nossa página inicial por 30.998\naplicativos no ar, e 1.123 deles estavam publicados na hospedagem do próprio\nBolt. Isto é o que voltou desses, e é aqui que a nossa visão termina.",[30,31,33],"h2",{"id":32},"o-bolt-é-seguro","O Bolt é seguro?",[10,35,36],{},"Em tudo o que o próprio Bolt decide, sim. A hospedagem dele saiu tão limpa quanto\na do Lovable, e tudo o que baixou uma nota estava dentro de um aplicativo que o\npróprio dono construiu.",[10,38,39],{},"Pense num aplicativo Bolt como uma loja. O Bolt levanta o prédio: o endereço, o\ncertificado, a hospedagem. Você enche a vitrine, ou seja, cada página, imagem e\nscript que o seu aplicativo entrega a um visitante, e qualquer pessoa que passa\nna frente pode ler o que está ali. Atrás da loja fica o estoque, o seu banco de\ndados, com porta e fechadura próprias. \"O Bolt é seguro\" são, na verdade, três\nperguntas, uma para cada um.",[41,42,43,50,56],"ol",{},[44,45,46,49],"li",{},[22,47,48],{},"O prédio."," O Bolt publica o seu aplicativo direito: um certificado válido,\num domínio que não vai expirar, nada esquecido num endereço público. Esse é o\ntrabalho do Bolt.",[44,51,52,55],{},[22,53,54],{},"A vitrine."," O que o navegador de um visitante baixa. Uma chave deixada ali\npode ser lida por qualquer pessoa que olhe, não importa como ela foi parar\nali.",[44,57,58,61],{},[22,59,60],{},"O estoque."," Se o seu banco de dados responde a um desconhecido que dá a\nvolta pelos fundos e pergunta. Isso depende de uma fechadura que você coloca,\ntabela por tabela.",[10,63,64],{},"Nossas verificações leem os três de fora. Nenhuma delas lê o código que o agente\ndo Bolt escreveu do jeito que você leria no editor, e este artigo não tenta\nadivinhar.",[30,66,68],{"id":67},"o-que-encontramos-em-1123-aplicativos-bolt","O que encontramos em 1.123 aplicativos Bolt",[10,70,71,72,75,76,81],{},"Nove verificações, feitas de fora, sem login e sem acesso à conta de ninguém.\nQuando um banco de dados respondia, perguntávamos quantas linhas ele entregaria e\nparávamos ali; não lemos nenhuma. Nenhum aplicativo é citado aqui nem em nada que\npublicamos. Cada proporção abaixo é sobre os aplicativos em que aquela\nverificação ",[22,73,74],{},"respondeu",", porque uma verificação que não conseguiu terminar é\ndesconhecida, não aprovada, e é por isso que os denominadores mudam. O método e\nos dados estão ",[77,78,80],"a",{"href":79},"\u002Fresearch\u002Fvibe-coded-app-security-2026","no relatório",".",[83,84,85,102],"table",{},[86,87,88],"thead",{},[89,90,91,95,99],"tr",{},[92,93,94],"th",{},"O que verificamos",[92,96,98],{"align":97},"right","Aplicativos Bolt",[92,100,101],{},"Quem decide",[103,104,105,117,128,138,149,159,169,179,197,208],"tbody",{},[89,106,107,111,114],{},[108,109,110],"td",{},"Cabeçalhos de segurança do navegador ausentes",[108,112,113],{"align":97},"1.121 de 1.123",[108,115,116],{},"A hospedagem do Bolt",[89,118,119,122,125],{},[108,120,121],{},"Algo com cara de chave no código que um visitante baixa",[108,123,124],{"align":97},"75 de 1.123 (7 %)",[108,126,127],{},"O seu aplicativo",[89,129,130,133,136],{},[108,131,132],{},"Uma tabela do banco legível sem login",[108,134,135],{"align":97},"27 de 35",[108,137,127],{},[89,139,140,143,146],{},[108,141,142],{},"Código-fonte original publicado (source maps)",[108,144,145],{"align":97},"13 de 1.123 (1 %)",[108,147,148],{},"Uma configuração de build",[89,150,151,154,157],{},[108,152,153],{},"Um bucket de armazenamento que lista seus arquivos",[108,155,156],{"align":97},"6 de 901",[108,158,127],{},[89,160,161,164,167],{},[108,162,163],{},"Uma rota de API que entregou dados a um desconhecido",[108,165,166],{"align":97},"4 de 1.120",[108,168,127],{},[89,170,171,174,177],{},[108,172,173],{},"Qualquer site autorizado a chamar a sua API",[108,175,176],{"align":97},"1 de 1.120",[108,178,127],{},[89,180,181,192,195],{},[108,182,183,184,187,188,191],{},"Um arquivo privado como ",[14,185,186],{},".env"," ou ",[14,189,190],{},".git\u002Fconfig"," numa URL pública",[108,193,194],{"align":97},"0 de 1.109",[108,196,127],{},[89,198,199,202,205],{},[108,200,201],{},"Certificado expirado ou não confiável",[108,203,204],{"align":97},"0 de 1.119",[108,206,207],{},"Bolt",[89,209,210,213,216],{},[108,211,212],{},"Domínio perto de expirar",[108,214,215],{"align":97},"0 de 1.123",[108,217,207],{},[10,219,220],{},"As notas: 1.051 A, 33 B, 24 C, 15 D e nenhum F.",[222,223],"diagram",{"alt":224,"caption":225,"src":226},"Sete barras horizontais na mesma escala, cada uma precedida de um pequeno ícone e seguida de um número: 1.121 para os cabeçalhos, 75 para as chaves, 27 para as tabelas legíveis, 13 para os source maps, 6 para os buckets, 4 para as rotas abertas e 1 para o cabeçalho cross-origin aberto. A barra de cima é longa e cinza-claro, as outras são curtas e turquesa, e as três últimas são linhas finas dentro de um círculo.","Número de aplicativos numa só escala. A barra cinza é decidida pela hospedagem do Bolt. Cada barra turquesa veio de algo dentro do aplicativo, e a linha das tabelas legíveis é medida sobre uma base bem menor, que uma imagem mais adiante desmonta.","\u002Fblog\u002Fis-bolt-safe\u002Fwhat-we-found-1600x720.png",[10,228,229,230,233,234,238,239,242],{},"Essa primeira linha é decidida por quem serve as suas páginas, e em\n",[14,231,232],{},"yourapp.bolt.host"," esse é o Bolt, então 1.121 aplicativos receberam a mesma\nresposta. Os cabeçalhos ",[77,235,237],{"href":236},"\u002Fblog\u002Fmissing-security-headers","valem a pena",", e não\nsão eles que transformam uma nota em D. Tire essa linha e ",[22,240,241],{},"1.008 dos 1.123\naplicativos Bolt não tinham mais nada",". Os 115 restantes são o assunto do resto\ndeste artigo.",[30,244,246],{"id":245},"o-que-o-bolt-faz-certo","O que o Bolt faz certo",[10,248,249],{},"As verificações que dependem do Bolt voltaram quase vazias, e na única\nconfiguração de build que medimos o Bolt empata com o Lovable.",[10,251,252,255,256,81],{},[22,253,254],{},"Source maps."," 13 de 1.123 aplicativos Bolt publicam os arquivos originais por\ntrás do aplicativo, comentários incluídos. É pouco mais de um em cada cem, mais\nou menos a mesma taxa dos 225 de 18.553 do Lovable, e\n",[77,257,259],{"href":258},"\u002Fblog\u002Fsource-maps-exposed-in-production","um map entrega mais do que as pessoas imaginam",[10,261,262,265,266,270],{},[22,263,264],{},"Cabeçalhos cross-origin."," Um aplicativo em 1.120 dizia a qualquer site do\nmundo que podia chamar a sua API. É o achado\n",[77,267,269],{"href":268},"\u002Fblog\u002Fcors-wildcard-security-risk","que mais facilmente deixa outro site agir como o seu usuário",",\ne no Bolt ele apareceu uma vez.",[10,272,273,276,277,279,280,282],{},[22,274,275],{},"O prédio em si."," O certificado era válido em todos os 1.119 aplicativos em que\nconseguimos ler um, nenhum domínio dos 1.123 estava perto de expirar, e nenhum\naplicativo servia um arquivo ",[14,278,186],{}," ou um ",[14,281,190],{}," num endereço qualquer.",[10,284,285],{},"Nada disso pediu nada a você, e em alguns outros builders pede.",[287,288,290],"callout",{"type":289},"note",[10,291,292,293,81],{},"De graça, sem conta, uns 20 segundos: o escaneamento da nossa página inicial\nroda as nove verificações contra o seu aplicativo no ar e escreve \"Não foi\npossível verificar\" em vez de um visto para tudo que não obteve resposta.\n",[77,294,296],{"href":295},"\u002Fsecurity-scanner","Escanear seu aplicativo",[30,298,300],{"id":299},"do-que-eram-feitas-as-75-chaves","Do que eram feitas as 75 chaves",[10,302,303],{},"A maioria estava certa, e as poucas que não estavam são a coisa mais cara deste\nartigo.",[10,305,306],{},"75 dos 1.123 aplicativos Bolt tinham algo com cara de chave no código que um\nvisitante baixa. Contadas como formas, são 7 % dos aplicativos Bolt \"vazando\nsegredos\". Contadas pelo que cada chave consegue fazer, elas se dividem assim,\ncom cada aplicativo contado uma vez só, pela coisa mais grave que ele contém:",[83,308,309,322],{},[86,310,311],{},[89,312,313,316,319],{},[92,314,315],{},"O que encontramos no bundle",[92,317,318],{"align":97},"Aplicativos",[92,320,321],{},"O que significa",[103,323,324,335,346,357],{},[89,325,326,329,332],{},[108,327,328],{},"Uma chave de API do Google, e nada mais",[108,330,331],{"align":97},"38",[108,333,334],{},"Costuma estar certa, depois de restrita ao seu domínio",[89,336,337,340,343],{},[108,338,339],{},"Um segredo que não conseguimos atribuir",[108,341,342],{"align":97},"26",[108,344,345],{},"Não conseguimos dizer de qual fornecedor ele é",[89,347,348,351,354],{},[108,349,350],{},"Uma chave da OpenAI",[108,352,353],{"align":97},"10",[108,355,356],{},"Cobra na sua conta, diretamente",[89,358,359,362,365],{},[108,360,361],{},"Uma chave da Anthropic",[108,363,364],{"align":97},"1",[108,366,356],{},[10,368,369,370,81],{},"As 38 chaves do Google são o motivo de classificarmos cada chave em vez de só\nprocurar um padrão. Uma chave do Google Maps no navegador está onde deveria\nestar, e a correção é\n",[77,371,373],{"href":372},"\u002Fblog\u002Fgoogle-api-key-exposed-in-frontend","restringi-la ao seu próprio domínio",[10,375,376,377,381],{},"As dez chaves da OpenAI são o caso oposto. Uma chave da OpenAI é um bearer\ntoken: quem tem a chave pode gastar com ela, de qualquer lugar, e a OpenAI não\noferece nenhuma configuração que prenda uma chave ao seu site. Os dez\naplicativos tiraram D, porque um único achado crítico põe um teto na nota, não\nimporta o que mais o aplicativo tenha feito certo.\n",[77,378,380],{"href":379},"\u002Fblog\u002Fopenai-api-key-exposed-in-frontend","O que fazer com uma, na ordem","\ncomeça por rotacioná-la hoje mesmo.",[10,383,384,385,388],{},"Este é o número que faz disso o achado do Bolt. Os aplicativos Bolt eram menos\nde 4 em cada 100 aplicativos escaneados, e carregavam ",[22,386,387],{},"10 das 33 chaves da\nOpenAI"," que encontramos no total. Por aplicativo, dá mais ou menos um\naplicativo Bolt em cada 110, contra 18 dos 18.554 aplicativos Lovable, mais ou\nmenos um em mil. Dez aplicativos são uma amostra pequena, e alguns a mais ou a\nmenos mexeriam muito nessa proporção. Ainda assim o Bolt continuaria à frente de\ntodos os outros builders que medimos.",[222,390],{"alt":391,"caption":392,"src":393},"Duas barras do mesmo comprimento, uma sobre a outra, cada uma precedida de um ícone. A de cima representa 30.998 aplicativos escaneados e tem na ponta esquerda uma faixa turquesa fina marcada 1.123, com o logo do Bolt ao lado. A de baixo representa 33 chaves da OpenAI e tem uma faixa vermelha de quase um terço do comprimento marcada 10.","O Bolt era uma faixa fina dos aplicativos escaneados e quase um terço das chaves da OpenAI encontradas. Os números são pequenos, por isso os dois aparecem em vez de virar uma taxa.","\u002Fblog\u002Fis-bolt-safe\u002Fshare-of-openai-keys-1600x620.png",[30,395,397],{"id":396},"por-que-aplicativos-bolt-vazam-chaves-de-api","Por que aplicativos Bolt vazam chaves de API?",[10,399,400],{},"De fora, não vemos como cada uma dessas dez chaves foi parar lá, e as próprias\ninstruções do Bolt dizem que nenhuma delas deveria estar ali.",[10,402,403],{},"A documentação do Bolt descreve o caminho previsto. Peça ao agente para integrar\na OpenAI e, nas palavras da documentação, ele vai \"terminar o código e depois\nmostrar uma mensagem pedindo que você adicione o seu secret\". Esse secret vai no\npainel Secrets, onde só uma função de servidor consegue lê-lo. Uma função de\nservidor roda do lado do Bolt, então o navegador do visitante nunca recebe a\nchave. Construída assim, a chave fica no estoque.",[10,405,406,407,410,411,414,415,418,419,421,422,425],{},"O desvio que conseguimos apontar é a variável de ambiente. A introdução do Bolt\na bancos de dados diz que variáveis de ambiente mantêm esses valores privados, e\ndois dos três nomes que ela lista, ",[14,408,409],{},"VITE_SUPABASE_URL"," e\n",[14,412,413],{},"VITE_SUPABASE_ANON_KEY",", começam com ",[14,416,417],{},"VITE_",". Esse prefixo é do Vite, a\nferramenta de build, e a documentação do Vite diz o contrário sobre ele: uma\nvariável ",[14,420,417],{}," é escrita no código que o navegador baixa, e nunca deve conter\numa chave de API. Para esses dois nomes isso não faz mal, porque o endereço de um\nprojeto e uma chave publicável foram feitos para ser públicos. Copie o mesmo\npadrão para ",[14,423,424],{},"VITE_OPENAI_API_KEY"," e a chave fica na vitrine.",[10,427,428,429,433],{},"Uma chave colada no chat enquanto você consertava outra coisa também pode acabar\nescrita direto numa página. Nos dois casos, o resultado é o mesmo arquivo.\n",[77,430,432],{"href":431},"\u002Fblog\u002Fvite-and-next-public-env-vars","Como o prefixo funciona"," explica quais\nvalores cabem atrás dele e quais nunca.",[30,435,437],{"id":436},"_27-de-35-os-bancos-bolt-que-conseguimos-consultar","27 de 35: os bancos Bolt que conseguimos consultar",[10,439,440],{},"Dos bancos de dados Bolt que nos deram uma resposta utilizável, 27 de 35\nentregaram linhas a uma requisição sem login nenhum. É uma contagem, e a base é\npequena demais para ser impressa como porcentagem.",[10,442,443],{},"Os denominadores importam aqui mais do que em qualquer outro ponto deste artigo.\n266 dos 1.123 aplicativos Bolt citavam um projeto Supabase no código que\nentregam. Só 35 deles responderam bem o bastante para que pudéssemos julgar. Os\noutros 231 não puderam ser julgados, o que os deixa como desconhecidos, e não os\ncontamos nem como limpos nem como expostos.",[222,445],{"alt":446,"caption":447,"src":448},"Quatro barras empilhadas que se estreitam da esquerda para a direita na mesma escala: 1.123 aplicativos Bolt, 266 que citavam um projeto Supabase, 35 cujo banco deu uma resposta utilizável e 27 que devolveram linhas sem login. A terceira barra continua como um contorno tracejado até a largura da segunda, marcada com um ponto de interrogação e o número 231. A última barra é vermelha.","Quatro denominadores. O 27 é medido sobre o 35, e os 231 que não pudemos julgar estão desenhados como desconhecidos em vez de ficarem de fora.","\u002Fblog\u002Fis-bolt-safe\u002Fwhere-it-lands-1600x620.png",[10,450,451,452,187,455,458],{},"Em 4 dos 27, a tabela que respondeu tinha o tipo de nome que as tabelas sobre\npessoas costumam ter, como ",[14,453,454],{},"users",[14,456,457],{},"profiles",". Esses quatro e os onze\naplicativos com uma chave da OpenAI ou da Anthropic somam todas as 15 notas D.\nNos outros 23 era uma tabela que não conseguíamos identificar de fora, talvez\numa lista de produtos que sempre deveria ser pública, talvez qualquer outra\ncoisa.",[30,460,462],{"id":461},"por-que-tudo-se-decide-no-banco-de-dados","Por que tudo se decide no banco de dados",[10,464,465],{},"Porque o endereço do estoque está impresso na vitrine, e precisa estar.",[10,467,468],{},"Quando um aplicativo Bolt lê os dados a partir da página, a página precisa do\nendereço do banco e de uma chave publicável, então os dois viajam até cada\nvisitante. Essa chave ser pública é o certo; é por ela que o seu próprio\naplicativo entra. O que ela recebe de volta é decidido por uma configuração por\ntabela chamada Row Level Security. Ligada e com uma policy escrita, a chave\npública lê só as linhas que a policy permite. Desligada, lê a tabela.",[10,470,471,472,475,476,479,480,484],{},"O Supabase liga a Row Level Security por padrão nas tabelas que você cria\nclicando no Table Editor. Tabelas criadas ",[22,473,474],{},"rodando SQL"," não recebem, e rodar\nSQL é justamente como um builder cria tabelas para você. Ligar também é só o\nprimeiro passo, porque a policy que um assistente escreve para se livrar de um\nerro de permissão costuma ser ",[14,477,478],{},"using (true)",", que deixa todo mundo passar\nenquanto o painel mostra a tabela como protegida.\n",[77,481,483],{"href":482},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","A RLS está ligada e a sua tabela continua pública","\nconta essa história inteira.",[10,486,487,488,81],{},"A verificação de banco de dados do próprio Bolt procura exatamente isso: a\ndocumentação dela a descreve como capaz de encontrar \"uma policy de Row Level\nSecurity (RLS) faltando ou uma permissão aberta demais\". O guia em linguagem\nsimples para esta plataforma é\n",[77,489,491],{"href":490},"\u002Fis-your-bolt-app-safe","o seu aplicativo Bolt é seguro",[30,493,495],{"id":494},"o-que-a-auditoria-de-segurança-do-bolt-verifica","O que a auditoria de segurança do Bolt verifica",[10,497,498],{},"Ela lê o seu projeto por dentro, e roda quando você aperta o botão.",[10,500,501,502,505],{},"O Bolt anunciou a auditoria em 30 de julho de 2026. Num plano pago, ela fica no\nmenu Publish como ",[22,503,504],{},"Run security audit",": revisa o seu código e o seu banco de\ndados, corrige sozinha a maioria dos problemas, aponta o resto e não gasta os\nseus tokens. Em todos os planos, inclusive o gratuito, as configurações de um\nbanco de dados Bolt têm uma seção Security que roda a verificação de Row Level\nSecurity descrita acima.",[10,507,508,509,512],{},"O nosso escaneamento aconteceu duas semanas depois que esse botão apareceu,\nentão os números acima não conseguem dizer o quanto ele mudou as coisas desde\nentão. O que conseguimos dizer é como as duas visões se encaixam. A auditoria vê\no seu projeto por dentro, incluindo tabelas que as suas páginas nunca citam,\ncoisa que um escaneamento de fora nunca consegue. Um escaneamento de fora vê o\nque um desconhecido recebe do aplicativo publicado. Quando uma auditoria termina,\no botão passa a dizer ",[22,510,511],{},"Security audit up to date",", e a próxima mudança que você\npublicar é uma que ela não viu.",[10,514,515],{},"Rode a auditoria antes de publicar e olhe de fora depois. Se as duas discordarem\nsobre uma tabela ser legível, fique com a resposta de fora, porque é essa que um\ndesconhecido recebe.",[30,517,519],{"id":518},"como-verificar-o-seu-próprio-aplicativo-bolt","Como verificar o seu próprio aplicativo Bolt",[10,521,522],{},"Cinco coisas para olhar. Use uma janela anônima, para que o seu próprio login\nnão responda por um desconhecido.",[41,524,525,531,537,546,552],{},[44,526,527,530],{},[22,528,529],{},"Descubra qual banco de dados você tem."," Projetos novos do Bolt usam um\nbanco de dados Bolt por padrão. Se você escolheu o Supabase ao criar o\nprojeto, ou conectou um depois, as suas tabelas moram num projeto Supabase em\nque você consegue entrar.",[44,532,533,536],{},[22,534,535],{},"Leia a fechadura de cada tabela."," Com um banco Bolt, abra a seção Security\nnas configurações do banco e rode a verificação. Com o Supabase, abra\nAuthentication → Policies e leia a lista: uma tabela com a Row Level Security\ndesligada pode ser lida por qualquer pessoa que tenha o endereço do seu\nprojeto, e esse endereço está no seu aplicativo. Uma policy que deixa todo\nmundo passar conta como desligada.",[44,538,539,545],{},[22,540,541,542,544],{},"Procure ",[14,543,417],{}," no seu projeto."," Cada valor atrás desse prefixo está na\nvitrine. O endereço de um projeto e uma chave publicável cabem ali. Uma chave\nque gera cobrança vai no painel Secrets, lida por uma função de servidor. Se\nalguma já ficou atrás do prefixo, rotacione primeiro no fornecedor, porque o\nvalor antigo continua funcionando até você fazer isso.",[44,547,548,551],{},[22,549,550],{},"Olhe o seu armazenamento."," Um bucket marcado como público lista cada\narquivo dele para qualquer pessoa que pedir, inclusive os que o seu\naplicativo nunca mostra.",[44,553,554,557,558,81],{},[22,555,556],{},"Ou deixe o escaneamento fazer isso."," Ele faz isso de fora junto com outras\ncinco verificações, leva uns 20 segundos, não pede conta e mostra uma nota e\no que a causou: ",[77,559,560],{"href":295},"escaneie o seu aplicativo de graça",[30,562,564],{"id":563},"para-continuar-assim-depois-de-publicar","Para continuar assim depois de publicar",[10,566,567,570],{},[22,568,569],{},"Uma verificação do mês passado descreve o aplicativo do mês passado."," No\nBolt, publicar é um botão, então uma tabela criada hoje de manhã ou uma chave\ncolada à meia-noite está no ar assim que você aperta.",[10,572,573],{},[22,574,575,576,580],{},"O ",[77,577,579],{"href":578},"\u002Fpricing","Reeve Monitor"," roda as nove verificações de novo para você:",[582,583,584,587,590,597],"ul",{},[44,585,586],{},"as nove verificações a cada hora, em até três aplicativos",[44,588,589],{},"se o aplicativo está no ar, a cada 60 segundos",[44,591,592,593,596],{},"uma mensagem quando um resultado ",[22,594,595],{},"muda",", para que um achado novo não espere você olhar",[44,598,599],{},"um relatório mensal do que ele viu",[10,601,602],{},"O Monitor custa $12 por mês no preço de tabela, com sete dias grátis antes de\ncobrar. A página de preços às vezes fica abaixo do número daqui e nunca acima.",[10,604,605,613],{},[22,606,607,608,612],{},"Se o seu aplicativo Bolt guarda os dados no seu próprio projeto Supabase, o\n",[77,609,611],{"href":610},"\u002Fsupabase-backups","Reeve Care"," guarda uma cópia deles."," Isso vale para um\nprojeto que você conectou desde o início e para um banco Bolt que você reivindicou\nno Supabase.",[582,615,616,619,622,625,628],{},[44,617,618],{},"uma cópia criptografada do seu banco Supabase toda noite, guardada onde o seu projeto não alcança",[44,620,621],{},"cada cópia verificada antes de valer, com a contagem das linhas de cada tabela",[44,623,624],{},"uma restauração com um clique quando você precisar",[44,626,627],{},"os seus arquivos enviados também, assim que você conectar uma credencial de Storage",[44,629,630],{},"tudo o que o Monitor faz",[10,632,633],{},"O Care custa $49 por mês no preço de tabela para um aplicativo, com os mesmos\nsete dias grátis.",[10,635,636,637,641],{},"Uma tabela aberta é algo que um desconhecido pode ler. Uma migração que rodou do\njeito errado, ou um agente com acesso ao banco, é algo que pode esvaziá-la, e\nnenhuma das nove verificações deste artigo traria as linhas de volta.\n",[77,638,640],{"href":639},"\u002Fblog\u002Fai-agent-deleted-my-database","O dia em que um agente de IA apagou um banco de dados de produção","\nmostra como isso fica visto de dentro.",[30,643,645],{"id":644},"o-que-fazer-esta-semana","O que fazer esta semana",[647,648,649],"key-takeaways",{},[582,650,651,656,659,662,665],{},[44,652,541,653,655],{},[14,654,417],{}," no seu projeto Bolt e leia cada valor atrás dele. Uma chave que gera cobrança vai no painel Secrets, lida por uma função de servidor.",[44,657,658],{},"Se uma chave da OpenAI ou qualquer outra chave paga já esteve nessa lista, rotacione no fornecedor antes de tirá-la do código.",[44,660,661],{},"Rode a verificação de segurança do banco, ou abra Authentication → Policies no Supabase, e leia a fechadura de cada tabela. Uma policy que deixa todo mundo passar deixa a tabela aberta.",[44,663,664],{},"Rode a auditoria do Bolt antes de publicar e depois confira de fora o aplicativo publicado.",[44,666,667],{},"Guarde uma cópia do seu banco onde nem o seu projeto nem o seu agente alcancem, e confira se essa cópia restaura.",[10,669,670,671,673,674,678],{},"Comece pela busca por ",[14,672,417],{},", porque é o único achado no Bolt que custa dinheiro\nsozinho. Se você ainda está escolhendo entre builders,\n",[77,675,677],{"href":676},"\u002Fblog\u002Fsafest-ai-app-builder","qual builder de aplicativos com IA é o mais seguro","\ncoloca os cinco lado a lado.",{"title":680,"searchDepth":681,"depth":681,"links":682},"",3,[683,685,686,687,688,689,690,691,692,693,694],{"id":32,"depth":684,"text":33},2,{"id":67,"depth":684,"text":68},{"id":245,"depth":684,"text":246},{"id":299,"depth":684,"text":300},{"id":396,"depth":684,"text":397},{"id":436,"depth":684,"text":437},{"id":461,"depth":684,"text":462},{"id":494,"depth":684,"text":495},{"id":518,"depth":684,"text":519},{"id":563,"depth":684,"text":564},{"id":644,"depth":684,"text":645},"Noções de segurança","\u002Fblog\u002Fis-bolt-safe\u002Fcover-1200x630.png","Um aplicativo como vitrine com o logo do Bolt de letreiro, uma chave vermelha dentro, um banco trancado atrás e um visitante lá fora.","O Bolt é seguro? Passamos 1.123 aplicativos Bolt no ar por nove verificações. A hospedagem saiu limpa. Os achados: chaves e tabelas abertas nos aplicativos.",false,"md",[702,705,708,710,713],{"q":703,"a":704},"O Bolt é seguro de usar?","Na parte que o Bolt controla, nossos números dizem que sim. Em 1.123 aplicativos no ar no bolt.host não encontramos nenhum certificado com defeito nem domínio perto de expirar, 13 aplicativos publicavam source maps e um deixava qualquer site chamar a sua API. O que decide o seu aplicativo está dentro dele: se uma chave que gera cobrança foi parar no código que os visitantes baixam, e se as suas tabelas respondem a um desconhecido. São duas configurações que você mesmo pode conferir.",{"q":706,"a":707},"Os aplicativos Bolt são seguros por padrão?","O que o Bolt publica por você saiu limpo no nosso escaneamento. O resto depende do que aconteceu no chat. O Bolt deveria guardar uma chave de API paga no painel Secrets, atrás de uma função de servidor, e tem uma verificação de banco de dados que procura Row Level Security faltando. Nenhuma das duas roda sozinha: a auditoria do projeto é um botão no menu Publish dos planos pagos, e a verificação do banco é uma seção que você abre. Em agosto de 2026, 75 de 1.123 aplicativos Bolt tinham algo com cara de chave no front end, e 27 dos 35 bancos que conseguimos consultar responderam a um desconhecido.",{"q":397,"a":709},"De fora, não vemos como cada chave chegou lá. O caminho que conseguimos apontar é a variável de ambiente. Uma variável cujo nome começa com VITE_ é escrita no JavaScript que todo visitante baixa, e o Vite, a ferramenta de build por trás desse prefixo, diz que essas variáveis nunca devem conter uma chave de API. Para o endereço de um projeto ou uma chave publicável, isso não faz mal. Para uma chave da OpenAI, é uma fatura. Dez dos 1.123 aplicativos Bolt que escaneamos entregavam uma.",{"q":711,"a":712},"Meus dados do Supabase estão seguros num aplicativo Bolt?","Depende de uma configuração por tabela. Quando um aplicativo Bolt fala com o Supabase a partir da página, ele usa uma chave publicável feita para ser pública, então só a Row Level Security decide o que um desconhecido recebe. Conseguimos pedir linhas a 35 bancos Bolt sem login, e 27 entregaram. É uma contagem, e a base é pequena demais para virar porcentagem. As suas próprias policies você lê em poucos minutos.",{"q":714,"a":715},"O Bolt é mais seguro que o Lovable?","Do lado da plataforma, ficaram empatados: 13 de 1.123 aplicativos Bolt e 225 de 18.553 aplicativos Lovable publicavam source maps, pouco mais de um em cada cem nos dois casos, e nenhum tinha problema de certificado ou de domínio. A diferença foram as chaves. Dez dos 1.123 aplicativos Bolt traziam uma chave da OpenAI, contra 18 de 18.554 no Lovable. Dez é um número pequeno, então leia isso como uma direção. A comparação completa dos cinco builders está num artigo à parte.","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",[718,719,720,721,722,723,724,725],"bolt é seguro","segurança bolt.new","bolt.new é seguro","segurança de aplicativos bolt","aplicativos bolt são seguros","segurança bolt supabase","problemas de segurança do bolt","segurança do deploy bolt",{},true,"\u002Fblog\u002Fis-bolt-safe","2026-10-02",{"title":5,"description":698},"blog\u002Fis-bolt-safe",[733,734,735],"O Bolt é seguro? Em tudo o que o próprio Bolt decide, sim. Em 1.123 aplicativos Bolt no ar encontramos 13 publicando seus source maps, um que deixava qualquer site chamar a sua API e nenhum certificado com defeito.","75 desses aplicativos entregavam algo com cara de chave no código que um visitante baixa. A maioria eram chaves do Google, que costumam estar certas. Dez eram chaves da OpenAI, e quem encontra uma pode gastar com ela.","Dos 35 bancos de dados Bolt que conseguimos de fato consultar, 27 entregaram linhas a uma requisição sem login. Os dois problemas são configurações do seu próprio projeto.","yiRMIPQIzRc9kAvfzKO2M32W--VbuKk7gC7I6j5ccIE",[738,744,750,756,762,768,774,780,786,792,793,799,805,811,818,824,830,835,841,847,853,859,865,871,877,882,888,894,900,906,912,918,923,929,935,941,947,953,959,964,969,975,981,987,993,999,1005,1011,1016,1022,1028,1034,1039,1044,1050,1054,1060,1066,1071,1076,1082],{"path":739,"title":740,"description":741,"published":742,"category":695,"image":743,"draft":699},"\u002Fblog\u002Fstorage-upload-violates-row-level-security","\"Row-level security policy for table objects\" ao enviar","\"New row violates row-level security policy for table objects\" quer dizer que o seu envio não tem regra insert. Deixar o bucket público não cria nenhuma.","2026-10-11","\u002Fblog\u002Fstorage-upload-violates-row-level-security\u002Fcard-800x500.png",{"path":745,"title":746,"description":747,"published":748,"category":695,"image":749,"draft":699},"\u002Fblog\u002Fbase44-security-scan","Scan de segurança do Base44: o que só ele enxerga","O scan de segurança do Base44 verifica sete tipos de problema por dentro. Esta é a metade que ele lê e mais ninguém, e a metade que ele nunca olha.","2026-10-10","\u002Fblog\u002Fbase44-security-scan\u002Fcard-800x500.png",{"path":751,"title":752,"description":753,"published":754,"category":695,"image":755,"draft":699},"\u002Fblog\u002Fapi-key-leaked-what-to-do","Sua chave de API vazou. A ordem em que agir","Uma chave de API vazou e você não sabe o que fazer primeiro. Nem toda chave no seu frontend é um vazamento, e a ordem importa mais que a pressa.","2026-10-09","\u002Fblog\u002Fapi-key-leaked-what-to-do\u002Fcard-800x500.png",{"path":757,"title":758,"description":759,"published":760,"category":695,"image":761,"draft":699},"\u002Fblog\u002Finfinite-recursion-in-policy-for-relation","\"Infinite recursion detected in policy\" sem desligar o RLS","\"Infinite recursion detected in policy for relation\" significa que a sua policy perguntou à tabela que ela protege. Veja como quebrar o círculo.","2026-10-08","\u002Fblog\u002Finfinite-recursion-in-policy-for-relation\u002Fcard-800x500.png",{"path":763,"title":764,"description":765,"published":766,"category":695,"image":767,"draft":699},"\u002Fblog\u002Fno-api-key-found-in-request","\"No API key found in request\" no Supabase, e a correção errada","\"No API key found in request\" significa que sua requisição chegou ao Supabase sem chave. Quase toda resposta aponta para as regras do seu banco.","2026-10-07","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",{"path":769,"title":770,"description":771,"published":772,"category":695,"image":773,"draft":699},"\u002Fblog\u002Fis-base44-safe","O Base44 é seguro? O que vimos em 5.442 apps Base44","O Base44 é seguro? Rodamos nove verificações em 5.442 apps Base44 no ar. Quase todas tiraram B por motivos que o dono nunca escolheu.","2026-10-06","\u002Fblog\u002Fis-base44-safe\u002Fcard-800x500.png",{"path":775,"title":776,"description":777,"published":778,"category":695,"image":779,"draft":699},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Esconder uma chave de API: mova para uma Edge Function do Supabase","Esconder uma chave de API é tirá-la do navegador, e uma Edge Function do Supabase é o menor lugar para guardá-la. Dois passos em volta pesam mais.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":781,"title":782,"description":783,"published":784,"category":695,"image":785,"draft":699},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Seu arquivo .env está exposto? Os doze caminhos para testar","Seu arquivo .env está exposto no seu próprio servidor web? Doze endereços dizem isso em um minuto, e um acerto significa que tudo nele já é público.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":787,"title":788,"description":789,"published":790,"category":695,"image":791,"draft":699},"\u002Fblog\u002Fis-v0-safe","Segurança do v0: os 1.790 aplicativos v0 escaneados tiraram A","A segurança do v0 medida em 1.790 aplicativos v0 no ar: todos tiraram A. Só 17 citavam um banco de dados, e é sobretudo isso que esse A mede.","2026-10-03","\u002Fblog\u002Fis-v0-safe\u002Fcard-800x500.png",{"path":728,"title":5,"description":698,"published":729,"category":695,"image":716,"draft":699},{"path":794,"title":795,"description":796,"published":797,"category":695,"image":798,"draft":699},"\u002Fblog\u002Fis-supabase-down-or-your-app","O Supabase caiu ou o problema é o seu app? Como saber","O Supabase caiu ou o problema é o seu app? Um projeto pausado, um banco cheio e um erro seu parecem iguais. Quatro verificações separam os casos.","2026-10-01","\u002Fblog\u002Fis-supabase-down-or-your-app\u002Fcard-800x500.png",{"path":800,"title":801,"description":802,"published":803,"category":695,"image":804,"draft":699},"\u002Fblog\u002Fdoes-supabase-encrypt-my-data","O Supabase criptografa meus dados? Sim. Veja o que isso impede","O Supabase criptografa os dados? Sim: AES-256 em repouso, TLS em trânsito, SOC 2 e ISO 27001. O que cada um cobre, e o vazamento que nenhum deles impede.","2026-09-30","\u002Fblog\u002Fdoes-supabase-encrypt-my-data\u002Fcard-800x500.png",{"path":806,"title":807,"description":808,"published":809,"category":695,"image":810,"draft":699},"\u002Fblog\u002Fsupabase-free-plan-limits","Quanto custa o Supabase? Os limites do plano gratuito","Quanto custa o Supabase: o plano gratuito tem 500 MB de banco, 5 GB de egress e nenhum backup. O que acontece em cada limite e o que o Pro de $25 muda.","2026-09-29","\u002Fblog\u002Fsupabase-free-plan-limits\u002Fcard-800x500.png",{"path":812,"title":813,"description":814,"published":815,"category":816,"image":817,"draft":699},"\u002Fblog\u002Ftest-your-supabase-backup","Teste o backup do seu Supabase antes do dia em que precisar","Como testar o backup do seu Supabase: restaurar num projeto de teste, contar as linhas, entrar e procurar a linha que falta num arquivo cortado.","2026-09-28","Backups","\u002Fblog\u002Ftest-your-supabase-backup\u002Fcard-800x500.png",{"path":819,"title":820,"description":821,"published":822,"category":816,"image":823,"draft":699},"\u002Fblog\u002Fsupabase-backup-github-action","Backup grátis do Supabase com uma GitHub Action, e a pegadinha","Um backup do Supabase com GitHub Action é grátis e serve para muitos apps. O workflow, a connection string certa e o egress de cada execução.","2026-09-27","\u002Fblog\u002Fsupabase-backup-github-action\u002Fcard-800x500.png",{"path":825,"title":826,"description":827,"published":828,"category":816,"image":829,"draft":699},"\u002Fblog\u002Fdownload-your-supabase-backup","Por que você não consegue baixar seu backup do Supabase","Você não consegue baixar seu backup do Supabase num projeto atual, porque a cópia diária é um snapshot físico. Como conferir e como ter uma cópia só sua.","2026-09-26","\u002Fblog\u002Fdownload-your-supabase-backup\u002Fcard-800x500.png",{"path":831,"title":832,"description":833,"published":828,"category":695,"image":834,"draft":699},"\u002Fblog\u002Fsupabase-permission-denied-for-table","Supabase \"permission denied for table\": o grant que falta","A partir de 30 de outubro, uma tabela nova no Supabase responde \"permission denied for table\" até receber um grant. O e-mail mostra só metade.","\u002Fblog\u002Fsupabase-permission-denied-for-table\u002Fcard-800x500.png",{"path":836,"title":837,"description":838,"published":839,"category":695,"image":840,"draft":699},"\u002Fblog\u002Fopen-api-endpoint-exposed","Um endpoint de API aberto é um problema? Leia o JSON","Seu scan apontou um endpoint de API aberto. Se isso importa depende do que voltou, e a maioria dos que encontramos era da própria plataforma.","2026-09-25","\u002Fblog\u002Fopen-api-endpoint-exposed\u002Fcard-800x500.png",{"path":842,"title":843,"description":844,"published":845,"category":695,"image":846,"draft":699},"\u002Fblog\u002Flovable-security-scan","Escaneamento de segurança do Lovable: o que ele não prova","Escaneamento de segurança do Lovable: o que o Quick scan e o Deep scan checam, quando cada um roda, e a única coisa que nenhum escaneamento por dentro prova.","2026-09-24","\u002Fblog\u002Flovable-security-scan\u002Fcard-800x500.png",{"path":848,"title":849,"description":850,"published":851,"category":816,"image":852,"draft":699},"\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","\u002Fblog\u002Fsupabase-backup-auth-users\u002Fcard-800x500.png",{"path":854,"title":855,"description":856,"published":857,"category":695,"image":858,"draft":699},"\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":860,"title":861,"description":862,"published":863,"category":695,"image":864,"draft":699},"\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":866,"title":867,"description":868,"published":869,"category":695,"image":870,"draft":699},"\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":872,"title":873,"description":874,"published":875,"category":695,"image":876,"draft":699},"\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":431,"title":878,"description":879,"published":880,"category":695,"image":881,"draft":699},"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":883,"title":884,"description":885,"published":886,"category":695,"image":887,"draft":699},"\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":889,"title":890,"description":891,"published":892,"category":695,"image":893,"draft":699},"\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":895,"title":896,"description":897,"published":898,"category":695,"image":899,"draft":699},"\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":901,"title":902,"description":903,"published":904,"category":816,"image":905,"draft":699},"\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":907,"title":908,"description":909,"published":910,"category":816,"image":911,"draft":699},"\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":913,"title":914,"description":915,"published":916,"category":816,"image":917,"draft":699},"\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":676,"title":919,"description":920,"published":921,"category":695,"image":922,"draft":699},"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":924,"title":925,"description":926,"published":927,"category":695,"image":928,"draft":699},"\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":930,"title":931,"description":932,"published":933,"category":695,"image":934,"draft":699},"\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":936,"title":937,"description":938,"published":939,"category":695,"image":940,"draft":699},"\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":942,"title":943,"description":944,"published":945,"category":695,"image":946,"draft":699},"\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":948,"title":949,"description":950,"published":951,"category":695,"image":952,"draft":699},"\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":954,"title":955,"description":956,"published":957,"category":695,"image":958,"draft":699},"\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":236,"title":960,"description":961,"published":962,"category":695,"image":963,"draft":699},"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":379,"title":965,"description":966,"published":967,"category":695,"image":968,"draft":699},"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":970,"title":971,"description":972,"published":973,"category":695,"image":974,"draft":699},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","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":976,"title":977,"description":978,"published":979,"category":816,"image":980,"draft":699},"\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":982,"title":983,"description":984,"published":985,"category":695,"image":986,"draft":699},"\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":988,"title":989,"description":990,"published":991,"category":816,"image":992,"draft":699},"\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":994,"title":995,"description":996,"published":997,"category":695,"image":998,"draft":699},"\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":1000,"title":1001,"description":1002,"published":1003,"category":695,"image":1004,"draft":699},"\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":1006,"title":1007,"description":1008,"published":1009,"category":695,"image":1010,"draft":699},"\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":268,"title":1012,"description":1013,"published":1014,"category":695,"image":1015,"draft":699},"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":1017,"title":1018,"description":1019,"published":1020,"category":816,"image":1021,"draft":699},"\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":1023,"title":1024,"description":1025,"published":1026,"category":816,"image":1027,"draft":699},"\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":1029,"title":1030,"description":1031,"published":1032,"category":695,"image":1033,"draft":699},"\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":372,"title":1035,"description":1036,"published":1037,"category":695,"image":1038,"draft":699},"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":639,"title":1040,"description":1041,"published":1042,"category":816,"image":1043,"draft":699},"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":1045,"title":1046,"description":1047,"published":1048,"category":695,"image":1049,"draft":699},"\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":258,"title":1051,"description":1052,"published":1048,"category":695,"image":1053,"draft":699},"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":1055,"title":1056,"description":1057,"published":1058,"category":695,"image":1059,"draft":699},"\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":1061,"title":1062,"description":1063,"published":1064,"category":816,"image":1065,"draft":699},"\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":482,"title":1067,"description":1068,"published":1069,"category":695,"image":1070,"draft":699},"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":1072,"title":1073,"description":1074,"published":1069,"category":816,"image":1075,"draft":699},"\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":1077,"title":1078,"description":1079,"published":1080,"category":816,"image":1081,"draft":699},"\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":1083,"title":1084,"description":1085,"published":1080,"category":695,"image":1086,"draft":699},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","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",1791705963246]