[{"data":1,"prerenderedAt":376},["ShallowReactive",2],{"blog-pt-can-anyone-read-your-supabase-database":3},{"id":4,"title":5,"body":6,"category":336,"cover":337,"coverAlt":337,"description":338,"draft":339,"extension":340,"faq":341,"image":357,"keywords":358,"meta":364,"navigation":365,"ogTitle":366,"path":367,"published":368,"seo":369,"stem":370,"tldr":371,"updated":368,"__hash__":375},"blog_pt\u002Fblog\u002Fcan-anyone-read-your-supabase-database.md","Qualquer um consegue ler seu banco Supabase? Testamos 3.680 apps",{"type":7,"value":8,"toc":324},"minimark",[9,13,20,23,26,31,34,43,46,49,53,56,116,122,125,131,137,148,152,155,160,184,191,199,203,206,209,217,221,224,231,235,238,244,250,259,263,297,300,305,312],[10,11,12],"p",{},"Seu app tem uma tela de login. Atrás dela estão seus usuários, as mensagens\ndeles, talvez os pedidos. Parece privado, e não existe um jeito óbvio de\ndescobrir se é mesmo, porque o console do Supabase não é um lugar em que você\ntenha precisado entrar alguma vez.",[10,14,15,16],{},"Então fomos medir isso nos apps dos outros. Em agosto de 2026 escaneamos 30.998\napps no ar publicados a partir de Lovable, Base44, Replit, v0 e Bolt, e fizemos\na cada um uma única pergunta: ",[17,18,19],"strong",{},"qualquer um consegue ler seu banco de dados\nSupabase sem fazer login?",[10,21,22],{},"Em 2.096 dos 3.680 apps em que obtivemos uma resposta clara, sim.",[10,24,25],{},"E aqui está a parte que tanto a versão alarmante quanto a tranquilizadora dessa\nhistória erram. Uma tabela aberta não é automaticamente um vazamento: muitas\ntabelas existem para ser lidas por todo mundo. Qual tabela é decide tudo, e essa\npergunta só quem construiu o app consegue responder. É também por isso que\nninguém percebe: o app funciona perfeitamente nos dois casos.",[27,28,30],"h2",{"id":29},"qualquer-um-consegue-ler-seu-banco-de-dados-supabase","Qualquer um consegue ler seu banco de dados Supabase?",[10,32,33],{},"Em mais da metade dos apps que conseguimos verificar, sim: pelo menos uma tabela\ndevolveu linhas para um pedido que não levava login nenhum.",[10,35,36,37,42],{},"Isso ser possível não tem nada a ver com algo estar quebrado. Seu app conversa\ncom o Supabase a partir do navegador de quem visita, então ele carrega uma chave\nque qualquer visitante consegue ler, e essa chave\n",[38,39,41],"a",{"href":40},"\u002Fblog\u002Fwhich-api-keys-are-safe-in-your-frontend","foi feita para ser pública",".\nEla nomeia seu projeto. Sozinha, não concede nada.",[10,44,45],{},"Quem decide se um estranho leva seus dados é o Row Level Security: uma regra em\ncada tabela dizendo quem pode ler quais linhas. Sem regra, a chave é a única\ncoisa entre a internet e aquela tabela, e a chave está escrita na sua página.",[10,47,48],{},"Era isso que estávamos medindo. Não se a chave estava visível (ela sempre está),\nmas o que o banco faz quando alguém a usa.",[27,50,52],{"id":51},"de-que-os-57-são-uma-fatia","De que os 57% são uma fatia",[10,54,55],{},"De uma base que estreitamos três vezes, e o estreitamento importa mais do que a\nmanchete.",[57,58,59,72],"table",{},[60,61,62],"thead",{},[63,64,65,69],"tr",{},[66,67,68],"th",{},"O que contamos",[66,70,71],{},"Apps",[73,74,75,84,92,100,108],"tbody",{},[63,76,77,81],{},[78,79,80],"td",{},"Apps no ar escaneados e classificados",[78,82,83],{},"30.998",[63,85,86,89],{},[78,87,88],{},"Citam um projeto Supabase na página",[78,90,91],{},"8.435",[63,93,94,97],{},[78,95,96],{},"Tabela confirmada e resposta obtida",[78,98,99],{},"3.680",[63,101,102,105],{},[78,103,104],{},"Pelo menos uma tabela legível sem login",[78,106,107],{},"2.096",[63,109,110,113],{},[78,111,112],{},"…e uma delas tinha nome de pessoas",[78,114,115],{},"394",[117,118],"diagram",{"alt":119,"caption":120,"src":121},"Quatro barras medidas contra o mesmo total, cada uma mais estreita que a anterior: 30.998 apps escaneados, 8.435 usando Supabase, 3.680 em que a verificação foi até o fim, 2.096 com uma tabela legível por qualquer um. A coluna da direita marca 27%, 44% e 57%, a fatia que cada etapa guarda da etapa acima.","Todas as barras estão medidas contra o mesmo total. Os 57% são uma fatia dos 3.680 apps que realmente conseguimos verificar, não de todos os que escaneamos.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fwhat-we-measured-1600x700.png",[10,123,124],{},"Três coisas que não fizemos. Cada uma empurra o número real para um lado ou para\no outro, e merece ser dita em vez de enterrada.",[10,126,127,130],{},[17,128,129],{},"Só perguntamos por nomes de tabela que conseguimos ver ou adivinhar."," O\nSupabase não deixa mais uma chave publicável listar as tabelas de um projeto,\nentão lemos os nomes que cada app menciona no próprio código e acrescentamos umas\nduas dúzias de nomes comuns, com teto de trinta por app. Um app cujas tabelas se\nchamem algo que não nos ocorreu parece limpo para nós e pode não ser.",[10,132,133,136],{},[17,134,135],{},"Contamos linhas, nunca as lemos."," Cada sondagem perguntou ao banco quantas\nlinhas ele entregaria e parou por aí. Nenhum dado de ninguém foi baixado, e\nnenhum app é citado neste artigo nem em nada que publicamos.",[10,138,139,142,143,147],{},[17,140,141],{},"Quase todos os apps que conseguimos verificar eram apps Lovable."," Eles são a\nmaior fatia do que escaneamos e os mais propensos a citar o projeto Supabase na\npágina, então leia isto como uma medição de\n",[38,144,146],{"href":145},"\u002Fis-your-lovable-app-safe","apps Lovable com Supabase"," e não de todo builder.\nOnde a verificação não conseguiu terminar, registramos que não terminou. Um app\nque não conseguimos verificar é desconhecido, não limpo.",[27,149,151],{"id":150},"uma-tabela-aberta-não-é-automaticamente-um-buraco","Uma tabela aberta não é automaticamente um buraco",[10,153,154],{},"De fora, uma tabela que qualquer um pode ler tem exatamente a mesma cara,\nesteja nela seu catálogo de produtos ou seus clientes. A resposta é a mesma. Só\no nome muda.",[117,156],{"alt":157,"caption":158,"src":159},"Dois caminhos de pedido idênticos desenhados um acima do outro. Ambos enviam um nome de tabela, ambos recebem uma resposta 200 e ambos recebem cinco linhas. O caminho de cima está rotulado products e termina num visto verde; o de baixo está rotulado profiles e termina num xis vermelho.","Mesmo pedido, mesma resposta, veredictos opostos. Só quem construiu o app sabe qual dos dois casos é a sua tabela aberta.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fsame-answer-different-table-1600x600.png",[10,161,162,163,167,168,167,171,167,174,167,177,167,180,183],{},"É por isso que dividimos o achado em dois. Em 394 desses apps, uma das tabelas\nlegíveis tinha um nome de uma lista curta que para nós significa pessoas:\n",[164,165,166],"code",{},"users",", ",[164,169,170],{},"profiles",[164,172,173],{},"customers",[164,175,176],{},"orders",[164,178,179],{},"messages",[164,181,182],{},"invoices",". Isso é um\nestranho lendo seus clientes, e precisa ser resolvido hoje.",[10,185,186,187,190],{},"As outras 1.702 não conseguimos julgar de fora, e nenhum outro scanner\nconsegue. Uma tabela ",[164,188,189],{},"posts"," pode ser um blog público ou anotações privadas.\nVocê sabe qual. Ninguém olhando seu app pela internet sabe.",[10,192,193,194,198],{},"Se preferir não chutar sobre o seu, nosso scan gratuito verifica seu site no ar\nde fora e diz quais tabelas responderam. Leva uns 20 segundos e não pede conta:\n",[38,195,197],{"href":196},"\u002F#scan","escanear seu app",".",[27,200,202],{"id":201},"por-que-isso-acontece-com-apps-que-ninguém-abriu-de-propósito","Por que isso acontece com apps que ninguém abriu de propósito",[10,204,205],{},"Porque o conserto que faz um app quebrado voltar a funcionar costuma ser o que\nabre a tabela.",[10,207,208],{},"A sequência é esta. O Row Level Security é ligado, por você ou pelo builder. Seu\napp para de mostrar dados na hora, porque ligado sem regras significa que o\nbanco recusa todo mundo, você inclusive. Você cola o erro para o seu assistente,\nele escreve uma política que permite qualquer pedido, e o app volta a funcionar.\nDepois disso, nada parece errado.",[10,210,211,212,216],{},"Essa política é a que encontramos. O painel informa a tabela como protegida,\nporque a chave está ligada e existe uma política. O artigo sobre\n",[38,213,215],{"href":214},"\u002Fblog\u002Fsupabase-rls-on-but-table-still-public","por que Row Level Security ligado não é a mesma coisa que protegido","\npercorre os quatro estados possíveis de uma tabela e como reconhecer o seu.",[27,218,220],{"id":219},"o-vazamento-sobre-o-qual-te-avisaram-era-o-raro","O vazamento sobre o qual te avisaram era o raro",[10,222,223],{},"Em todos os 30.998 apps, uma chave secreta do Supabase parada no navegador (a\nchave que ignora todas as regras que você escreveu) apareceu 3 vezes.",[10,225,226,227,230],{},"É o vazamento sobre o qual quem tem um app ouve falar o tempo todo e o que menos\nencontramos. É sério quando acontece, e\n",[38,228,229],{"href":40},"vale saber reconhecê-lo",", mas a\npreocupação gasta ali vigia uma porta que quase sempre está fechada. A abertura\ncomum nesses apps é uma tabela qualquer sem nenhuma regra.",[27,232,234],{"id":233},"como-verificar-o-seu-próprio-app","Como verificar o seu próprio app",[10,236,237],{},"Dois lugares para olhar dentro do seu banco de dados Supabase, e um jeito de\nvê-lo de onde um estranho está.",[10,239,240,243],{},[17,241,242],{},"Abra o Security Advisor no seu painel do Supabase."," Ele lista cada tabela com\nRow Level Security desligado, que é a versão mais clara desse problema. O\nSupabase sinaliza bem isso, e se o seu projeto estiver nessa lista você já tem a\nresposta sem ler uma linha de SQL.",[10,245,246,249],{},[17,247,248],{},"Depois leia as políticas de qualquer tabela que guarde pessoas."," O Security\nAdvisor não consegue decidir se uma política permissiva é proposital, porque num\ncatálogo de produtos ela estaria correta. Abra a tabela, olhe a política e veja\nse ela cita uma condição ou se permite todo mundo.",[10,251,252,255,256,258],{},[17,253,254],{},"Ou verifique de fora, que é onde o risco mora."," Um estranho não abre seu\npainel. Nosso scan gratuito faz o mesmo pedido anônimo que alguém de fora faria\ne relata quais tabelas responderam: ",[38,257,197],{"href":196},", sem conta e sem\ninstalar nada.",[27,260,262],{"id":261},"o-que-fazer-com-uma-tabela-que-não-deveria-ser-legível","O que fazer com uma tabela que não deveria ser legível",[264,265,266],"key-takeaways",{},[267,268,269,285,288,291,294],"ul",{},[270,271,272,273,167,275,167,277,167,279,281,282,284],"li",{},"Comece pelas tabelas que guardam pessoas. ",[164,274,166],{},[164,276,170],{},[164,278,173],{},[164,280,176],{}," e ",[164,283,179],{}," são onde ficam os dados de outra gente, e são as que valem uma noite.",[270,286,287],{},"Escreva a regra antes de ampliar qualquer outra coisa. Uma política que cita uma condição (esta linha pertence a este usuário logado) é o que faz a chave publicável do seu app poder estar ali sem problema.",[270,289,290],{},"Verifique a política, não o botão. Ligado com uma regra que permite todo mundo tem, visto de fora, exatamente a mesma cara de desligado, e seu painel mostra o primeiro caso como protegido.",[270,292,293],{},"Deixe em paz as tabelas realmente públicas. Uma lista de produtos ou um artigo publicado poderem ser lidos está correto, e tirar isso quebra seu app sem ganho nenhum.",[270,295,296],{},"Depois da mudança, teste do jeito que um estranho testaria. O seu app mostrar a coisa certa prova o que o seu app pede, não o que o seu banco entregaria.",[10,298,299],{},"Verificar isso uma vez é uma noite. Manter a resposta verdadeira no mês que vem\né a parte que não cabe numa noite, e é para isso que construímos o Reeve Care.\nEle repete essa mesma verificação no seu app em uma programação e envia um\ne-mail quando a resposta piora, porque uma tabela que estava fechada em março e\naberta em junho não é algo que alguém note de dentro do próprio app.",[117,301],{"alt":302,"caption":303,"src":304},"O logotipo do Reeve Care ao lado de duas linhas. Na linha de cima, uma faixa de linhas de tabela é lida por uma lupa e marcada com uma seta de repetição. Na de baixo, um banco de dados dentro de uma moldura tracejada é copiado para um arquivo fora dela, com uma lupa ao lado da cópia.","As duas tarefas: a verificação roda de novo em uma programação, e uma cópia do seu banco sai da sua conta Supabase e é relida antes de valer.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcare-watch-and-backup-1600x520.png",[10,306,307,308,198],{},"Ele também mantém backups próprios do seu banco de dados Supabase, feitos em uma\nprogramação, guardados fora da sua conta Supabase e relidos para verificação\nantes de contarem, com uma restauração que salva o estado atual antes de\nreproduzir qualquer coisa. Essa segunda metade importa aqui porque nós só\nverificamos a leitura. A mesma política permissiva pode permitir escrita, e um\nestranho escrevendo na sua tabela é a versão que a esvazia, e aí uma cópia de\nantes é a única coisa que devolve as linhas. O Care cobre o seu banco de dados, e os\narquivos enviados para o Storage assim que você os conecta, no Supabase e não em\ntodo tipo de banco:\n",[38,309,311],{"href":310},"\u002F#pricing","o que ele vigia e quanto custa",[10,313,314,315,319,320,198],{},"Se preferir seguir por uma lista, o\n",[38,316,318],{"href":317},"\u002Fchecklist","checklist de segurança de 10 minutos"," cobre isto junto com as\noutras coisas que vale fechar num app recém-lançado. E se uma tabela ficou\naberta por um tempo, o que você poderá desfazer depois depende inteiramente de\n",[38,321,323],{"href":322},"\u002Fblog\u002Fthree-ways-to-back-up-a-supabase-database","o que você estava salvando",{"title":325,"searchDepth":326,"depth":326,"links":327},"",3,[328,330,331,332,333,334,335],{"id":29,"depth":329,"text":30},2,{"id":51,"depth":329,"text":52},{"id":150,"depth":329,"text":151},{"id":201,"depth":329,"text":202},{"id":219,"depth":329,"text":220},{"id":233,"depth":329,"text":234},{"id":261,"depth":329,"text":262},"Noções de segurança",null,"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.",false,"md",[342,345,348,351,354],{"q":343,"a":344},"Como descubro se qualquer um consegue ler meu banco de dados Supabase?","Duas verificações resolvem quase tudo. No seu painel do Supabase, abra o Security Advisor: ele lista cada tabela com Row Level Security desligado, e essas podem ser lidas por qualquer pessoa que tenha a chave que viaja dentro do seu app. Depois abra as políticas de qualquer tabela que guarde pessoas, porque uma tabela pode passar na primeira verificação e ainda assim estar aberta: uma política que permite todo mundo está ligada, é válida e aparece no painel como protegida. Se preferir ver de fora, nosso scan gratuito lê seu site no ar do jeito que um estranho leria.",{"q":346,"a":347},"É ruim se uma das minhas tabelas pode ser lida por qualquer um?","Depende da tabela, e você é a única pessoa que pode decidir. Uma lista de produtos, de artigos publicados ou de lugares num mapa existe para ser lida por todo mundo, e uma política que permite isso está correta. O mesmo ajuste numa tabela de usuários, pedidos ou mensagens significa que estranhos leem seus clientes. Pergunte se você publicaria o conteúdo dessa tabela numa página aberta, e deixe a resposta decidir.",{"q":349,"a":350},"Tenho o Row Level Security ligado. Isso quer dizer que minhas tabelas estão protegidas?","Não por si só. A chave e as regras são duas coisas diferentes: ligado sem nenhuma regra bloqueia todo mundo, inclusive o seu próprio app, e ligado com uma regra permissiva não bloqueia ninguém. A regra que acaba sendo escrita quando um app quebra depois de ligar o Row Level Security costuma ser a que permite qualquer pedido de qualquer pessoa, o que faz o app voltar e deixa a tabela aberta. Leia a política da tabela, não o botão.",{"q":352,"a":353},"Meu app tem tela de login. Isso não mantém as pessoas fora do banco?","Não. Sua tela de login decide o que o seu app mostra. Ela não decide o que o seu banco entrega, porque um pedido não precisa vir do seu app: a chave que o app carrega pode ser lida por qualquer visitante e usada direto contra o seu banco. Quem decide a resposta é o Row Level Security em cada tabela.",{"q":355,"a":356},"O que faço primeiro se encontrar uma tabela que estranhos conseguem ler?","Conserte a política daquela tabela antes de qualquer outra coisa e depois olhe o que estava ao alcance enquanto ela ficou aberta. Comece pelas tabelas que guardam pessoas, porque são as que têm dados de outra gente. Se a tabela estava aberta e guarda dados pessoais, verifique se as regras do seu país obrigam a avisar alguém; essa é uma pergunta para um advogado, não para um scanner.","\u002Fblog\u002Fcan-anyone-read-your-supabase-database\u002Fcard-800x500.png",[359,360,361,362,363],"qualquer um consegue ler meu banco supabase","banco de dados supabase público","tabela supabase legível por qualquer um","lovable supabase segurança","supabase rls tabela exposta",{},true,"Qualquer um consegue ler seu banco Supabase?","\u002Fblog\u002Fcan-anyone-read-your-supabase-database","2026-08-18",{"title":5,"description":338},"blog\u002Fcan-anyone-read-your-supabase-database",[372,373,374],"Qualquer um consegue ler seu banco de dados Supabase sem fazer login? Em 2.096 dos 3.680 apps em que a verificação foi até o fim (57%), pelo menos uma tabela disse que sim.","Isso não é automaticamente um vazamento. Algumas tabelas devem mesmo ser públicas. Mas 394 desses apps tinham aberta uma tabela com nome de pessoas: users, profiles, customers, orders.","Aquilo sobre o que mais avisam, uma chave secreta parada dentro do app, apareceu 3 vezes em 30.998 apps. A tabela aberta é o caso comum.","cxTwEG-g3Xqfb3XC90NPZnPb2fKtAXUlJsP_BdAXyEg",1787826050888]