[{"data":1,"prerenderedAt":917},["ShallowReactive",2],{"blog-pt-no-api-key-found-in-request":3,"blog-index-pt":564},{"id":4,"title":5,"body":6,"category":521,"cover":522,"coverAlt":523,"description":524,"draft":525,"extension":526,"faq":527,"image":543,"keywords":544,"meta":552,"navigation":553,"ogTitle":554,"path":555,"published":556,"seo":557,"stem":558,"tldr":559,"updated":556,"__hash__":563},"blog_pt\u002Fblog\u002Fno-api-key-found-in-request.md","\"No API key found in request\" no Supabase, e a correção errada",{"type":7,"value":8,"toc":508},"minimark",[9,13,24,27,35,40,43,50,53,56,62,66,69,85,102,108,118,122,127,133,143,151,155,158,161,175,192,195,200,204,207,210,277,280,283,290,297,304,309,316,320,323,332,339,345,357,376,380,383,391,399,403,409,419,435,445,462,466,495],[10,11,12],"p",{},"Ontem seu app funcionava. Hoje uma lista que costumava encher de linhas está\nvazia, e se você abre o console do navegador há uma resposta curta do Supabase\nonde deveriam estar os dados:",[14,15,20],"pre",{"className":16,"code":18,"language":19},[17],"language-text","{\n  \"message\": \"No API key found in request\",\n  \"hint\": \"No `apikey` request header or url param was found.\"\n}\n","text",[21,22,18],"code",{"__ignoreMap":23},"",[10,25,26],{},"É tudo o que você recebe. Não diz qual tabela você estava lendo, o que você\nenviou, nem o que mudar.",[10,28,29,30,34],{},"Aqui está a parte que guia após guia conta errado: ",[31,32,33],"strong",{},"\"No API key found in\nrequest\" fala de um cabeçalho que faltou, e quase todo conselho que você vai\nencontrar fala das regras do seu banco de dados."," No fórum de discussão do\nSupabase essa mensagem tem um tópico só dela, dezesseis pessoas propõem ali oito\nremédios diferentes, e três deles mandam adicionar ou afrouxar uma regra em\nalguma das suas tabelas. Todos os que tentaram contam que a mensagem parou. Se\numa regra algum dia foi a causa é outra pergunta, e o tópico nunca a resolve. O\nque é certo depois é que mais gente pode ler a tabela do que antes.",[36,37,39],"h2",{"id":38},"o-que-significa-no-api-key-found-in-request","O que significa \"No API key found in request\"",[10,41,42],{},"O Supabase recusou sua requisição na porta da rua, antes de perguntar qualquer\ncoisa ao seu banco de dados.",[10,44,45,46,49],{},"Toda requisição ao seu projeto chega primeiro a uma porta que o Supabase coloca\nna frente de tudo o mais. Naquele momento a função dela é estreita: ler o\ncabeçalho ",[21,47,48],{},"apikey",", comparar o valor com as chaves do seu projeto e deixar a\nrequisição passar. Sem chave para ler, ela para ali e responde 401, o código de\nestado para \"não sei quem você é\". A própria documentação do Supabase sobre essa\nporta diz que uma chave ausente ou inválida é recusada assim.",[10,51,52],{},"Pense nessa porta como um porteiro na entrada do prédio, e não como uma fechadura\nem um arquivo. O porteiro pede um crachá a todo mundo que chega. As regras que\ndecidem quem pode abrir qual gaveta ficam dois andares acima, e aqui ninguém as\nconsultou, porque nada passou da entrada.",[10,54,55],{},"Como erro, esse é brando. Nada foi lido, nada foi escrito, e seus dados estão\nexatamente como estavam. Uma requisição foi recusada.",[57,58],"diagram",{"alt":59,"caption":60,"src":61},"Um caminho da esquerda para a direita, de um app até um portão alto. O portão tem uma fenda tracejada vazia e uma barra âmbar, a seta para ali, e uma linha tracejada curta do outro lado não leva a lugar nenhum. Mais à direita há um cadeado e uma tabela em cinza, dentro de uma moldura tracejada.","A porta lê a chave. As regras da sua tabela ficam uma parada adiante, e uma requisição recusada nunca chega até elas.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fwhere-it-stops-1600x620.png",[36,63,65],{"id":64},"por-que-minha-requisição-chegou-sem-chave","Por que minha requisição chegou sem chave?",[10,67,68],{},"Porque o valor que seu app deveria enviar não estava na requisição que o\nnavegador realmente fez. Quatro causas cobrem quase todos os casos.",[10,70,71,74,75,78,79,84],{},[31,72,73],{},"A chave nunca chegou ao app compilado."," Seu código a lê de uma variável de\nambiente, o build que gerou seu site no ar não tinha essa variável definida, e o\n",[21,76,77],{},"createClient"," recebeu uma string vazia. Tudo compila, o app carrega, e cada\nrequisição sai sem chave. Em um projeto Vite ou Next a variável ainda precisa\ncarregar o prefixo que a marca como segura para o navegador, o que é\n",[80,81,83],"a",{"href":82},"\u002Fblog\u002Fvite-and-next-public-env-vars","uma armadilha à parte",".",[10,86,87,90,91,94,95,98,99,101],{},[31,88,89],{},"Você está chamando o caminho REST na mão."," Um ",[21,92,93],{},"fetch"," escrito contra\n",[21,96,97],{},"\u002Frest\u002Fv1\u002Fsua_tabela"," envia os cabeçalhos que você digitou e mais nada. A\nbiblioteca cliente do Supabase adiciona ",[21,100,48],{}," por você; uma requisição escrita\nna mão tem o que você deu a ela.",[10,103,104,107],{},[31,105,106],{},"Alguma coisa no meio tirou o cabeçalho."," Uma regra de rewrite, um proxy ou um\ngateway seu fica entre o app e o Supabase e repassa a requisição sem ele.",[10,109,110,113,114,117],{},[31,111,112],{},"Você está olhando um redirecionamento e não uma requisição de dados."," Se a\nmensagem aparece depois que alguém faz login ou clica num link de confirmação, e\na barra de endereço ainda mostra sua URL do Supabase, a configuração a olhar é a\nSite URL dentro de Auth. A resposta com mais reações de todo aquele tópico do\nSupabase é de alguém que tinha escrito ali o endereço do próprio site sem o\n",[21,115,116],{},"https:\u002F\u002F"," na frente.",[36,119,121],{"id":120},"a-correção-em-uma-linha","A correção, em uma linha",[10,123,124,125,84],{},"Envie sua chave publicável no cabeçalho ",[21,126,48],{},[14,128,131],{"className":129,"code":130,"language":19},[17],"import { createClient } from '@supabase\u002Fsupabase-js'\n\nexport const supabase = createClient(\n  'https:\u002F\u002Fseu-projeto.supabase.co',\n  'sb_publishable_…',\n)\n",[21,132,130],{"__ignoreMap":23},[10,134,135,136,138,139,142],{},"Crie o cliente assim e a biblioteca coloca a chave no cabeçalho certo em toda\nrequisição, de modo que você nunca escreve o cabeçalho. A documentação do\nSupabase é específica sobre qual é: chaves publicáveis e secretas viajam em\n",[21,137,48],{}," e não em ",[21,140,141],{},"Authorization: Bearer",", porque são strings curtas e opacas e\nqualquer coisa que tente verificá-las como um JWT falha.",[10,144,145,146,150],{},"Essa chave deve mesmo estar no seu app. Ela diz a que projeto uma requisição\npertence, e o que um visitante com ela alcança é decidido pelas regras das suas\ntabelas, que é a razão inteira de ela poder ser pública.\n",[80,147,149],{"href":148},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","Quais chaves de API são seguras no frontend","\npercorre o resto da família.",[36,152,154],{"id":153},"a-correção-que-piora-tudo","A correção que piora tudo",[10,156,157],{},"A chave secreta entra no mesmo cabeçalho, e num projeto antigo ela cala a\nmensagem e segue funcionando.",[10,159,160],{},"Isso é um único clique errado. Seu painel lista as duas chaves na mesma página, e\no par antigo se parece: mesmo formato, mesmo comprimento, uma embaixo da outra. O\ntamanho do estrago depende de qual par o seu projeto emite.",[10,162,163,166,167,170,171,174],{},[31,164,165],{},"Uma chave secreta nova é recusada no navegador."," O Supabase bloqueia\n",[21,168,169],{},"sb_secret_…"," olhando o cabeçalho ",[21,172,173],{},"User-Agent"," e responde 401. Colar uma delas no\nfrontend, portanto, não faz o erro sumir, que é o melhor desfecho disponível\naqui.",[10,176,177,184,185,187,188,191],{},[31,178,179,180,183],{},"Uma chave ",[21,181,182],{},"service_role"," antiga não tem esse bloqueio."," Ela funciona. A lista\nenche, o app se comporta igual à semana passada, e a chave agora está num arquivo\nque qualquer visitante pode baixar. Ali ela ignora toda regra que você escreveu:\n",[21,186,182],{}," carrega o atributo ",[21,189,190],{},"BYPASSRLS"," do Postgres, então uma policy nunca\nse aplica a ela. Cada linha de cada tabela, legível e gravável por quem abrir o\narquivo.",[10,193,194],{},"A nota do Supabase sobre o bloqueio do navegador merece duas leituras. O bloqueio\nresponde 401, e um atacante ainda consegue usar a chave com outras ferramentas. O\nque ele protege são as requisições do seu próprio app; a mesma chave no mesmo\narquivo responde a uma requisição enviada de um script.",[57,196],{"alt":197,"caption":198,"src":199},"Uma chave desenhada duas vezes. Em cima, seu caminho a partir de uma janela de navegador para numa barra âmbar sólida com o número 401. Embaixo, a mesma chave sai de um terminal e atravessa o lugar onde aquela barra estaria, aqui desenhada como contorno tracejado, até três linhas de tabela preenchidas em vermelho.","O bloqueio do navegador é sobre o navegador. A mesma chave no mesmo arquivo funciona a partir de qualquer coisa que não seja um.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fthe-browser-block-1600x640.png",[36,201,203],{"id":202},"o-outro-caminho-errado-e-por-que-ele-é-tão-fácil","O outro caminho errado, e por que ele é tão fácil",[10,205,206],{},"Afrouxar uma regra na tabela também cala a mensagem, e muda quem pode ler suas\nlinhas.",[10,208,209],{},"Aqui está aquele tópico do Supabase inteiro, agrupado pelo que cada resposta pede\nque você mude:",[211,212,213,229],"table",{},[214,215,216],"thead",{},[217,218,219,223,226],"tr",{},[220,221,222],"th",{},"O que mudar",[220,224,225],{},"Quantas das oito respostas",[220,227,228],{},"O que isso muda de verdade",[230,231,232,244,255,265],"tbody",{},[217,233,234,238,241],{},[235,236,237],"td",{},"A Site URL dentro de Auth",[235,239,240],{},"1",[235,242,243],{},"Onde um redirect aterrissa",[217,245,246,249,252],{},[235,247,248],{},"Uma policy ou um grant",[235,250,251],{},"3",[235,253,254],{},"Quem lê e escreve suas linhas",[217,256,257,260,262],{},[235,258,259],{},"A consulta ou a sessão",[235,261,251],{},[235,263,264],{},"Seu próprio código",[217,266,267,272,274],{},[235,268,269,270],{},"O cabeçalho ",[21,271,48],{},[235,273,240],{},[235,275,276],{},"O que a porta estava pedindo",[10,278,279],{},"A última linha é a que responde à dica contida na mensagem. É o comentário do pé\ndo tópico e tem um voto só.",[10,281,282],{},"Nenhuma das outras sete foi escrita de má-fé, e é isso que torna a coisa difícil.\nUma mesma mensagem aparece mesmo em várias situações, quem respondeu de fato\ncolocou o próprio app no ar, e uma policy que já faltava é mesmo algo a\nconsertar. O que sai errado é a ordem: reescreve-se uma regra para calar uma\nmensagem sobre um cabeçalho, e a regra é a metade desse par que ninguém confere\ndepois. Seu app funciona dos dois jeitos, então nada lhe diz qual dos dois você\nfez.",[10,284,285,286,289],{},"De fora, o resultado aparece. Nosso scanner lê apps no ar como um desconhecido\nleria, e dos 31.056 apps que ele avaliou, ",[31,287,288],{},"três"," publicaram uma chave secreta\ndo Supabase. Isso faz dela o achado mais raro que temos, e o mais grave.",[10,291,292,293,296],{},"O impulso ao lado é muito mais comum. Atrás de 8.435 desses apps encontramos um\nprojeto Supabase. Em 3.680 deles a pergunta \"um desconhecido consegue ler esta\ntabela\" chegou a ter uma resposta aproveitável, e ",[31,294,295],{},"2.096 responderam que sim",":\npelo menos uma tabela entregou linhas a uma requisição de fora sem nenhuma conta\nenvolvida. Em 394 deles a tabela aberta tinha nome de tabela de pessoas.",[10,298,299,300,84],{},"Parte disso é proposital. Um cardápio publicado, uma página de anúncios e um\nchangelog público vivem todos em tabelas que um desconhecido deve poder ler, e\nnosso scanner não sabe separá-las de uma tabela de clientes aberta por descuido.\nEle relata o que respondeu e deixa o julgamento com você, que é a razão de\n",[80,301,303],{"href":302},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","ligar Row Level Security não ser o mesmo que estar protegido",[57,305],{"alt":306,"caption":307,"src":308},"Três barras na mesma escala, ficando mais curtas para baixo. A primeira são todos os apps em que um projeto Supabase foi encontrado. A segunda é o número menor em que a pergunta sobre a tabela teve resposta, com o restante seguindo como contorno tracejado com um ponto de interrogação. A terceira são os apps que responderam que sim.","O que um desconhecido consegue ler, sobre os apps que responderam. A faixa tracejada são os apps que não responderam nada, o que não é a mesma coisa que um app sem nada aberto.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fwhat-answered-1600x620.png",[10,310,311,312,84],{},"Se você prefere ver sua própria resposta a deduzi-la, nosso scan gratuito lê seu\nsite no ar e diz o que ele alcança de fora. Leva uns 20 segundos e não precisa\nde conta: ",[80,313,315],{"href":314},"\u002Fsecurity-scanner","escanear seu app",[36,317,319],{"id":318},"como-saber-qual-chave-você-colou","Como saber qual chave você colou",[10,321,322],{},"Leia o começo da string.",[10,324,325,328,329,331],{},[21,326,327],{},"sb_publishable_…"," pertence ao seu app. ",[21,330,169],{}," nunca. Não há nada a\ndecodificar, porque para que serve a chave está escrito na frente dela.",[10,333,334,335,338],{},"Um valor longo que começa com ",[21,336,337],{},"eyJ"," é uma do par antigo, e é aí que as duas ficam\ndifíceis de separar. A seção do meio de uma chave dessas é informação legível e\nnão criptografia, e ela carrega um campo que resolve a pergunta:",[14,340,343],{"className":341,"code":342,"language":19},[17],"{\n  \"iss\": \"supabase\",\n  \"role\": \"anon\",          ← o que importa\n  \"iat\": 1750000000\n}\n",[21,344,342],{"__ignoreMap":23},[10,346,347,350,351,353,354,356],{},[21,348,349],{},"anon"," é a publicável do par. ",[21,352,182],{}," é a que você rotaciona hoje. A\ndocumentação do Supabase diz isso de forma mais seca do que diríamos: se um\ntutorial ou um assistente de IA manda copiar uma chave longa que começa com\n",[21,355,337],{},", ele foi escrito para as chaves antigas.",[10,358,359,360,362,363,365,366,370,371,375],{},"Os dois pares podem estar ativos ao mesmo tempo, e é nesse detalhe que as pessoas\ntropeçam. Criar uma chave publicável ou secreta deixa suas chaves ",[21,361,349],{}," e\n",[21,364,182],{}," exatamente onde estavam, e elas seguem funcionando até você\ndesativá-las no painel, o que é um passo separado.\n",[80,367,369],{"href":368},"\u002Fblog\u002Fsupabase-new-api-keys","O que mudou com as chaves novas"," cobre essa\nmigração, e\n",[80,372,374],{"href":373},"\u002Fblog\u002Fwhere-to-find-supabase-api-keys","onde cada valor fica no seu painel"," é a\npágina a abrir se você nunca esteve lá.",[36,377,379],{"id":378},"se-a-chave-secreta-já-está-no-seu-app","Se a chave secreta já está no seu app",[10,381,382],{},"Rotacione antes de editar qualquer coisa, e trabalhe na ordem que o Supabase dá.",[10,384,385,386,362,388,390],{},"Crie uma chave secreta nova no painel. Substitua a antiga em todos os lugares em\nque seu projeto a usa. Confirme que cada parte do app está na nova. Só então\naposente a antiga, e esse último passo muda conforme o par que você tem na mão:\napagar uma chave secreta não dá para desfazer, enquanto desativar um par ",[21,387,349],{},[21,389,182],{}," antigo é reversível, então você pode religá-las se esqueceu algum\ncliente.",[10,392,393,394,398],{},"Rotacionar primeiro ou tapar o vazamento primeiro depende de já existir uma cópia\npública.\n",[80,395,397],{"href":396},"\u002Fblog\u002Frotate-supabase-service-role-key","Rotacionar uma chave service_role do Supabase","\npercorre as duas ordens e o que ler nos seus logs depois.",[36,400,402],{"id":401},"para-continuar-assim-quando-o-erro-some","Para continuar assim quando o erro some",[10,404,405,408],{},[31,406,407],{},"A correção vale até o próximo prompt ou a próxima mudança que mexer na sua\nconfiguração do Supabase."," Basta um prompt para colocar uma chave de volta ou\nafrouxar uma regra de novo, e o seu app continua funcionando nos dois casos,\nentão a mudança só aparece quando alguém olha.",[10,410,411],{},[31,412,413,414,418],{},"O ",[80,415,417],{"href":416},"\u002Fpricing","Reeve Monitor"," olha por você:",[420,421,422,426,429,432],"ul",{},[423,424,425],"li",{},"as nove verificações a cada hora, em até três apps",[423,427,428],{},"um e-mail no dia em que um novo scan der ao seu app uma nota mais baixa que o anterior",[423,430,431],{},"se o app está no ar, a cada 60 segundos",[423,433,434],{},"um relatório mensal do que ele viu",[10,436,437],{},[31,438,439,440,444],{},"Uma chave que pode escrever cada linha também pode esvaziar cada tabela. O\n",[80,441,443],{"href":442},"\u002Fsupabase-backups","Reeve Care"," guarda uma cópia do seu banco Supabase onde\nnenhuma chave do seu app alcança.",[420,446,447,450,453,456,459],{},[423,448,449],{},"uma cópia criptografada todo dia, guardada fora da sua conta do Supabase",[423,451,452],{},"cada cópia verificada antes de valer, com a contagem das linhas de cada tabela",[423,454,455],{},"uma restauração com um clique que salva o que existe agora antes de substituir qualquer coisa",[423,457,458],{},"os seus arquivos enviados também, assim que você conectar uma credencial de Storage",[423,460,461],{},"tudo o que o Monitor faz",[36,463,465],{"id":464},"o-que-fazer-hoje","O que fazer hoje",[467,468,469],"key-takeaways",{},[420,470,471,474,480,489,492],{},[423,472,473],{},"Leia a mensagem como uma recusa na porta. Suas linhas não foram tocadas e não há nada a recuperar.",[423,475,476,477,479],{},"Olhe na aba de rede do navegador a requisição que falhou e veja se existe um cabeçalho ",[21,478,48],{}," ali. Essa única olhada diz se o problema é de chave ou de redirecionamento.",[423,481,482,483,485,486,488],{},"Crie seu cliente Supabase com a chave publicável e deixe a biblioteca enviar o cabeçalho. ",[21,484,327],{}," num projeto novo, a chave ",[21,487,349],{}," num antigo.",[423,490,491],{},"Se já existe uma chave secreta no seu app, rotacione primeiro. Apagar do código não fecha a porta, porque a versão antiga continua no seu histórico e em qualquer cópia em cache do site.",[423,493,494],{},"Devolva ao lugar qualquer regra que você afrouxou nessa caça, e depois confira de fora, não pelo preview do seu builder.",[10,496,497,498,502,503,507],{},"Comece pela única tabela de onde veio o erro, e depois leia as policies de cada\ntabela que você mexeu na mesma semana. A\n",[80,499,501],{"href":500},"\u002Fchecklist","checklist de segurança de 10 minutos"," cobre o que mais costuma ficar\naberto num app recém-lançado, e o\n",[80,504,506],{"href":505},"\u002Fis-your-supabase-app-safe","guia de segurança do Supabase"," percorre o resto do\nque um desconhecido consegue alcançar.",{"title":23,"searchDepth":509,"depth":509,"links":510},3,[511,513,514,515,516,517,518,519,520],{"id":38,"depth":512,"text":39},2,{"id":64,"depth":512,"text":65},{"id":120,"depth":512,"text":121},{"id":153,"depth":512,"text":154},{"id":202,"depth":512,"text":203},{"id":318,"depth":512,"text":319},{"id":378,"depth":512,"text":379},{"id":401,"depth":512,"text":402},{"id":464,"depth":512,"text":465},"Noções de segurança","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcover-1200x630.png","Uma requisição chega a um portão alto com a fenda do crachá vazia e uma barra atravessada, e o banco de dados a que ela ia fica intacto atrás.","\"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.",false,"md",[528,531,534,537,540],{"q":529,"a":530},"O que significa \"No API key found in request\"?","Significa que sua requisição chegou ao Supabase sem o cabeçalho apikey, então a porta que o Supabase coloca na frente do seu projeto a recusou antes que o banco de dados entrasse na história. Nada foi lido, nada foi escrito e nada mudou nos seus dados. A resposta traz uma dica que diz o mesmo com outras palavras: no apikey request header or url param was found.",{"q":532,"a":533},"Qual chave do Supabase vai no cabeçalho apikey?","A sua chave publicável, que é sb_publishable_ em um projeto novo e a chave anon em um mais antigo. O Supabase entrega essa chave exatamente para isso e conta que ela fique visível dentro do seu app. A biblioteca cliente a coloca no cabeçalho em toda requisição, então se você cria o cliente com a chave publicável nunca escreve o cabeçalho na mão.",{"q":535,"a":536},"É seguro deixar minha chave anon no navegador?","Sim, e ela precisa estar lá para o seu app conseguir falar com o seu projeto. A chave anon só diz a que projeto uma requisição pertence; o que um visitante com ela de fato alcança é decidido pelas regras de Row Level Security das suas tabelas. Quais chaves de API são seguras no frontend percorre toda a família de chaves e mostra como lê-las.",{"q":538,"a":539},"Usei a chave service_role e funcionou. Isso é um problema?","Sim, e é o que vale a pena resolver hoje. Uma chave service_role carrega o atributo BYPASSRLS do Postgres, então suas policies nunca se aplicam a ela. Publicada dentro do seu app, ela fica em um arquivo que qualquer visitante pode baixar, e quem baixar consegue ler e escrever cada linha de cada tabela. Rotacione a chave primeiro e depois mova para um servidor aquilo que precisava dela.",{"q":541,"a":542},"Como sei qual chave eu colei?","Leia o começo da string. sb_publishable_ pertence ao seu app e sb_secret_ nunca. Um valor longo que começa com eyJ é uma do par antigo, e essas duas parecem idênticas, então é preciso olhar dentro: a seção do meio se decodifica em dados legíveis com um campo role, que diz anon ou service_role.","\u002Fblog\u002Fno-api-key-found-in-request\u002Fcard-800x500.png",[545,546,547,548,549,550,551],"no api key found in request","no api key found in request supabase","supabase api key nao encontrada","supabase cabecalho apikey faltando","401 api key invalida supabase","supabase api key nao funciona","supabase 401 unauthorized",{},true,"\"No API key found in request\" no Supabase","\u002Fblog\u002Fno-api-key-found-in-request","2026-10-07",{"title":5,"description":524},"blog\u002Fno-api-key-found-in-request",[560,561,562],"\"No API key found in request\" significa que sua requisição chegou ao Supabase sem o cabeçalho apikey, então foi recusada na porta antes que o seu banco de dados fosse consultado.","A correção certa é sua chave publicável nesse cabeçalho, que é a chave feita para ser pública. A biblioteca cliente do Supabase a envia por você em toda requisição.","As duas correções a que as pessoas recorrem no lugar dela são a chave secreta e uma regra mais frouxa na tabela. As duas calam a mensagem, e as duas deixam suas linhas legíveis para qualquer um que tenha a chave que viaja dentro do seu app.","vSmYcy7Mhaux5rizQSSnimRGYIPH-fdxZp1u-k8LRNE",[565,571,577,583,589,590,596,602,608,614,620,626,632,638,645,651,657,662,668,674,680,686,692,698,704,709,715,721,727,733,739,745,751,757,763,768,774,780,786,792,798,804,810,816,822,828,833,839,845,851,857,863,869,875,881,886,891,897,902,907,913],{"path":566,"title":567,"description":568,"published":569,"category":521,"image":570,"draft":525},"\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":572,"title":573,"description":574,"published":575,"category":521,"image":576,"draft":525},"\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":578,"title":579,"description":580,"published":581,"category":521,"image":582,"draft":525},"\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":584,"title":585,"description":586,"published":587,"category":521,"image":588,"draft":525},"\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":555,"title":5,"description":524,"published":556,"category":521,"image":543,"draft":525},{"path":591,"title":592,"description":593,"published":594,"category":521,"image":595,"draft":525},"\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":597,"title":598,"description":599,"published":600,"category":521,"image":601,"draft":525},"\u002Fblog\u002Fmove-a-secret-to-an-edge-function","Esconder uma chave de API: mova para uma Edge Function do Supabase","Esconder uma chave de API é tirá-la do navegador, e uma Edge Function do Supabase é o menor lugar para guardá-la. Dois passos em volta pesam mais.","2026-10-05","\u002Fblog\u002Fmove-a-secret-to-an-edge-function\u002Fcard-800x500.png",{"path":603,"title":604,"description":605,"published":606,"category":521,"image":607,"draft":525},"\u002Fblog\u002Fenv-file-exposed-on-your-server","Seu arquivo .env está exposto? Os doze caminhos para testar","Seu arquivo .env está exposto no seu próprio servidor web? Doze endereços dizem isso em um minuto, e um acerto significa que tudo nele já é público.","2026-10-04","\u002Fblog\u002Fenv-file-exposed-on-your-server\u002Fcard-800x500.png",{"path":609,"title":610,"description":611,"published":612,"category":521,"image":613,"draft":525},"\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":615,"title":616,"description":617,"published":618,"category":521,"image":619,"draft":525},"\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":621,"title":622,"description":623,"published":624,"category":521,"image":625,"draft":525},"\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":627,"title":628,"description":629,"published":630,"category":521,"image":631,"draft":525},"\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":633,"title":634,"description":635,"published":636,"category":521,"image":637,"draft":525},"\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":639,"title":640,"description":641,"published":642,"category":643,"image":644,"draft":525},"\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":646,"title":647,"description":648,"published":649,"category":643,"image":650,"draft":525},"\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":652,"title":653,"description":654,"published":655,"category":643,"image":656,"draft":525},"\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":658,"title":659,"description":660,"published":655,"category":521,"image":661,"draft":525},"\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":663,"title":664,"description":665,"published":666,"category":521,"image":667,"draft":525},"\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":669,"title":670,"description":671,"published":672,"category":521,"image":673,"draft":525},"\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":675,"title":676,"description":677,"published":678,"category":643,"image":679,"draft":525},"\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":681,"title":682,"description":683,"published":684,"category":521,"image":685,"draft":525},"\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":687,"title":688,"description":689,"published":690,"category":521,"image":691,"draft":525},"\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":693,"title":694,"description":695,"published":696,"category":521,"image":697,"draft":525},"\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":699,"title":700,"description":701,"published":702,"category":521,"image":703,"draft":525},"\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":82,"title":705,"description":706,"published":707,"category":521,"image":708,"draft":525},"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":710,"title":711,"description":712,"published":713,"category":521,"image":714,"draft":525},"\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":716,"title":717,"description":718,"published":719,"category":521,"image":720,"draft":525},"\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":722,"title":723,"description":724,"published":725,"category":521,"image":726,"draft":525},"\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":728,"title":729,"description":730,"published":731,"category":643,"image":732,"draft":525},"\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":734,"title":735,"description":736,"published":737,"category":643,"image":738,"draft":525},"\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":740,"title":741,"description":742,"published":743,"category":643,"image":744,"draft":525},"\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":746,"title":747,"description":748,"published":749,"category":521,"image":750,"draft":525},"\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":752,"title":753,"description":754,"published":755,"category":521,"image":756,"draft":525},"\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":758,"title":759,"description":760,"published":761,"category":521,"image":762,"draft":525},"\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":396,"title":764,"description":765,"published":766,"category":521,"image":767,"draft":525},"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":769,"title":770,"description":771,"published":772,"category":521,"image":773,"draft":525},"\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":775,"title":776,"description":777,"published":778,"category":521,"image":779,"draft":525},"\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":781,"title":782,"description":783,"published":784,"category":521,"image":785,"draft":525},"\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":787,"title":788,"description":789,"published":790,"category":521,"image":791,"draft":525},"\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":793,"title":794,"description":795,"published":796,"category":521,"image":797,"draft":525},"\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":799,"title":800,"description":801,"published":802,"category":521,"image":803,"draft":525},"\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps","Chave de API exposta no frontend: o que 30.998 apps entregam","Uma chave de API exposta no seu frontend costuma ser uma chave do Google Maps. Escaneamos 30.998 apps vibe-coded e contamos quais segredos vazam de verdade.","2026-09-02","\u002Fblog\u002Fwhat-secrets-leak-from-vibe-coded-apps\u002Fcard-800x500.png",{"path":805,"title":806,"description":807,"published":808,"category":643,"image":809,"draft":525},"\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":811,"title":812,"description":813,"published":814,"category":521,"image":815,"draft":525},"\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":817,"title":818,"description":819,"published":820,"category":643,"image":821,"draft":525},"\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":823,"title":824,"description":825,"published":826,"category":521,"image":827,"draft":525},"\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":373,"title":829,"description":830,"published":831,"category":521,"image":832,"draft":525},"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":834,"title":835,"description":836,"published":837,"category":521,"image":838,"draft":525},"\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":840,"title":841,"description":842,"published":843,"category":521,"image":844,"draft":525},"\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":846,"title":847,"description":848,"published":849,"category":643,"image":850,"draft":525},"\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":852,"title":853,"description":854,"published":855,"category":643,"image":856,"draft":525},"\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":858,"title":859,"description":860,"published":861,"category":521,"image":862,"draft":525},"\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":864,"title":865,"description":866,"published":867,"category":521,"image":868,"draft":525},"\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":870,"title":871,"description":872,"published":873,"category":643,"image":874,"draft":525},"\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":876,"title":877,"description":878,"published":879,"category":521,"image":880,"draft":525},"\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":882,"title":883,"description":884,"published":879,"category":521,"image":885,"draft":525},"\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":368,"title":887,"description":888,"published":889,"category":521,"image":890,"draft":525},"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":892,"title":893,"description":894,"published":895,"category":643,"image":896,"draft":525},"\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":302,"title":898,"description":899,"published":900,"category":521,"image":901,"draft":525},"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":903,"title":904,"description":905,"published":900,"category":643,"image":906,"draft":525},"\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":908,"title":909,"description":910,"published":911,"category":643,"image":912,"draft":525},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","Três formas de fazer backup de um banco Supabase, e o que falta","O painel, o pg_dump e um serviço gerenciado. O que cada um salva de verdade, o que deixa de fora sem avisar e qual sobrevive a perder a conta.","2026-08-09","\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database\u002Fcard-800x500.png",{"path":148,"title":914,"description":915,"published":911,"category":521,"image":916,"draft":525},"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",1791705963231]