[{"data":1,"prerenderedAt":655},["ShallowReactive",2],{"blog-pt-vibe-coding-security-scanner":3,"blog-index-pt":412},{"id":4,"title":5,"body":6,"category":365,"cover":366,"coverAlt":367,"description":368,"draft":369,"extension":370,"faq":371,"image":389,"keywords":390,"meta":400,"navigation":401,"ogTitle":402,"path":403,"published":404,"seo":405,"stem":406,"tldr":407,"updated":404,"__hash__":411},"blog_pt\u002Fblog\u002Fvibe-coding-security-scanner.md","Scanner de segurança para vibe coding: o que ele não vê",{"type":7,"value":8,"toc":353},"minimark",[9,13,21,24,29,32,35,38,41,45,48,126,132,135,144,148,151,157,163,169,175,178,182,185,188,193,196,209,213,216,278,285,288,292,295,298,301,311,315,337,345],[10,11,12],"p",{},"Você cola o endereço do seu app num scanner, espera uns vinte segundos e volta\numa letra. A, talvez C. Aí chega a pergunta que realmente importa: isso quer\ndizer que meu app está bem?",[10,14,15,16,20],{},"Aqui está a parte que a maioria das ferramentas dessa categoria deixa para você\ndescobrir sozinho. ",[17,18,19],"strong",{},"Um scanner de segurança para vibe coding lê seu app da\nrua."," Ele vê o que o navegador de qualquer visitante vê, que é bastante coisa, e\npara na sua porta da frente. O que seu servidor faz em particular continua\nparticular para ele também.",[10,22,23],{},"Saber onde essa linha passa é o que faz uma varredura valer a pena. Um A diz que\nas portas voltadas para a rua estavam fechadas quando olhamos, e não diz nada a\nrespeito do cômodo lá atrás.",[25,26,28],"h2",{"id":27},"o-que-é-um-scanner-de-segurança-para-vibe-coding","O que é um scanner de segurança para vibe coding?",[10,30,31],{},"Uma ferramenta que carrega seu app no ar como um visitante faria e depois lê o\nque voltou.",[10,33,34],{},"Você dá uma URL a ela. Ela não pede seu código-fonte, seu repositório, a senha do\nseu banco de dados nem uma conta no builder que você usou. Ela busca sua página,\ndeixa o JavaScript rodar para enxergar o código que seu app realmente entrega, lê\nos cabeçalhos que vieram com a resposta, olha seu certificado e faz ao seu banco\nde dados e ao seu armazenamento de arquivos algumas perguntas que qualquer\ndesconhecido poderia fazer.",[10,36,37],{},"Depois anota o que respondeu. É essa a forma toda da coisa, e é por isso que\nleva vinte segundos em vez de uma semana.",[10,39,40],{},"Essa categoria existe porque apps construídos com Lovable, Bolt, v0, Cursor,\nReplit, Windsurf e Base44 dão errado no mesmo punhado de lugares, e quase todos\nesses lugares são visíveis de fora. Uma chave secreta no bundle. Uma tabela que\nresponde a um desconhecido. Um bucket de armazenamento que lista o próprio\nconteúdo. Ninguém precisa do seu código-fonte para achar qualquer um deles,\nporque seu app os entrega a cada visitante por construção.",[25,42,44],{"id":43},"o-que-uma-varredura-realmente-lê","O que uma varredura realmente lê",[10,46,47],{},"Cinco superfícies, e seus próprios visitantes baixam quatro delas sem perceber.",[49,50,51,67],"table",{},[52,53,54],"thead",{},[55,56,57,61,64],"tr",{},[58,59,60],"th",{},"O que ela lê",[58,62,63],{},"De onde isso vem",[58,65,66],{},"O que isso pega",[68,69,70,82,93,104,115],"tbody",{},[55,71,72,76,79],{},[73,74,75],"td",{},"Seu bundle de JavaScript",[73,77,78],{},"Os arquivos que um navegador baixa para rodar seu app",[73,80,81],{},"Chaves entregues ao navegador, os caminhos de API que ele chama, nomes de tabelas que usa",[55,83,84,87,90],{},[73,85,86],{},"Seus cabeçalhos de resposta",[73,88,89],{},"Vão junto com cada página que sua hospedagem serve",[73,91,92],{},"Proteções do navegador ausentes, uma regra que responde a pedidos de qualquer site",[55,94,95,98,101],{},[73,96,97],{},"As respostas do seu banco",[73,99,100],{},"A mesma API de projeto que o seu próprio app chama",[73,102,103],{},"Uma tabela entregando linhas a um pedido sem ninguém logado",[55,105,106,109,112],{},[73,107,108],{},"Seus buckets de storage",[73,110,111],{},"A mesma API pública de armazenamento por onde seu app envia",[73,113,114],{},"Um bucket que lista os próprios arquivos para um desconhecido",[55,116,117,120,123],{},[73,118,119],{},"Certificado e domínio",[73,121,122],{},"O handshake TLS e o registro público no registro de domínios",[73,124,125],{},"Um certificado perto de expirar, um domínio perto de vencer",[127,128],"diagram",{"alt":129,"caption":130,"src":131},"Uma marca de scanner à esquerda alcança cinco painéis por linhas contínuas na cor de destaque. Uma linha vertical atravessa a imagem, e atrás dela ficam outros quatro painéis desenhados como contornos tracejados, cada um com sua linha parando na barra e levando ali um xis.","Cinco superfícies chegam a um navegador, então uma varredura consegue lê-las. As quatro atrás da barra nunca saem do seu servidor, então nada de fora consegue.","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fwhere-the-scan-stops-1600x820.png",[10,133,134],{},"O bundle é o que surpreende as pessoas. O código do seu app precisa chegar ao\nnavegador antes de rodar lá, então cada chave dentro dele também chega, junto com\nos caminhos de API que ele chama e muitas vezes os nomes das tabelas que ele lê.\nUm scanner aperta o mesmo F12 que um visitante curioso apertaria. Ele só é mais\nrápido, e lê todos os arquivos em vez do primeiro.",[10,136,137,138,143],{},"A pergunta ao banco de dados é a que todo mundo imagina invasiva, e é a coisa\nmais mansa da lista. Para descobrir se uma tabela é legível por desconhecidos, o\nnosso pede à API uma contagem das linhas e lê o número num cabeçalho de resposta.\nUma contagem acima de zero significa que aquelas linhas estão alcançáveis. Nunca\nse busca uma linha, e a chave com que ele pergunta é a publicável que já está no\nseu bundle, que\n",[139,140,142],"a",{"href":141},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","deveria mesmo estar ali",".",[25,145,147],{"id":146},"as-quatro-coisas-que-uma-varredura-de-url-não-consegue-ver","As quatro coisas que uma varredura de URL não consegue ver",[10,149,150],{},"Tudo o que acontece no seu servidor, porque nada disso é enviado a um navegador.",[10,152,153,156],{},[17,154,155],{},"Seu código de servidor."," Edge functions, rotas de API, funções de banco, tudo\no que roda dentro do Supabase ou na sua hospedagem. Um scanner pode chamar um\nendpoint e ler o que volta. Ele não pode ler o código que produziu aquilo, então\num erro que só aparece com certas entradas fica invisível.",[10,158,159,162],{},[17,160,161],{},"Suas variáveis de ambiente."," As chaves que você deixou no servidor, que é\nexatamente onde elas pertencem. Uma varredura pode dizer que não achou um segredo\nno seu bundle. Ela não pode confirmar que o segredo está guardado direito, porque\nnunca enxerga o lugar onde você o guardou.",[10,164,165,168],{},[17,166,167],{},"Seu histórico de versões."," Uma chave que você commitou em março e tirou em\nabril sumiu do seu app e continua no seu repositório. Quem puder ver esse\nrepositório ainda consegue lê-la, e nenhum tanto de olhar para o seu site no ar\nvai fazer ela aparecer.",[10,170,171,174],{},[17,172,173],{},"A lógica do seu próprio app."," Se um usuário logado consegue abrir o pedido de\noutro trocando um número no endereço. Se um formulário vai aceitar um preço que o\nnavegador mandou. São decisões que o seu app toma sobre o que permitir, e pegar\nisso exige entrar na conta e testar coisas, o que é um teste de intrusão.",[10,176,177],{},"Existe um quinto limite que é nosso e não da categoria, e vale conhecer antes de\nler um dos nossos relatórios. O Supabase não entrega mais a lista de tabelas de\num projeto a uma chave publicável, então um scanner não tem como perguntar como\nsuas tabelas se chamam. O nosso trabalha com três fontes no lugar disso: o índice\ndo projeto em projetos mais antigos, onde ele ainda responde, os nomes de tabela\nque ele acha no seu próprio bundle, e uma lista de vinte e seis nomes comuns em\napps feitos com vibe coding. Uma tabela aberta com um nome incomum que nunca\naparece no seu código de frontend é uma que não vamos alcançar. O advisor do\npróprio Supabase alcança, e essa é a comparação de duas seções abaixo.",[25,179,181],{"id":180},"uma-varredura-limpa-quer-dizer-que-meu-app-é-seguro","Uma varredura limpa quer dizer que meu app é seguro?",[10,183,184],{},"Não. Quer dizer que toda pergunta que a varredura conseguiu fazer de fora voltou\nlimpa, e essa é uma frase menor do que parece.",[10,186,187],{},"Parte do motivo são os quatro pontos cegos acima. A outra parte é que uma\nverificação pode terminar de três jeitos e só um deles é aprovação. Uma\nverificação acha alguma coisa. Uma verificação pergunta e recebe um não claro. Ou\numa verificação não recebe resposta nenhuma, porque o pedido expirou, o host\nrecusou ou a página nunca terminou de carregar.",[127,189],{"alt":190,"caption":191,"src":192},"Um painel de relatório com cinco linhas. Três levam um tique verde, uma leva um xis vermelho, e a última tem uma linha tracejada onde iria uma marca e nenhum veredito.","O terceiro final é o que se deve procurar. Uma verificação que não obteve resposta é desenhada como ausência de resposta, porque um tique ali é uma promessa sobre uma pergunta que ninguém conseguiu fazer.","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fthree-endings-1600x760.png",[10,194,195],{},"Esse terceiro final é o que decide se dá para confiar num relatório, e é o mais\nfácil de arredondar em silêncio para um tique. O nosso escreve «Não foi possível\nverificar» na linha e deixa sua nota em paz. Um tique falso seria a coisa mais\ndanosa que este scanner poderia colocar numa tela, porque você agiria em cima\ndela.",[10,197,198,199,203,204,208],{},"É essa mesma honestidade que faz nossos próprios números publicados soarem menos\nalarmantes do que parecem à primeira vista. Entre 12 e 14 de agosto de 2026\nrodamos essas verificações em\n",[139,200,202],{"href":201},"\u002Fresearch\u002Fvibe-coded-app-security-2026","30.998 apps no ar feitos com vibe coding",",\ne 99% voltaram com pelo menos um achado. Quase tudo isso é uma linha só:\ncabeçalhos de segurança do navegador que a plataforma de hospedagem nunca define\ne que a maioria dos donos num subdomínio de builder\n",[139,205,207],{"href":206},"\u002Fblog\u002Fmissing-security-headers","não consegue ligar por conta própria",". Contar\nisso está certo. Ler os 99% como «quase todo app está em perigo» não está.",[25,210,212],{"id":211},"varredura-de-url-de-repositório-ou-o-advisor-do-supabase","Varredura de URL, de repositório ou o advisor do Supabase?",[10,214,215],{},"Eles leem três coisas diferentes, então a pergunta útil é qual deles consegue ver\no problema que você tem.",[49,217,218,234],{},[52,219,220],{},[55,221,222,225,228,231],{},[58,223,224],{},"Tipo",[58,226,227],{},"O que lê",[58,229,230],{},"O que pede de você",[58,232,233],{},"Onde é cego",[68,235,236,250,264],{},[55,237,238,241,244,247],{},[73,239,240],{},"Scanner de URL",[73,242,243],{},"Seu app no ar, de fora",[73,245,246],{},"Uma URL",[73,248,249],{},"Tudo o que seu servidor guarda para si",[55,251,252,255,258,261],{},[73,253,254],{},"Scanner de repositório",[73,256,257],{},"Seu código-fonte e o histórico dele",[73,259,260],{},"Acesso ao seu repo",[73,262,263],{},"Se aquele código está publicado e o que suas regras fazem em produção",[55,265,266,269,272,275],{},[73,267,268],{},"Supabase Security Advisor",[73,270,271],{},"A configuração daquele projeto",[73,273,274],{},"Sua conta do Supabase",[73,276,277],{},"Tudo fora do projeto: bundle, cabeçalhos, outros fornecedores",[10,279,280,281,143],{},"Eles se sobrepõem bem menos do que os nomes sugerem. O advisor do Supabase\npercorre seu projeto e reporta problemas de configuração, entre eles tabelas com\na Row Level Security mal configurada. Uma varredura de URL lê a consequência, que\né se aquelas linhas estão chegando a desconhecidos agora mesmo. Os dois se\nseparam com mais frequência do que se esperaria, porque\n",[139,282,284],{"href":283},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","ligar a configuração não é o mesmo que estar protegido",[10,286,287],{},"Um scanner de repositório é o único dos três capaz de achar a chave que você\napagou mês passado. Também é o único que não consegue dizer se o código que ele\nacabou de ler é o código que você publicou.",[25,289,291],{"id":290},"como-ler-a-nota","Como ler a nota",[10,293,294],{},"A letra é limitada pelo pior achado do relatório, então uma boa pontuação nunca\nsalva um achado grave.",[10,296,297],{},"Toda varredura começa em 100. Um achado crítico custa 40 pontos, um alto 15, um\nmédio 5, um baixo 1. Depois um teto se assenta sobre a aritmética: um achado\ncrítico limita a nota em D, dois limitam em F, e um único achado alto limita em\nC. Um app no mais tudo em ordem com uma única tabela aberta sai como D, e esse é\no comportamento pretendido.",[10,299,300],{},"O que você acertou aparece no relatório e não te custa nada. Sua chave publicável\ndo Supabase ali no bundle é listada como correta, porque é para isso que ela\nserve, e pintá-la de vermelho é o jeito de uma ferramenta te ensinar a ignorar o\nvermelho.",[302,303,305],"callout",{"type":304},"warn",[10,306,307,310],{},[17,308,309],{},"Uma nota descreve o app que estava no ar quando você perguntou."," A Row Level\nSecurity é desligada para uma página carregar, uma chave de servidor é colada no\nfrontend para um recurso sair hoje à noite, um bucket é aberto para um upload e\nfica aberto. Nenhum deles se anuncia, e cada um basta para mover uma nota de A\npara F entre uma terça e a seguinte.",[25,312,314],{"id":313},"o-que-fazer-com-o-resultado-de-uma-varredura","O que fazer com o resultado de uma varredura",[316,317,318],"key-takeaways",{},[319,320,321,325,328,331,334],"ul",{},[322,323,324],"li",{},"Leia primeiro as linhas que dizem «Não foi possível verificar». São as perguntas ainda abertas, e não são aprovação.",[322,326,327],{},"Trabalhe por gravidade. Um achado crítico quer dizer que hoje dá para chegar aos seus dados; um cabeçalho ausente é uma configuração que ninguém ligou.",[322,329,330],{},"Cuide do lado de dentro à parte: mantenha as chaves secretas no servidor, vasculhe seu próprio histórico de versões atrás de chaves apagadas, e entre como usuário de teste para ver até onde ele chega.",[322,332,333],{},"Escaneie de novo depois de cada publicação, e sempre que alguém mexer numa regra do banco. É a mudança sobre a qual nada te avisa.",[322,335,336],{},"Se seu app recebe pagamentos ou guarda dados de saúde, contrate um teste de intrusão em algum momento. Uma verificação externa automática não é uma auditoria, e nenhuma ausência de achados é garantia.",[10,338,339,340,344],{},"Nosso ",[139,341,343],{"href":342},"\u002Fsecurity-scanner","scanner de segurança de site gratuito"," roda nove\nverificações somente de leitura em qualquer URL no ar, em uns vinte segundos e\nsem conta. Ele lê, nunca escreve e nunca entra na conta.",[10,346,347,348,352],{},"Se você preferir passar por isso na mão primeiro, o\n",[139,349,351],{"href":350},"\u002Fchecklist","checklist de segurança de 10 minutos"," cobre o mesmo terreno na ordem\nem que vale a pena fazer.",{"title":354,"searchDepth":355,"depth":355,"links":356},"",3,[357,359,360,361,362,363,364],{"id":27,"depth":358,"text":28},2,{"id":43,"depth":358,"text":44},{"id":146,"depth":358,"text":147},{"id":180,"depth":358,"text":181},{"id":211,"depth":358,"text":212},{"id":290,"depth":358,"text":291},{"id":313,"depth":358,"text":314},"Noções de segurança","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcover-1200x630.png","Uma janela de app iluminada vista de frente, e atrás dela outras duas janelas que recuam para a sombra, ilegíveis.","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.",false,"md",[372,374,377,380,383,386],{"q":28,"a":373},"Uma ferramenta que carrega seu app no ar como um visitante faria e lê o que volta: o JavaScript que seu app entrega ao navegador, os cabeçalhos que sua hospedagem manda junto, o certificado e as respostas que seu banco de dados e seu armazenamento de arquivos dão a uma requisição vinda de um desconhecido. Ela precisa de uma URL e de mais nada. Ela relata o que achou na superfície pública do seu app, que é justamente onde apps construídos com IA dão errado com mais frequência.",{"q":375,"a":376},"É seguro escanear meu próprio app?","É, desde que o scanner só leia. O nosso faz o mesmo tipo de requisição que um visitante comum faz, nunca entra na conta, nunca escreve, cria ou apaga nada em lugar nenhum e nunca baixa os dados dos seus usuários. Para testar se uma tabela do banco é legível, ele pede uma contagem das linhas e lê o número, sem buscar uma única linha. O tráfego é um punhado de requisições, menos do que uma pessoa navegando no seu site por um minuto.",{"q":378,"a":379},"Uma varredura precisa do meu código-fonte ou da senha do meu banco?","Não. Um scanner de URL trabalha inteiramente de fora, então não há nada a conectar e nenhuma credencial a entregar. Esse também é o limite dele: só enxerga o que seu app já mostra a qualquer visitante. Uma ferramenta que lê seu repositório ou se conecta à conta do seu banco enxerga outras coisas, e o artigo acima coloca as três lado a lado.",{"q":381,"a":382},"Funciona com Lovable, Bolt, Cursor, Replit, v0, Windsurf e Base44?","Funciona, e com qualquer outra coisa que coloque um site no ar, porque a varredura olha o que está publicado e não o que escreveu aquilo. O builder importa para o conserto mais do que para a verificação: consertar uma tabela aberta é uma sequência de cliques diferente no Lovable e no Replit, e é por isso que o texto do conserto nomeia o seu builder.",{"q":384,"a":385},"O que um scanner de segurança não verifica?","Tudo o que fica no seu servidor. Seu código de servidor e suas funções de banco, as variáveis de ambiente que você manteve fora do navegador, a chave que você commitou e depois apagou do repositório, e os bugs da sua própria lógica, como um usuário logado conseguir abrir o pedido de outro trocando um número no endereço. Achar esse último grupo exige entrar na conta e testar coisas, e isso é um teste de intrusão e não uma varredura.",{"q":387,"a":388},"Um scanner de segurança para vibe coding é gratuito?","O nosso é, pelo menos a varredura em si: você recebe a nota, a pontuação e a quantidade de achados na tela em cerca de 20 segundos, sem conta, e os achados detalhados com os consertos depois de informar um e-mail. Existem planos pagos para o que uma varredura única não faz, que é perceber quando algo mudar no mês que vem. Uma nota é verdadeira no segundo em que você a tira.","\u002Fblog\u002Fvibe-coding-security-scanner\u002Fcard-800x500.png",[391,392,393,394,395,396,397,343,398,399],"scanner de segurança para vibe coding","scanner vibe code","scanner de segurança de app com ia","scanner de segurança para apps gerados por ia","escanear meu app lovable em busca de falhas","varredura de segurança app bolt","scanner de segurança app replit","verificar chaves api expostas do meu app","meu app feito com vibe coding é seguro",{},true,"O que um scanner de segurança para vibe coding não vê","\u002Fblog\u002Fvibe-coding-security-scanner","2026-09-05",{"title":5,"description":368},"blog\u002Fvibe-coding-security-scanner",[408,409,410],"Um scanner de segurança para vibe coding lê o que os navegadores dos seus visitantes já baixam: seu bundle, seus cabeçalhos, seu certificado e as respostas que seu banco de dados dá a um desconhecido.","Isso cobre justamente a classe de erros mais comum quando se constrói com IA. Não cobre nada do que acontece no seu servidor.","Um resultado limpo significa que toda pergunta que a varredura conseguiu fazer de fora voltou limpa. Encare como uma preocupação a menos.","aTuxzDmZk8-Fb0etEbZWAr03buIfWupDnBxqzuHsmco",[413,420,426,432,438,444,450,456,462,468,474,480,486,492,498,504,510,516,522,523,528,534,540,546,552,558,564,570,576,582,588,594,600,606,612,618,623,629,635,640,645,651],{"path":414,"title":415,"description":416,"published":417,"category":418,"image":419,"draft":369},"\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":421,"title":422,"description":423,"published":424,"category":365,"image":425,"draft":369},"\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":427,"title":428,"description":429,"published":430,"category":365,"image":431,"draft":369},"\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":433,"title":434,"description":435,"published":436,"category":365,"image":437,"draft":369},"\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":439,"title":440,"description":441,"published":442,"category":365,"image":443,"draft":369},"\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":445,"title":446,"description":447,"published":448,"category":365,"image":449,"draft":369},"\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":451,"title":452,"description":453,"published":454,"category":365,"image":455,"draft":369},"\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":457,"title":458,"description":459,"published":460,"category":365,"image":461,"draft":369},"\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":463,"title":464,"description":465,"published":466,"category":365,"image":467,"draft":369},"\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":469,"title":470,"description":471,"published":472,"category":418,"image":473,"draft":369},"\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":475,"title":476,"description":477,"published":478,"category":418,"image":479,"draft":369},"\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":481,"title":482,"description":483,"published":484,"category":418,"image":485,"draft":369},"\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":487,"title":488,"description":489,"published":490,"category":365,"image":491,"draft":369},"\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":493,"title":494,"description":495,"published":496,"category":365,"image":497,"draft":369},"\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":499,"title":500,"description":501,"published":502,"category":365,"image":503,"draft":369},"\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":505,"title":506,"description":507,"published":508,"category":365,"image":509,"draft":369},"\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":511,"title":512,"description":513,"published":514,"category":365,"image":515,"draft":369},"\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":517,"title":518,"description":519,"published":520,"category":365,"image":521,"draft":369},"\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":403,"title":5,"description":368,"published":404,"category":365,"image":389,"draft":369},{"path":206,"title":524,"description":525,"published":526,"category":365,"image":527,"draft":369},"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":529,"title":530,"description":531,"published":532,"category":365,"image":533,"draft":369},"\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":535,"title":536,"description":537,"published":538,"category":365,"image":539,"draft":369},"\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":541,"title":542,"description":543,"published":544,"category":418,"image":545,"draft":369},"\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":547,"title":548,"description":549,"published":550,"category":365,"image":551,"draft":369},"\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":553,"title":554,"description":555,"published":556,"category":418,"image":557,"draft":369},"\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":559,"title":560,"description":561,"published":562,"category":365,"image":563,"draft":369},"\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":565,"title":566,"description":567,"published":568,"category":365,"image":569,"draft":369},"\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":571,"title":572,"description":573,"published":574,"category":365,"image":575,"draft":369},"\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":577,"title":578,"description":579,"published":580,"category":365,"image":581,"draft":369},"\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":583,"title":584,"description":585,"published":586,"category":418,"image":587,"draft":369},"\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":589,"title":590,"description":591,"published":592,"category":418,"image":593,"draft":369},"\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":595,"title":596,"description":597,"published":598,"category":365,"image":599,"draft":369},"\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":601,"title":602,"description":603,"published":604,"category":365,"image":605,"draft":369},"\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":607,"title":608,"description":609,"published":610,"category":418,"image":611,"draft":369},"\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":613,"title":614,"description":615,"published":616,"category":365,"image":617,"draft":369},"\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":619,"title":620,"description":621,"published":616,"category":365,"image":622,"draft":369},"\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":624,"title":625,"description":626,"published":627,"category":365,"image":628,"draft":369},"\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":630,"title":631,"description":632,"published":633,"category":418,"image":634,"draft":369},"\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":283,"title":636,"description":637,"published":638,"category":365,"image":639,"draft":369},"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":641,"title":642,"description":643,"published":638,"category":418,"image":644,"draft":369},"\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":646,"title":647,"description":648,"published":649,"category":418,"image":650,"draft":369},"\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":141,"title":652,"description":653,"published":649,"category":365,"image":654,"draft":369},"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",1790150955880]