[{"data":1,"prerenderedAt":871},["ShallowReactive",2],{"blog-pt-vibe-coded-app-security-checklist":3,"blog-index-pt":637},{"id":4,"title":5,"body":6,"category":589,"cover":590,"coverAlt":591,"description":592,"draft":593,"extension":594,"faq":595,"image":614,"keywords":615,"meta":625,"navigation":626,"ogTitle":627,"path":628,"published":629,"seo":630,"stem":631,"tldr":632,"updated":629,"__hash__":636},"blog_pt\u002Fblog\u002Fvibe-coded-app-security-checklist.md","O checklist de segurança do vibe coding, em nove verificações",{"type":7,"value":8,"toc":566},"minimark",[9,13,21,24,27,32,35,41,185,194,198,201,209,214,226,242,260,264,272,275,288,292,301,312,320,324,327,335,343,347,350,353,357,360,363,371,375,378,381,389,393,396,399,407,411,414,417,421,424,427,432,436,439,442,450,466,469,473,476,479,486,490,493,496,506,513,517,553],[10,11,12],"p",{},"Você está prestes a mandar o endereço do seu app para alguém, e uma vozinha diz\nque você devia conferir antes. Então você procura um checklist de segurança do\nvibe coding e encontra um com vinte e cinco itens, escrito por alguém que supõe\nque você já sabe o que é uma Content Security Policy.",[10,14,15,16,20],{},"Aqui está a parte que lista após lista erra: ",[17,18,19],"strong",{},"quase nada do que está nelas dá\npara verificar."," \"Use senhas fortes\" é um conselho. \"Limpe o código morto\" é\narrumação. \"Siga o princípio do menor privilégio\" é uma frase. Nenhum tem teste,\nentão nenhum pode ser terminado, e uma lista que você não consegue terminar é\numa preocupação com números em cima.",[10,22,23],{},"Este tem nove itens. Nove é a quantidade de coisas que qualquer pessoa consegue\nverificar de fora num app no ar, sem a sua senha, sem o seu repositório e sem a\nsua conta do Supabase. Cada um tem um teste que você mesmo pode fazer e cada\nteste volta com um sim ou um não.",[10,25,26],{},"Pense nisso como a volta que um piloto dá em torno de um avião antes de voar.\nÉ curta, tudo que está nela é visível do pátio, e não substitui nada do livro de\nmanutenção. A última seção deste artigo é sobre o livro.",[28,29,31],"h2",{"id":30},"o-que-deve-entrar-num-checklist-de-segurança-do-vibe-coding","O que deve entrar num checklist de segurança do vibe coding?",[10,33,34],{},"Nove perguntas, e são as nove que um estranho poderia fazer ao seu app esta\ntarde, tendo você conferido ou não.",[36,37],"diagram",{"alt":38,"caption":39,"src":40},"A marca da Reeve sobre uma fileira de nove ícones de contorno: uma chave, um cilindro de banco de dados, um documento, um cadeado, uma caixa com tampa, um par de colchetes de código, um globo, uma roseta de certificado e um calendário.","Os nove, na ordem em que as seções abaixo passam por eles. Todos são lidos de fora, e é isso que torna cada um deles verificável.","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fnine-checks-1600x420.png",[42,43,44,60],"table",{},[45,46,47],"thead",{},[48,49,50,54,57],"tr",{},[51,52,53],"th",{},"A verificação",[51,55,56],{},"O teste que você mesmo faz",[51,58,59],{},"O que significa se voltar errado",[61,62,63,89,100,119,130,141,152,163,174],"tbody",{},[48,64,65,69,86],{},[66,67,68],"td",{},"Chaves secretas no seu código",[66,70,71,72,76,77,76,80,76,83],{},"Busque no projeto ",[73,74,75],"code",{},"sk_",", ",[73,78,79],{},"sb_secret_",[73,81,82],{},"service_role",[73,84,85],{},"AKIA",[66,87,88],{},"Quem achar pode gastar seu dinheiro ou ler cada linha",[48,90,91,94,97],{},[66,92,93],{},"Regras do banco de dados",[66,95,96],{},"Supabase, depois o Security Advisor",[66,98,99],{},"Qualquer um com sua chave pública consegue ler aquelas linhas",[48,101,102,105,116],{},[66,103,104],{},"Arquivos privados",[66,106,107,108,111,112,115],{},"Abra ",[73,109,110],{},"\u002F.env"," e ",[73,113,114],{},"\u002F.git\u002Fconfig"," numa janela anônima",[66,117,118],{},"Cada chave que você achava no servidor dá para baixar",[48,120,121,124,127],{},[66,122,123],{},"Buckets de storage",[66,125,126],{},"Supabase, depois Storage, depois a coluna Public e as políticas",[66,128,129],{},"Um estranho recebe a lista do que seus usuários subiram",[48,131,132,135,138],{},[66,133,134],{},"Cabeçalhos de segurança",[66,136,137],{},"Um scan; este não tem versão pela barra de endereços",[66,139,140],{},"Seus visitantes ficam mais fáceis de atacar pela sua página",[48,142,143,146,149],{},[66,144,145],{},"Source maps publicados",[66,147,148],{},"Ferramentas de desenvolvedor, Sources, procure seus próprios arquivos",[66,150,151],{},"Seu código original dá para ler, comentários e tudo",[48,153,154,157,160],{},[66,155,156],{},"Seus próprios endereços de API",[66,158,159],{},"Abra um numa janela anônima sem estar logado",[66,161,162],{},"O que ele devolver é público",[48,164,165,168,171],{},[66,166,167],{},"Vencimento do certificado",[66,169,170],{},"Clique no cadeado, abra o certificado, leia \"Válido até\"",[66,172,173],{},"Os visitantes topam com um aviso do navegador em tela cheia",[48,175,176,179,182],{},[66,177,178],{},"Renovação do domínio",[66,180,181],{},"A data de vencimento no seu registrador, e se a renovação automática está ligada",[66,183,184],{},"O app some e o nome vai à venda",[10,186,187,188,193],{},"Nosso ",[189,190,192],"a",{"href":191},"\u002Fsecurity-scanner","scanner de segurança gratuito"," faz os nove em qualquer\nURL no ar em cerca de 20 segundos e sem conta, que é o caminho mais rápido para\na primeira passada. Ele lê, nunca faz login e nunca escreve nada. Cada item\nabaixo continua sendo algo que você pode conferir na mão, e os testes estão\nescritos para que você possa comparar uma linha do nosso relatório com o seu\npróprio painel.",[28,195,197],{"id":196},"os-quatro-antes-de-compartilhar-o-endereço","Os quatro antes de compartilhar o endereço",[10,199,200],{},"Chaves secretas, regras do banco de dados, arquivos privados e buckets de\nstorage. Nesses quatro o que fica exposto são seus dados ou seu dinheiro, e os\nquatro são seus para consertar e não da sua plataforma de hospedagem.",[10,202,203,204,208],{},"Três deles são as únicas verificações de todo o conjunto capazes de relatar um\nachado crítico, e a quarta é aquela em que o que fica exposto é o que seus\nusuários subiram. Entre 12 e 14 de agosto de 2026 rodamos as nove verificações\nem ",[189,205,207],{"href":206},"\u002Fresearch\u002Fvibe-coded-app-security-2026","30.998 apps de vibe coding no ar",", e\nos números de cada seção abaixo vêm dessa rodada.",[210,211,213],"h3",{"id":212},"_1-tem-uma-chave-secreta-no-código-que-seu-app-envia","1. Tem uma chave secreta no código que seu app envia?",[10,215,216,217,76,219,76,221,111,223,225],{},"Busque no projeto inteiro por ",[73,218,75],{},[73,220,79],{},[73,222,82],{},[73,224,85],{},". Uma\nocorrência dentro de qualquer coisa que o navegador baixa é o achado.",[10,227,228,229,232,233,236,237,241],{},"Tudo que seu app precisa para rodar num navegador chega nesse navegador, então\numa chave que esteja ali chega também. Algumas chaves pertencem a esse lugar:\numa chave Supabase ",[73,230,231],{},"anon"," ou ",[73,234,235],{},"sb_publishable_"," é um endereço e não uma\npermissão, e encontrar uma está certo.\n",[189,238,240],{"href":239},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quais chaves são seguras num frontend e quais não são","\né essa distinção inteira.",[10,243,244,245,247,248,250,251,254,255,259],{},"Uma chave secreta é do outro tipo. Uma chave Supabase ",[73,246,79],{}," ou\n",[73,249,82],{}," ignora qualquer regra de tabela que você já tenha escrito. Uma\nchave Stripe ",[73,252,253],{},"sk_live_"," move dinheiro. Encontramos uma chave dessa classe em 52\napps de 30.998, o que é raro e é a pior coisa desta lista quando acontece. Se a\nsua for uma delas,\n",[189,256,258],{"href":257},"\u002Fblog\u002Frotate-supabase-service-role-key","rotacione antes de fazer qualquer outra coisa",":\napagar a chave do seu código deixa o valor antigo funcionando.",[210,261,263],{"id":262},"_2-um-estranho-consegue-ler-seu-banco-de-dados","2. Um estranho consegue ler seu banco de dados?",[10,265,266,267,271],{},"No Supabase, abra o Security Advisor. Toda entrada dizendo que uma tabela é\npública mas a segurança por linha não está habilitada é uma tabela respondendo a\nqualquer um que perguntar, e\n",[189,268,270],{"href":269},"\u002Fblog\u002Fsupabase-rls-disabled-in-public","esse aviso exato"," tem um artigo só dele.",[10,273,274],{},"Row Level Security é a regra que decide, linha por linha, quem pode ver o quê.\nSem ela, a chave pública que está no seu app já basta para ler a tabela, e essa\nchave está no navegador de cada visitante por projeto.",[10,276,277,278,282,283,287],{},"É o achado sério mais comum de todo o conjunto: 2.096 dos 3.680 apps cujo\nprojeto Supabase nos respondeu, ou 57 %, tinham pelo menos uma tabela entregando\nlinhas para uma requisição sem ninguém logado.\n",[189,279,281],{"href":280},"\u002Fblog\u002Fenable-rls-on-every-supabase-table","Ligar em toda tabela"," é o conserto. O\nadvisor lê suas configurações e não as respostas do seu banco, então termine\nconferindo de fora: uma tabela pode estar com a configuração ligada e uma\npolítica que ",[189,284,286],{"href":285},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","deixa todo mundo passar mesmo assim",".",[210,289,291],{"id":290},"_3-qualquer-um-consegue-baixar-seus-arquivos-privados","3. Qualquer um consegue baixar seus arquivos privados?",[10,293,107,294,111,297,300],{},[73,295,296],{},"seuapp.com\u002F.env",[73,298,299],{},"seuapp.com\u002F.git\u002Fconfig"," numa janela anônima. Os dois\ndeveriam se recusar a abrir.",[10,302,303,304,307,308,311],{},"Um arquivo ",[73,305,306],{},".env"," é cada chave que você acreditava estar a salvo no servidor,\nnuma lista simples, num endereço adivinhável. Uma pasta ",[73,309,310],{},".git"," é o histórico do\nseu projeto. Nenhum dos dois deveria ser servido, e de vez em quando são,\nnormalmente porque um build copiou uma pasta que não devia.",[10,313,314,315,319],{},"É a coisa mais rara que encontramos: 8 apps de 30.749. Também são cinco segundos\nde trabalho para descartar, e é\n",[189,316,318],{"href":317},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","de onde vêm os vazamentos mais danosos","\nquando acontece.",[210,321,323],{"id":322},"_4-seus-buckets-de-storage-listam-o-que-têm-dentro","4. Seus buckets de storage listam o que têm dentro?",[10,325,326],{},"No Supabase, abra Storage. Leia a coluna Public em cada bucket e depois abra as\npolíticas de qualquer bucket que guarde algo que não é para todo mundo.",[10,328,329,330,334],{},"Aqui acontecem duas coisas diferentes e é fácil misturar. Um bucket público\nserve qualquer arquivo cujo nome alguém já conheça. Um bucket ",[331,332,333],"em",{},"listável"," entrega\nos nomes, o que transforma \"alguém teria que adivinhar\" num diretório dos\nuploads dos seus usuários. Nossa verificação testa o segundo, porque é o que\nmuda o que um estranho de fato consegue fazer.",[10,336,337,338,342],{},"792 apps de 27.269 tinham um bucket que se listou para nós sem login.\n",[189,339,341],{"href":340},"\u002Fblog\u002Fsupabase-storage-bucket-public","O que um estranho tira dessa lista"," é a\nversão longa, e o conserto costuma ser uma chavinha mais uma política.",[28,344,346],{"id":345},"os-cinco-que-podem-esperar-até-você-ter-usuários","Os cinco que podem esperar até você ter usuários",[10,348,349],{},"Cabeçalhos, source maps, seus próprios endereços de API, o certificado e o\ndomínio. Três deles normalmente são definidos por quem hospeda seu app, e dois\nsão datas num calendário.",[10,351,352],{},"Nenhum deles entrega sozinho uma linha do seu banco de dados, e é por isso que\nficam no segundo grupo. Um dos cinco vale adiantar se seu app tem um backend\npróprio, e ele está marcado abaixo.",[210,354,356],{"id":355},"_5-os-cabeçalhos-de-segurança-do-navegador-estão-ligados","5. Os cabeçalhos de segurança do navegador estão ligados?",[10,358,359],{},"Este é o único item da lista sem uma versão que dá para fazer pela barra de\nendereços. Um scan lê os cabeçalhos, ou você abre as ferramentas de\ndesenvolvedor do navegador, vai na aba Rede, clica na primeira requisição e lê\nos cabeçalhos da resposta.",[10,361,362],{},"São instruções pequenas para o navegador: carregue esta página só por HTTPS,\nrecuse ser emoldurada por outro site, não adivinhe tipos de arquivo. A ausência\ndeles não expõe nada por si só. Ela tira proteções que deixam outros ataques\nmais difíceis.",[10,364,365,366,370],{},"Quase ninguém passa neste item e quase ninguém pode. A 30.756 apps de 30.981\nfaltava pelo menos um, e num subdomínio de builder a configuração é da\nplataforma. ",[189,367,369],{"href":368},"\u002Fblog\u002Fmissing-security-headers","Se dá para fazer algo com os seus","\ndepende inteiramente de onde seu app está hospedado.",[210,372,374],{"id":373},"_6-seu-código-fonte-original-está-publicado","6. Seu código-fonte original está publicado?",[10,376,377],{},"Abra seu app no ar, abra as ferramentas de desenvolvedor do navegador e olhe o\npainel Sources. Se seus próprios arquivos aparecem ali com o código que você\nescreveu e os comentários que você deixou, os source maps saíram com o build.",[10,379,380],{},"Um source map é uma tabela de tradução que devolve o arquivo comprimido que seu\napp envia para código legível. Desenvolvedores usam para depurar um site no ar.\nPublicado na internet, significa que qualquer um pode ler seu app do jeito que\nvocê escreveu.",[10,382,383,384,388],{},"3.885 apps de 30.987 publicaram os seus. Não é um vazamento por si só, e vira um\nquando o código contém algo que você supunha que ninguém leria.\n",[189,385,387],{"href":386},"\u002Fblog\u002Fsource-maps-exposed-in-production","O que um source map publicado expõe","\ncobre a diferença e a configuração de build que desliga isso.",[210,390,392],{"id":391},"_7-seus-próprios-endereços-de-api-respondem-a-um-estranho","7. Seus próprios endereços de API respondem a um estranho?",[10,394,395],{},"Copie um dos endereços de API do seu app da aba Rede e depois abra numa janela\nanônima onde você não está logado. Veja o que volta.",[10,397,398],{},"Este é o item para adiantar se seu app tem um backend próprio, porque tudo que\num endereço entrega para uma requisição sem login é público, seja qual for a\ncara da página na frente dele. 3.852 apps de 30.926 tinham pelo menos um.",[10,400,401,402,406],{},"A configuração aparentada é o CORS, que decide quais outros sites podem chamar\nseu app do navegador de um visitante. Um curinga ali muitas vezes está tudo bem\ne de vez em quando não, e\n",[189,403,405],{"href":404},"\u002Fblog\u002Fcors-wildcard-security-risk","qual dos dois você tem"," vale ler antes de\nmudar qualquer coisa.",[210,408,410],{"id":409},"_8-seu-certificado-está-prestes-a-vencer","8. Seu certificado está prestes a vencer?",[10,412,413],{},"Clique no cadeado da barra de endereços, abra o certificado e leia a data de\n\"Válido até\".",[10,415,416],{},"Quase toda hospedagem renova isso sozinha e quase todas conseguem. 32 apps de\n30.851 tinham um certificado vencido, vencendo ou não confiável. Quando falha,\nos visitantes recebem um aviso do navegador em tela cheia dizendo que seu site\nnão é seguro, e a maioria vai embora.",[210,418,420],{"id":419},"_9-seu-domínio-está-renovado","9. Seu domínio está renovado?",[10,422,423],{},"Entre no seu registrador, leia a data de vencimento e confira se a renovação\nautomática está ligada e se o cartão por trás dela não venceu.",[10,425,426],{},"É o item menos técnico da lista e o único que consegue tirar seu app da internet\npor completo. 55 apps de 30.980 tinham um domínio vencido ou vencendo. Um nome\nque caducou também pode ser registrado por outra pessoa, junto com cada link que\nalguém já apontou para ele.",[36,428],{"alt":429,"caption":430,"src":431},"Os mesmos nove ícones de verificação em duas colunas. À esquerda estão ordenados por quantas vezes um scan encontra cada um; à direita pela ordem em que este artigo passa por eles. Linhas curvas ligam cada ícone a si mesmo e se cruzam no meio, quatro delas na cor de destaque.","À esquerda: quantas vezes encontramos cada um em 30.998 apps. À direita: a ordem desta lista. As duas discordam, e é por isso que o achado mais comum da internet não é a primeira coisa a fazer.","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Ftwo-orders-of-nine-1600x790.png",[28,433,435],{"id":434},"o-que-outros-checklists-carregam-que-não-é-verificação-de-segurança","O que outros checklists carregam que não é verificação de segurança",[10,437,438],{},"Backups, monitoramento de erros, código morto e conselho sobre senhas. O\nprimeiro é o que tem mais chance de te custar alguma coisa, e não é verificação\nde segurança, porque nada fora do seu app consegue dizer se você tem um.",[10,440,441],{},"Essa é a razão honesta de ele faltar entre os nove. Um scanner lê seu site no\nar; um backup é uma cópia do seu banco de dados guardada em outro lugar, e\nnenhum olhar de fora para o seu app consegue dizer se ela existe, se está em dia\nou se restauraria. Ainda assim ele entra na sua lista. Ele entra no tipo de\nlista que se mantém, não no tipo que se percorre.",[10,443,444,445,449],{},"Os backups do próprio Supabase dependem do seu plano e ficam dentro da sua conta\ndo Supabase, o que está ótimo até o problema ser a conta.\n",[189,446,448],{"href":447},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Os três caminhos para uma cópia que é sua","\nexpõe o que cada um cobre.",[10,451,452,453,457,458,461,462,287],{},"Se você preferir que isso aconteça sem você, é o que o\n",[189,454,456],{"href":455},"\u002Fpricing","Reeve Care"," faz. Ele tira uma cópia do seu banco Supabase numa\nfrequência definida pelo plano que você tem, toda noite no nível de entrada e\naté quatro vezes por dia no mais alto, lê cada cópia de volta antes de ela\ncontar como backup, e guarda onde o Supabase não alcança. Até onde você consegue\nvoltar é definido do mesmo jeito. Restaurar é um botão, e ele tira uma foto do\nestado atual antes de começar, então apertar no desespero não destrói o que você\nestava tentando salvar. Os arquivos enviados vêm junto, assim que você conecta\numa credencial de Storage, pedida à parte porque é a única chave que temos capaz\nde escrever: o Supabase não emite chave somente leitura para arquivos. O Care\ncomeça em $49 por mês para um app, e esse é um preço de tabela, então a\n",[189,459,460],{"href":455},"página de preços"," às vezes está abaixo do valor aqui e nunca acima.\nComo uma cópia é tirada, conferida e devolvida está desenhado passo a passo na\n",[189,463,465],{"href":464},"\u002Fsupabase-backups","página de backups do Supabase",[10,467,468],{},"O resto do que essas listas carregam é trabalho de verdade e não este trabalho.\nMonitoramento de erros te diz quando seu app quebra, e isso é operação. \"Remova\ndependências não usadas\" é arrumação. \"Use senhas fortes\" vale para tudo em que\nvocê já fez login.",[28,470,472],{"id":471},"de-quanto-em-quanto-tempo-devo-refazer-isso","De quanto em quanto tempo devo refazer isso?",[10,474,475],{},"Depois de todo deploy que mexeu nas regras do banco, nas suas chaves ou nas\nconfigurações de build. Se isso soa como a maioria dos deploys, costuma ser\nmesmo, e aí está o problema de verdade de um checklist que se percorre uma vez.",[10,477,478],{},"A volta no avião acontece antes de cada voo exatamente por isso. Row Level\nSecurity é desligada à meia-noite para uma página carregar e ninguém liga de\nvolta. Uma chave é colada no frontend para entregar um recurso antes de uma\ndemo. Um bucket é aberto para um upload e fica aberto. Cada uma dessas coisas é\numa terça-feira normal, e cada uma basta para virar um resultado limpo num\nresultado sério.",[10,480,481,482,485],{},"O ",[189,483,484],{"href":455},"Reeve Monitor"," existe para esse buraco. Ele refaz as nove\nverificações a cada hora em até três apps, olha a cada 60 segundos se o app está\nde pé, te avisa no dia em que um resultado muda em vez de esperar você olhar, e\nmanda um relatório mensal em linguagem simples. Custa $12 por mês de tabela, com\nsete dias grátis antes de cobrar, e a página de preços às vezes está abaixo do\nvalor aqui e nunca acima. O Monitor vigia e nada mais. Backups são o plano Care\nacima dele, e o Care guarda uma cópia de um banco Supabase e de nada mais.",[28,487,489],{"id":488},"o-que-nada-disso-prova","O que nada disso prova",[10,491,492],{},"Que seu app é seguro. Nove verificações voltando limpas querem dizer que nove\nperguntas feitas de fora voltaram limpas no dia em que você as fez.",[10,494,495],{},"Quatro coisas continuam invisíveis para cada item desta lista, porque nenhuma\ndelas sai do seu servidor. Seu código de servidor, incluindo as funções de banco\ne as edge functions que ninguém de fora consegue ler. As variáveis de ambiente\nque você manteve fora do navegador, que é exatamente o lugar delas e também o\nmotivo de um scan não conseguir confirmar que estão bem guardadas. Seu histórico\nde versões, onde uma chave que você commitou em março e removeu em abril\ncontinua sentada. E a lógica do seu próprio app, como se um usuário logado\nconsegue abrir o pedido de outro mudando um número no endereço.",[497,498,500],"callout",{"type":499},"warn",[10,501,502,505],{},[17,503,504],{},"Uma verificação externa automática não é uma auditoria."," A ausência de um\nachado não é garantia, e nada nesta página é um veredito sobre seu app como um\ntodo. Se seu app aceita pagamentos ou guarda dados de saúde ou financeiros de\nalguém, um teste de invasão feito por uma pessoa é outro exercício e, com o\ntempo, o certo.",[10,507,508,512],{},[189,509,511],{"href":510},"\u002Fblog\u002Fvibe-coding-security-scanner","O que um scan por URL enxerga e o que não enxerga","\npercorre essa fronteira direito, incluindo as três ferramentas que leem coisas\ndiferentes e onde cada uma é cega.",[28,514,516],{"id":515},"o-que-fazer-agora","O que fazer agora",[518,519,520],"key-takeaways",{},[521,522,523,541,544,547,550],"ul",{},[524,525,526,527,76,529,76,531,111,533,535,536,111,538,540],"li",{},"Faça os quatro urgentes na ordem: busque no seu projeto ",[73,528,75],{},[73,530,79],{},[73,532,82],{},[73,534,85],{},"; abra o Security Advisor no Supabase; abra ",[73,537,110],{},[73,539,114],{}," numa janela anônima; leia a coluna Public e as políticas em Storage.",[524,542,543],{},"Se achar uma chave secreta, rotacione antes de remover. Apagar a chave do seu código deixa o valor antigo funcionando, e ele continua no seu histórico de versões e em qualquer cópia em cache do seu site.",[524,545,546],{},"Faça os cinco restantes quando não houver nada pegando fogo. Três são da sua hospedagem, e as duas datas vão para o seu calendário.",[524,548,549],{},"Coloque um backup onde sua conta do Supabase não possa apagar, e restaure uma vez para saber que funciona.",[524,551,552],{},"Refaça a lista inteira depois de qualquer deploy que mexeu no seu banco, nas suas chaves ou nas configurações de build.",[10,554,555,556,560,561,565],{},"Se seu app guarda os dados no Supabase, a versão escrita em torno desse stack é\no ",[189,557,559],{"href":558},"\u002Fis-your-supabase-app-safe","guia de apps Supabase",". E se você prefere algo\npara marcar em vez de algo para ler, o\n",[189,562,564],{"href":563},"\u002Fchecklist","checklist de segurança de 10 minutos"," é a versão interativa.",{"title":567,"searchDepth":568,"depth":568,"links":569},"",3,[570,572,578,585,586,587,588],{"id":30,"depth":571,"text":31},2,{"id":196,"depth":571,"text":197,"children":573},[574,575,576,577],{"id":212,"depth":568,"text":213},{"id":262,"depth":568,"text":263},{"id":290,"depth":568,"text":291},{"id":322,"depth":568,"text":323},{"id":345,"depth":571,"text":346,"children":579},[580,581,582,583,584],{"id":355,"depth":568,"text":356},{"id":373,"depth":568,"text":374},{"id":391,"depth":568,"text":392},{"id":409,"depth":568,"text":410},{"id":419,"depth":568,"text":420},{"id":434,"depth":571,"text":435},{"id":471,"depth":571,"text":472},{"id":488,"depth":571,"text":489},{"id":515,"depth":571,"text":516},"Noções de segurança","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcover-1200x630.png","Uma lista de nove linhas pautadas, cada uma com uma caixinha vazia ao lado, nenhuma marcada ainda.","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.",false,"md",[596,599,602,605,608,611],{"q":597,"a":598},"O que devo verificar antes de lançar um app feito com vibe coding?","Quatro coisas, nesta ordem: se uma chave secreta foi parar no código que seu app manda para os navegadores, se suas tabelas de banco de dados respondem a uma requisição sem ninguém logado, se arquivos como \u002F.env abrem direto do seu endereço no ar, e se seus buckets de storage listam o que seus usuários subiram. É nesses quatro que um estranho chega aos seus dados ou ao seu dinheiro. Os outros cinco itens da lista valem a pena e nenhum deles é motivo para adiar um lançamento.",{"q":600,"a":601},"Quanto tempo isso leva?","Três dos quatro urgentes são uma olhada cada, depois que você sabe onde olhar: uma busca no seu próprio projeto por quatro prefixos de chave, a página Advisors no Supabase e dois endereços digitados numa janela anônima. O do banco de dados leva o tempo que suas tabelas tiverem, porque você lê a política de cada uma. Nosso scan gratuito faz os nove de fora em cerca de 20 segundos sem conta, que é o atalho honesto para uma primeira passada.",{"q":603,"a":604},"Preciso de um desenvolvedor para alguma coisa disso?","Para os testes, não. Cada um dos nove é uma página de um painel, um endereço no seu navegador ou uma busca no seu próprio projeto. Com os consertos a história é outra: mover para um servidor o trabalho que precisava de uma chave secreta é desenvolvimento de verdade, e escrever uma política de segurança por linha que deixe entrar quem deve é a parte que a maioria dos donos passa para alguém. Fazer os testes você mesmo ainda vale, porque o que você encontrar decide o que você vai pedir.",{"q":606,"a":607},"Qual é o item mais importante?","Se suas tabelas de banco de dados respondem a um estranho. É o item em que os dados em jogo são dos seus usuários e não seus, e é o achado sério mais comum que vemos. Dos apps cujo projeto Supabase respondeu ao nosso scan entre 12 e 14 de agosto de 2026, 57 % tinham pelo menos uma tabela entregando linhas para uma requisição sem ninguém logado. Uma chave secreta no bundle faz mais estrago quando acontece, e acontece bem menos.",{"q":609,"a":610},"De quanto em quanto tempo devo refazer?","Depois de qualquer deploy que tenha mexido nas regras do banco, nas chaves ou nas configurações de build, e uma vez por mês no resto do tempo. Um resultado descreve o app que estava no ar quando você perguntou. A segurança por linha é desligada para uma página carregar e fica desligada, uma chave é colada para entregar um recurso hoje à noite, um bucket é aberto para um upload. Nenhuma dessas coisas se anuncia sozinha.",{"q":612,"a":613},"Passar nisso quer dizer que meu app é seguro?","Não. Quer dizer que nove perguntas feitas de fora voltaram limpas no dia em que você as fez. Uma verificação externa automática não é uma auditoria, e a ausência de um achado não é garantia. Tudo que roda no seu servidor é invisível para os nove: seu código de servidor, as chaves que você manteve fora do navegador, a chave que você commitou em março e apagou em abril, e se um usuário logado consegue abrir o pedido de outro mudando um número no endereço.","\u002Fblog\u002Fvibe-coded-app-security-checklist\u002Fcard-800x500.png",[616,617,618,619,620,621,622,623,624],"checklist de segurança vibe coding","checklist seguranca app vibe coded","checklist seguranca app com ia","checklist seguranca lovable","seguranca bolt antes do lancamento","checklist lancamento app feito com ia","verificacao de seguranca antes de lancar","meu app esta pronto para lancar seguranca","checklist producao vibe coding",{},true,"O checklist de segurança do vibe coding","\u002Fblog\u002Fvibe-coded-app-security-checklist","2026-09-20",{"title":5,"description":592},"blog\u002Fvibe-coded-app-security-checklist",[633,634,635],"Um checklist de segurança do vibe coding só vale se você conseguir terminar. Este tem nove itens, porque nove é a quantidade de coisas que qualquer pessoa consegue verificar de fora num app no ar.","Quatro deles decidem se um estranho chega aos seus dados ou ao seu dinheiro. Faça esses quatro antes de passar o endereço para alguém.","Os outros cinco são configurações e datas. Eles ficam na lista, e nenhum deles entrega sozinho uma linha do seu banco de dados.","3n-8kP3XbKnajRrCB2ivjrCUzHdMjmAzYM2KCruIT84",[638,645,651,657,658,664,670,676,682,688,694,700,706,712,717,722,727,733,739,744,749,755,760,766,772,778,784,790,796,801,807,813,818,824,830,836,840,846,852,857,862,867],{"path":639,"title":640,"description":641,"published":642,"category":643,"image":644,"draft":593},"\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":646,"title":647,"description":648,"published":649,"category":589,"image":650,"draft":593},"\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":652,"title":653,"description":654,"published":655,"category":589,"image":656,"draft":593},"\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":628,"title":5,"description":592,"published":629,"category":589,"image":614,"draft":593},{"path":659,"title":660,"description":661,"published":662,"category":589,"image":663,"draft":593},"\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":665,"title":666,"description":667,"published":668,"category":589,"image":669,"draft":593},"\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":671,"title":672,"description":673,"published":674,"category":589,"image":675,"draft":593},"\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":677,"title":678,"description":679,"published":680,"category":589,"image":681,"draft":593},"\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":683,"title":684,"description":685,"published":686,"category":589,"image":687,"draft":593},"\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":689,"title":690,"description":691,"published":692,"category":643,"image":693,"draft":593},"\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":695,"title":696,"description":697,"published":698,"category":643,"image":699,"draft":593},"\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":701,"title":702,"description":703,"published":704,"category":643,"image":705,"draft":593},"\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":707,"title":708,"description":709,"published":710,"category":589,"image":711,"draft":593},"\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":280,"title":713,"description":714,"published":715,"category":589,"image":716,"draft":593},"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":269,"title":718,"description":719,"published":720,"category":589,"image":721,"draft":593},"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":257,"title":723,"description":724,"published":725,"category":589,"image":726,"draft":593},"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":728,"title":729,"description":730,"published":731,"category":589,"image":732,"draft":593},"\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":734,"title":735,"description":736,"published":737,"category":589,"image":738,"draft":593},"\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":510,"title":740,"description":741,"published":742,"category":589,"image":743,"draft":593},"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":368,"title":745,"description":746,"published":747,"category":589,"image":748,"draft":593},"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":750,"title":751,"description":752,"published":753,"category":589,"image":754,"draft":593},"\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":317,"title":756,"description":757,"published":758,"category":589,"image":759,"draft":593},"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":761,"title":762,"description":763,"published":764,"category":643,"image":765,"draft":593},"\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":767,"title":768,"description":769,"published":770,"category":589,"image":771,"draft":593},"\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":773,"title":774,"description":775,"published":776,"category":643,"image":777,"draft":593},"\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":779,"title":780,"description":781,"published":782,"category":589,"image":783,"draft":593},"\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":785,"title":786,"description":787,"published":788,"category":589,"image":789,"draft":593},"\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":791,"title":792,"description":793,"published":794,"category":589,"image":795,"draft":593},"\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":404,"title":797,"description":798,"published":799,"category":589,"image":800,"draft":593},"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":802,"title":803,"description":804,"published":805,"category":643,"image":806,"draft":593},"\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":808,"title":809,"description":810,"published":811,"category":643,"image":812,"draft":593},"\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":340,"title":814,"description":815,"published":816,"category":589,"image":817,"draft":593},"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":819,"title":820,"description":821,"published":822,"category":589,"image":823,"draft":593},"\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":825,"title":826,"description":827,"published":828,"category":643,"image":829,"draft":593},"\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":831,"title":832,"description":833,"published":834,"category":589,"image":835,"draft":593},"\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":386,"title":837,"description":838,"published":834,"category":589,"image":839,"draft":593},"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":841,"title":842,"description":843,"published":844,"category":589,"image":845,"draft":593},"\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":847,"title":848,"description":849,"published":850,"category":643,"image":851,"draft":593},"\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":285,"title":853,"description":854,"published":855,"category":589,"image":856,"draft":593},"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":858,"title":859,"description":860,"published":855,"category":643,"image":861,"draft":593},"\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":447,"title":863,"description":864,"published":865,"category":643,"image":866,"draft":593},"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":239,"title":868,"description":869,"published":865,"category":589,"image":870,"draft":593},"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",1790150954253]