[{"data":1,"prerenderedAt":999},["ShallowReactive",2],{"blog-pt-env-file-exposed-on-your-server":3,"blog-index-pt":646},{"id":4,"title":5,"body":6,"category":601,"cover":602,"coverAlt":603,"description":604,"draft":605,"extension":606,"faq":607,"image":623,"keywords":624,"meta":633,"navigation":634,"ogTitle":635,"path":636,"published":637,"seo":638,"stem":639,"tldr":640,"updated":644,"__hash__":645},"blog_pt\u002Fblog\u002Fenv-file-exposed-on-your-server.md","Seu arquivo .env está exposto? Os doze caminhos para testar",{"type":7,"value":8,"toc":587},"minimark",[9,18,36,42,47,54,57,63,69,83,100,104,107,166,175,181,185,188,197,200,207,215,219,222,393,400,404,407,410,436,444,448,454,460,469,476,480,489,492,505,509,512,515,520,523,545,552,556,579],[10,11,12,13,17],"p",{},"Alguém disse que seu arquivo ",[14,15,16],"code",{},".env"," está exposto, e pela frase você não consegue\nsaber se isso é sério. Ela cobre duas situações completamente diferentes. Uma\ndelas é a ferramenta funcionando como deve. A outra significa que um arquivo que\nvocê achava privado pode ser baixado do seu site no ar, por qualquer um, desde o\ndia em que está ali.",[10,19,20,21,31,32,35],{},"Esta é a parte que guia após guia mistura: ",[22,23,24,25,27,28,30],"strong",{},"um valor do seu ",[14,26,16],{}," acabar dentro\ndo seu JavaScript não é o mesmo acontecimento do arquivo ",[14,29,16],{}," em si sendo\nservido pelo seu servidor web."," O primeiro é o build fazendo o que você pediu\nquando chamou a variável de ",[14,33,34],{},"VITE_ALGUMA_COISA",". O segundo é um erro de\narquivamento, e é o que vale olhar primeiro, porque você mesmo consegue conferir\nde fora em cerca de um minuto.",[10,37,38,39,41],{},"Pense no seu site no ar como o balcão de uma loja. Tudo que está no balcão está\nali para ser levado: a página, as imagens, o JavaScript, a logo. Os fundos\nguardam o que faz a loja funcionar, e um visitante não tem caminho até lá. Um\nvalor compilado dentro do seu JavaScript é uma linha impressa no folheto do\nbalcão. O arquivo ",[14,40,16],{}," que responde em um endereço público é a pasta dos\nfundos, deixada no balcão junto com o resto.",[43,44,46],"h2",{"id":45},"meu-arquivo-env-está-exposto","Meu arquivo .env está exposto?",[10,48,49,50,53],{},"Abra seu site no ar em um navegador, coloque ",[14,51,52],{},"\u002F.env"," no fim do endereço e aperte\nenter.",[10,55,56],{},"Três coisas podem voltar, e só uma delas é problema.",[10,58,59,62],{},[22,60,61],{},"Uma página do seu aplicativo."," A maioria dos frontends responde qualquer\nendereço desconhecido com a própria página índice, porque é assim que um\naplicativo de página única faz o roteamento. Volta sua home, ou sua tela de não\nencontrado. Nesse caminho não está sendo servido nada.",[10,64,65,68],{},[22,66,67],{},"Um erro."," Um 403 ou um 404 significa que o servidor foi perguntado e recusou.\nÉ a resposta que você quer.",[10,70,71,74,75,78,79,82],{},[22,72,73],{},"Texto puro, com linhas dentro."," Algo como ",[14,76,77],{},"SUPABASE_URL=https:\u002F\u002F…"," e\n",[14,80,81],{},"SUPABASE_SERVICE_ROLE_KEY=eyJ…",", num paredão monoespaçado sem estilo nenhum. O\narquivo está sendo entregue a quem pedir, e está assim desde o dia em que foi\nservido pela primeira vez.",[84,85,87],"callout",{"type":86},"note",[10,88,89,92,93,96,97,99],{},[22,90,91],{},"Olhe o que voltou, não o código de status."," Um servidor pode responder\n",[14,94,95],{},"200 OK"," com sua página índice, que é o resultado normal e não quer dizer nada\nde errado. Navegadores também desenham um ",[14,98,16],{}," baixado como texto cru, então a\njanela parece quebrada justo quando o achado é real. O teste é se você está lendo\nas suas próprias configurações.",[43,101,103],{"id":102},"duas-coisas-diferentes-se-chamam-arquivo-env-exposto","Duas coisas diferentes se chamam arquivo .env exposto",[10,105,106],{},"Uma é sobre seu bundle. A outra é sobre seu servidor.",[108,109,110,126],"table",{},[111,112,113],"thead",{},[114,115,116,120,123],"tr",{},[117,118,119],"th",{},"O que aconteceu",[117,121,122],{},"Onde está o valor",[117,124,125],{},"O que custa resolver",[127,128,129,152],"tbody",{},[114,130,131,146,149],{},[132,133,134,135,138,139,142,143],"td",{},"Você chamou uma variável de ",[14,136,137],{},"VITE_",", ",[14,140,141],{},"NEXT_PUBLIC_"," ou ",[14,144,145],{},"EXPO_PUBLIC_",[132,147,148],{},"Compilado no JavaScript que todo visitante baixa",[132,150,151],{},"Mover o trabalho para um servidor e rotacionar a chave. O arquivo nunca foi servido.",[114,153,154,157,163],{},[132,155,156],{},"Seu servidor web publica a pasta do projeto",[132,158,159,160],{},"No arquivo, em ",[14,161,162],{},"https:\u002F\u002Fseusite\u002F.env",[132,164,165],{},"Tirar o arquivo do que o servidor publica e rotacionar tudo que estava nele.",[10,167,168,169,174],{},"A primeira linha é a comum e tem ",[170,171,173],"a",{"href":172},"\u002Fblog\u002Fvite-and-next-public-env-vars","um artigo\npróprio",": o prefixo é uma instrução para\npublicar, e o build obedeceu. Tudo abaixo aqui é a segunda linha.",[176,177],"diagram",{"alt":178,"caption":179,"src":180},"Duas saídas do mesmo arquivo .env. À esquerda o build copia um valor com prefixo para o bundle de JavaScript que um visitante baixa. À direita o servidor web entrega o arquivo inteiro no endereço \u002F.env.","Esquerda: o build copiou um valor para o seu JavaScript, porque o prefixo mandou. Direita: o servidor entrega o arquivo, e os prefixos ali não mudam nada.","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Ftwo-meanings-1600x840.png",[43,182,184],{"id":183},"por-que-um-aplicativo-lovable-não-consegue-e-um-replit-consegue","Por que um aplicativo Lovable não consegue e um Replit consegue",[10,186,187],{},"Porque os dois hosts publicam coisas diferentes.",[10,189,190,191,193,194,196],{},"Um builder que faz deploy de um frontend estático entrega ao host uma pasta de\narquivos construídos: um pouco de HTML, um pouco de JavaScript, algumas imagens.\nSeu ",[14,192,16],{}," foi lido durante o build e não está nessa pasta, então em ",[14,195,52],{}," não\nhá nada para ninguém pegar. O host não conseguiria servir o arquivo nem\nquerendo.",[10,198,199],{},"Um aplicativo Replit normalmente roda o próprio servidor, na própria pasta de\nprojeto, com seus arquivos ao lado do seu código. Um servidor mandado servir a\npasta dele serve todo arquivo que está ali, e não tem como saber que um deles\nguarda suas chaves. O mesmo vale para qualquer coisa que você subiu numa máquina\nsua.",[10,201,202,203,206],{},"Os números seguem a arquitetura. De 30.761 aplicativos no ar em que essa\nverificação teve resposta, 8 entregavam pelo menos um arquivo privado. ",[22,204,205],{},"Sete dos\noito eram do Replit",", e os do Replit eram 3.025 dos 30.761. O oitavo estava num\ndomínio próprio, o que diz a mesma coisa de outro jeito: alguém rodava o próprio\nservidor.",[10,208,209,210,214],{},"É o achado mais raro que a gente imprime, e o único dos nove sem explicação\ninocente. Se você quer a leitura larga do que os aplicativos Replit realmente\nentregam, ",[170,211,213],{"href":212},"\u002Fblog\u002Fis-replit-safe","escaneamos 3.042 deles",".",[43,216,218],{"id":217},"os-doze-caminhos-para-testar","Os doze caminhos para testar",[10,220,221],{},"Doze endereços, na ordem que vale a pena. Coloque cada um depois do seu domínio.",[108,223,224,237],{},[111,225,226],{},[114,227,228,231,234],{},[117,229,230],{},"Endereço",[117,232,233],{},"O que guarda",[117,235,236],{},"Se responder com texto",[127,238,239,251,264,276,293,306,319,332,343,354,367,380],{},[114,240,241,245,248],{},[132,242,243],{},[14,244,52],{},[132,246,247],{},"Toda chave com que seu aplicativo foi construído",[132,249,250],{},"Trate tudo como público e rotacione",[114,252,253,258,261],{},[132,254,255],{},[14,256,257],{},"\u002F.env.local",[132,259,260],{},"O mesmo, de uma execução local",[132,262,263],{},"O mesmo",[114,265,266,271,274],{},[132,267,268],{},[14,269,270],{},"\u002F.env.production",[132,272,273],{},"O mesmo, do seu deploy no ar",[132,275,263],{},[114,277,278,283,286],{},[132,279,280],{},[14,281,282],{},"\u002F.git\u002Fconfig",[132,284,285],{},"O endereço remoto do seu repositório",[132,287,288,289,292],{},"O diretório ",[14,290,291],{},".git"," inteiro costuma ser legível",[114,294,295,300,303],{},[132,296,297],{},[14,298,299],{},"\u002F.git\u002FHEAD",[132,301,302],{},"Em que branch você está",[132,304,305],{},"O mesmo, e é o mais silencioso dos doze",[114,307,308,313,316],{},[132,309,310],{},[14,311,312],{},"\u002F.aws\u002Fcredentials",[132,314,315],{},"Chaves longas da Amazon",[132,317,318],{},"Rotacione na Amazon e depois confira a fatura",[114,320,321,326,329],{},[132,322,323],{},[14,324,325],{},"\u002Fdatabase.sql",[132,327,328],{},"Esquema e linhas",[132,330,331],{},"Todas as linhas de todas as tabelas são públicas",[114,333,334,339,341],{},[132,335,336],{},[14,337,338],{},"\u002Fdump.sql",[132,340,263],{},[132,342,263],{},[114,344,345,350,352],{},[132,346,347],{},[14,348,349],{},"\u002Fbackup.sql",[132,351,263],{},[132,353,263],{},[114,355,356,361,364],{},[132,357,358],{},[14,359,360],{},"\u002Fconfig.json",[132,362,363],{},"O que você colocou lá dentro",[132,365,366],{},"Leia e veja; token aparece ali mais do que se imagina",[114,368,369,374,377],{},[132,370,371],{},[14,372,373],{},"\u002Fdocker-compose.yml",[132,375,376],{},"Definições de serviço, muitas vezes com senha dentro",[132,378,379],{},"Rotacione tudo que estiver escrito ali",[114,381,382,387,390],{},[132,383,384],{},[14,385,386],{},"\u002F.npmrc",[132,388,389],{},"Um token de registro",[132,391,392],{},"Revogue o token",[10,394,395,396,214],{},"Nosso próprio escaneamento lê os doze de fora e nomeia os que responderam. Leva\nuns 20 segundos e não pede conta: ",[170,397,399],{"href":398},"\u002Fsecurity-scanner","escaneie seu\naplicativo",[43,401,403],{"id":402},"o-que-um-acerto-realmente-significa","O que um acerto realmente significa",[10,405,406],{},"Tudo que está nesse arquivo é público agora, e é desde o dia em que ele foi\nservido pela primeira vez.",[10,408,409],{},"Você não vai descobrir quem leu. Um builder não te dá nenhum log de arquivo\nbaixado que você possa ir olhar, e o pedido parece qualquer outro pedido por\nqualquer outro arquivo. Do que você pode ter certeza é que alguém tentou: há\ncrawlers automáticos percorrendo exatamente esses doze caminhos pela internet\ntoda, sem parar, e eles não precisam saber quem você é para achar o seu.",[10,411,412,413,415,416,138,418,421,422,425,426,138,429,142,432,435],{},"Cinco dos oito aplicativos que achamos entregavam um dos quatro que custam\ncaro na hora: ",[14,414,16],{},", um diretório ",[14,417,291],{},[14,419,420],{},".aws\u002Fcredentials"," ou um dump ",[14,423,424],{},".sql",".\nOs outros três entregavam ",[14,427,428],{},"config.json",[14,430,431],{},"docker-compose.yml",[14,433,434],{},".npmrc",". Esses\ntrês são os que todo mundo acha inofensivos, que é exatamente por que token e\nsenha de banco acabam escritos dentro deles.",[10,437,438,439,443],{},"O que isso não é, é um veredito sobre seu aplicativo. Uma verificação externa lê\no que seu site entrega a um estranho, e doze caminhos que respondem com nada são\ndoze caminhos que respondem com nada. ",[170,440,442],{"href":441},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","O que mais escapa de um aplicativo\nvibe-coded"," é a lista longa.",[43,445,447],{"id":446},"o-que-estraga-uma-semana-um-diretório-git","O que estraga uma semana: um diretório .git",[10,449,450,451,453],{},"Um diretório ",[14,452,291],{}," não é um arquivo. É todo o seu histórico.",[10,455,456,457,459],{},"Cada commit está ali, incluindo aquele em que você colou uma chave e o seguinte\nem que você tirou. É a parte que as pessoas entendem errado num vazamento de\n",[14,458,291],{},": apagar um segredo do código que você tem hoje não faz nada com a versão\nem que ele ainda estava, e essa versão está no mesmo diretório que seu servidor\npublica.",[10,461,462,463,465,466,468],{},"A verificação lê ",[14,464,282],{}," e ",[14,467,299],{}," porque os dois são pequenos, o\nconteúdo deles não engana, e qualquer um dos dois respondendo significa que o\ndiretório em si está sendo servido. Dali em diante quem lê não precisa de\nferramenta nenhuma especial. O formato é documentado e software comum clona.",[10,470,471,472,214],{},"Se uma chave já esteve em um commit, rotacionar é a única coisa que ajuda. Qual\nvem primeiro depende de a cópia já estar fora, e ",[170,473,475],{"href":474},"\u002Fblog\u002Frotate-supabase-service-role-key","essa ordem vale acertar",[43,477,479],{"id":478},"o-dump-que-alguém-deixou-na-pasta","O dump que alguém deixou na pasta",[10,481,482,483,138,485,78,487,214],{},"Três dos doze caminhos são dumps de banco: ",[14,484,325],{},[14,486,338],{},[14,488,349],{},[10,490,491],{},"Um dump é cada linha de cada tabela em um arquivo, com o esquema em cima.\nEndereços de e-mail, senhas com hash, pedidos, mensagens, o que seu aplicativo\nguardar. Ele responde num endereço público pelo motivo mais sem graça deste\nartigo inteiro: alguém fez a coisa responsável, tirou uma cópia do banco e salvou\nna pasta de projeto em que estava.",[10,493,494,495,499,500,504],{},"Então o arquivo feito para proteger os dados virou o jeito mais rápido de ler\ntodos eles. Onde uma cópia mora é tanto parte da decisão quanto tirar uma. ",[170,496,498],{"href":497},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Três\njeitos de fazer backup de um banco\nSupabase"," passa pelas opções, e\no ",[170,501,503],{"href":502},"\u002Fsupabase-backups","Reeve Care"," guarda uma cópia do seu banco Supabase fora do\nseu próprio servidor, verificada antes de contar como backup.",[43,506,508],{"id":507},"como-corrigir-e-por-que-a-ordem-importa","Como corrigir, e por que a ordem importa",[10,510,511],{},"Tire o arquivo do que seu servidor publica. Depois rotacione cada segredo que\nestava nele. Nessa ordem.",[10,513,514],{},"Rotacionar primeiro parece a metade urgente, e é a metade que joga o trabalho\nfora. Suas chaves novas vão para o mesmo arquivo, o arquivo continua respondendo\nno mesmo endereço, e você rotacionou direto de volta para o vazamento. Nada está\nmais seguro do que dez minutos atrás.",[176,516],{"alt":517,"caption":518,"src":519},"Duas sequências. Rotacionar antes de mover o arquivo coloca a chave nova de volta no arquivo que o servidor continua servindo. Mover o arquivo primeiro faz a chave rotacionada cair onde nada alcança.","Rotacione primeiro e a chave nova cai no arquivo que continua sendo entregue. Mova primeiro e não sobra nada para entregar.","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Ffix-order-1600x760.png",[10,521,522],{},"Onde colocar ele, dependendo do que você roda:",[524,525,526,533,539],"ul",{},[527,528,529,532],"li",{},[22,530,531],{},"Um host com cofre de segredos próprio."," Replit Secrets, as variáveis de\nambiente de uma plataforma, o painel da sua hospedagem. O valor é lido pelo seu\nservidor em tempo de execução e nunca fica num arquivo dentro da pasta\npublicada.",[527,534,535,538],{},[22,536,537],{},"Fora da pasta servida."," Se você controla a configuração do servidor, aponte\nela para uma pasta de saída do build em vez da raiz do projeto. Aí um arquivo\nna raiz não tem endereço nenhum.",[527,540,541,544],{},[22,542,543],{},"No repositório também não",", que é um hábito separado e bom. Para o problema\nde hoje ele não faz nada.",[10,546,547,548,551],{},"Esse último ponto vale dizer claro, porque ",[14,549,550],{},".gitignore"," é a resposta que todo\nmundo busca. Ele mantém o arquivo fora do seu repositório. O arquivo no seu\nservidor chegou lá porque o servidor está sentado na sua pasta de projeto, e o\ngit não tem opinião sobre isso.",[43,553,555],{"id":554},"o-que-fazer-agora","O que fazer agora",[557,558,559],"key-takeaways",{},[524,560,561,564,567,570,573],{},[527,562,563],{},"Digite os doze endereços depois do seu próprio domínio, ou rode o escaneamento gratuito e deixe ele digitar. Leia o que volta, não o código de status.",[527,565,566],{},"Se um responder com as suas configurações, tire o arquivo da pasta que seu servidor publica e faça o deploy de novo. É o passo que para isso.",[527,568,569],{},"Depois rotacione cada chave, senha e token que o arquivo guardava, em cada provedor. Rotacionar antes de mover o arquivo coloca os valores novos onde estavam os velhos.",[527,571,572],{},"Confira cobrança e logs do provedor no fim. Rotacionar para o que vem depois e não faz nada com o que já aconteceu.",[527,574,575,576,578],{},"Se um diretório ",[14,577,291],{}," estava legível, rotacione tudo que já esteve em um commit, não só o que está no código hoje.",[10,580,581,582,586],{},"Se você prefere passar pelo seu aplicativo como uma lista, o ",[170,583,585],{"href":584},"\u002Fchecklist","checklist de\nsegurança de 10 minutos"," cobre isso junto com as outras coisas que\nvale fechar num aplicativo recém-lançado.",{"title":588,"searchDepth":589,"depth":589,"links":590},"",3,[591,593,594,595,596,597,598,599,600],{"id":45,"depth":592,"text":46},2,{"id":102,"depth":592,"text":103},{"id":183,"depth":592,"text":184},{"id":217,"depth":592,"text":218},{"id":402,"depth":592,"text":403},{"id":446,"depth":592,"text":447},{"id":478,"depth":592,"text":479},{"id":507,"depth":592,"text":508},{"id":554,"depth":592,"text":555},"Noções de segurança","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcover-1200x630.png","Quatro pastas lacradas atrás de um muro e, na frente, uma pasta aberta com as linhas à mostra sob uma faixa âmbar.","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.",false,"md",[608,611,614,617,620],{"q":609,"a":610},"Como sei se meu arquivo .env é público?","Abra seu site no ar em um navegador, coloque \u002F.env no fim do endereço e aperte enter. Se voltar uma página do seu aplicativo, nada está sendo servido nesse caminho. Se voltar texto puro, com linhas como SUPABASE_URL=https:\u002F\u002Fabcdefghij.supabase.co, o arquivo é entregue a quem pedir. Faça o mesmo com \u002F.env.local e \u002F.env.production, porque um servidor que publica um costuma publicar os três.",{"q":612,"a":613},"Um arquivo .env no meu bundle é a mesma coisa?","Não, e a solução é outra. Um valor que acaba dentro do seu JavaScript chegou lá porque foi pedido ao build, com uma variável chamada VITE_ ou NEXT_PUBLIC_ ou EXPO_PUBLIC_. O arquivo nunca saiu da sua máquina; o valor saiu. Esse é um problema separado e tem o próprio artigo. Este aqui é sobre o arquivo em si, servido pelo seu servidor web, o que deixa público cada valor que ele guarda, com prefixo ou sem.",{"q":615,"a":616},"Por que alguém consegue baixar minha pasta .git?","Porque seu servidor aponta para a pasta do projeto e .git é um diretório dentro dela como qualquer outro. Um servidor não sabe que um deles é seu histórico de versões. Se \u002F.git\u002Fconfig ou \u002F.git\u002FHEAD responder com texto, o diretório inteiro costuma ser legível, e isso inclui cada commit que você já fez, não só o código que você tem hoje.",{"q":618,"a":619},"Achei um backup.sql no meu próprio site, e agora?","Tire ele da pasta que seu servidor publica antes de qualquer outra coisa, porque o arquivo está sendo entregue enquanto você lê isto. Depois trate como público cada senha, chave e dado pessoal que ele guarda: um dump leva o esquema e todas as linhas de todas as tabelas. Depois descubra como ele foi parar ali, normalmente alguém tirou uma cópia na pasta do projeto e nunca moveu.",{"q":621,"a":622},"Eu roto as chaves ou apago o arquivo primeiro?","Mova o arquivo primeiro, rotacione depois. Rotacionar enquanto o arquivo ainda está sendo servido escreve os valores novos em algo que qualquer um baixa, então você gasta o trabalho e termina onde começou. Quando nada mais responder nesse caminho, rotacione cada segredo que o arquivo guardava, em cada provedor, e confira cobrança e logs no fim.","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",[625,626,627,628,629,630,631,632],"arquivo .env exposto","arquivo env acessível publicamente",".env exposto no servidor","baixar .env de um site","pasta .git exposta","meu arquivo .env é público","backup.sql exposto","config.json exposto",{},true,"Seu arquivo .env está exposto? Doze caminhos para testar","\u002Fblog\u002Fenv-file-exposed-on-your-server","2026-10-04",{"title":5,"description":604},"blog\u002Fenv-file-exposed-on-your-server",[641,642,643],"Dois problemas diferentes têm o mesmo nome: um arquivo .env exposto. Este é o arquivo em si, parado no seu servidor web e baixável por qualquer um que digite o endereço.","Um host que só serve seu frontend já construído não consegue fazer isso. Um servidor de verdade consegue, e por isso sete dos oito aplicativos que achamos eram do Replit.","De 30.761 aplicativos no ar em que nossa verificação teve resposta, 8 estavam entregando um arquivo privado. Doze endereços dizem se você é o nono.","2026-10-05","5IVWr9XIM586xJEsHivxOXCue0lwqVwnzKjDcZgTzF4",[647,653,659,665,671,677,683,688,689,695,701,707,713,719,726,732,738,743,749,755,761,767,773,779,785,790,796,802,807,813,819,825,831,837,843,848,854,860,866,872,878,883,889,895,901,907,913,919,925,931,937,943,949,955,961,966,972,978,984,989,994],{"path":648,"title":649,"description":650,"published":651,"category":601,"image":652,"draft":605},"\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":654,"title":655,"description":656,"published":657,"category":601,"image":658,"draft":605},"\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":660,"title":661,"description":662,"published":663,"category":601,"image":664,"draft":605},"\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":666,"title":667,"description":668,"published":669,"category":601,"image":670,"draft":605},"\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":672,"title":673,"description":674,"published":675,"category":601,"image":676,"draft":605},"\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":678,"title":679,"description":680,"published":681,"category":601,"image":682,"draft":605},"\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":684,"title":685,"description":686,"published":644,"category":601,"image":687,"draft":605},"\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.","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":636,"title":5,"description":604,"published":637,"category":601,"image":623,"draft":605},{"path":690,"title":691,"description":692,"published":693,"category":601,"image":694,"draft":605},"\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":696,"title":697,"description":698,"published":699,"category":601,"image":700,"draft":605},"\u002Fblog\u002Fis-bolt-safe","O Bolt é seguro? O que vimos em 1.123 aplicativos Bolt","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.","2026-10-02","\u002Fblog\u002Fis-bolt-safe\u002Fcard-800x500.png",{"path":702,"title":703,"description":704,"published":705,"category":601,"image":706,"draft":605},"\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":708,"title":709,"description":710,"published":711,"category":601,"image":712,"draft":605},"\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":714,"title":715,"description":716,"published":717,"category":601,"image":718,"draft":605},"\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":720,"title":721,"description":722,"published":723,"category":724,"image":725,"draft":605},"\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":727,"title":728,"description":729,"published":730,"category":724,"image":731,"draft":605},"\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":733,"title":734,"description":735,"published":736,"category":724,"image":737,"draft":605},"\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":739,"title":740,"description":741,"published":736,"category":601,"image":742,"draft":605},"\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":744,"title":745,"description":746,"published":747,"category":601,"image":748,"draft":605},"\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":750,"title":751,"description":752,"published":753,"category":601,"image":754,"draft":605},"\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":756,"title":757,"description":758,"published":759,"category":724,"image":760,"draft":605},"\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":762,"title":763,"description":764,"published":765,"category":601,"image":766,"draft":605},"\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":768,"title":769,"description":770,"published":771,"category":601,"image":772,"draft":605},"\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":774,"title":775,"description":776,"published":777,"category":601,"image":778,"draft":605},"\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":780,"title":781,"description":782,"published":783,"category":601,"image":784,"draft":605},"\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":172,"title":786,"description":787,"published":788,"category":601,"image":789,"draft":605},"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":791,"title":792,"description":793,"published":794,"category":601,"image":795,"draft":605},"\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":797,"title":798,"description":799,"published":800,"category":601,"image":801,"draft":605},"\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":212,"title":803,"description":804,"published":805,"category":601,"image":806,"draft":605},"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":808,"title":809,"description":810,"published":811,"category":724,"image":812,"draft":605},"\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":814,"title":815,"description":816,"published":817,"category":724,"image":818,"draft":605},"\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":820,"title":821,"description":822,"published":823,"category":724,"image":824,"draft":605},"\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":826,"title":827,"description":828,"published":829,"category":601,"image":830,"draft":605},"\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":832,"title":833,"description":834,"published":835,"category":601,"image":836,"draft":605},"\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":838,"title":839,"description":840,"published":841,"category":601,"image":842,"draft":605},"\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":474,"title":844,"description":845,"published":846,"category":601,"image":847,"draft":605},"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":849,"title":850,"description":851,"published":852,"category":601,"image":853,"draft":605},"\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":855,"title":856,"description":857,"published":858,"category":601,"image":859,"draft":605},"\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":861,"title":862,"description":863,"published":864,"category":601,"image":865,"draft":605},"\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":867,"title":868,"description":869,"published":870,"category":601,"image":871,"draft":605},"\u002Fblog\u002Fmissing-security-headers","Cabeçalhos de segurança faltando: quando isso importa","Cabeçalhos de segurança faltando é o achado que nosso scanner mais imprime. Contra o que eles protegem e quando são a linha menos urgente do relatório.","2026-09-04","\u002Fblog\u002Fmissing-security-headers\u002Fcard-800x500.png",{"path":873,"title":874,"description":875,"published":876,"category":601,"image":877,"draft":605},"\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":441,"title":879,"description":880,"published":881,"category":601,"image":882,"draft":605},"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":884,"title":885,"description":886,"published":887,"category":724,"image":888,"draft":605},"\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":890,"title":891,"description":892,"published":893,"category":601,"image":894,"draft":605},"\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":896,"title":897,"description":898,"published":899,"category":724,"image":900,"draft":605},"\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":902,"title":903,"description":904,"published":905,"category":601,"image":906,"draft":605},"\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":908,"title":909,"description":910,"published":911,"category":601,"image":912,"draft":605},"\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":914,"title":915,"description":916,"published":917,"category":601,"image":918,"draft":605},"\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":920,"title":921,"description":922,"published":923,"category":601,"image":924,"draft":605},"\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":926,"title":927,"description":928,"published":929,"category":724,"image":930,"draft":605},"\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":932,"title":933,"description":934,"published":935,"category":724,"image":936,"draft":605},"\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":938,"title":939,"description":940,"published":941,"category":601,"image":942,"draft":605},"\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":944,"title":945,"description":946,"published":947,"category":601,"image":948,"draft":605},"\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":950,"title":951,"description":952,"published":953,"category":724,"image":954,"draft":605},"\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":956,"title":957,"description":958,"published":959,"category":601,"image":960,"draft":605},"\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":962,"title":963,"description":964,"published":959,"category":601,"image":965,"draft":605},"\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":967,"title":968,"description":969,"published":970,"category":601,"image":971,"draft":605},"\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":973,"title":974,"description":975,"published":976,"category":724,"image":977,"draft":605},"\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":979,"title":980,"description":981,"published":982,"category":601,"image":983,"draft":605},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","O Supabase Row Level Security está ligado. A tabela continua pública.","Ligar o Supabase Row Level Security não protege uma tabela. Quem protege são as políticas, e a que consertou o seu app pode deixar qualquer um entrar.","2026-08-10","\u002Fblog\u002Fsupabase-rls-on-but-table-still-public\u002Fcard-800x500.png",{"path":985,"title":986,"description":987,"published":982,"category":724,"image":988,"draft":605},"\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":497,"title":990,"description":991,"published":992,"category":724,"image":993,"draft":605},"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":995,"title":996,"description":997,"published":992,"category":601,"image":998,"draft":605},"\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",1791705963240]