Pular para o conteúdo

Noções de segurança

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.

Vlad Tkachenko8 min de leitura

Em resumo

  • 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.

Seu app tem uma tela de login. Atrás dela estão seus usuários, as mensagens deles, talvez os pedidos. Parece privado, e não existe um jeito óbvio de descobrir se é mesmo, porque o console do Supabase não é um lugar em que você tenha precisado entrar alguma vez.

Então fomos medir isso nos apps dos outros. Em agosto de 2026 escaneamos 30.998 apps no ar publicados a partir de Lovable, Base44, Replit, v0 e Bolt, e fizemos a cada um uma única pergunta: qualquer um consegue ler seu banco de dados Supabase sem fazer login?

Em 2.096 dos 3.680 apps em que obtivemos uma resposta clara, sim.

E aqui está a parte que tanto a versão alarmante quanto a tranquilizadora dessa história erram. Uma tabela aberta não é automaticamente um vazamento: muitas tabelas existem para ser lidas por todo mundo. Qual tabela é decide tudo, e essa pergunta só quem construiu o app consegue responder. É também por isso que ninguém percebe: o app funciona perfeitamente nos dois casos.

Qualquer um consegue ler seu banco de dados Supabase?

Em mais da metade dos apps que conseguimos verificar, sim: pelo menos uma tabela devolveu linhas para um pedido que não levava login nenhum.

Isso ser possível não tem nada a ver com algo estar quebrado. Seu app conversa com o Supabase a partir do navegador de quem visita, então ele carrega uma chave que qualquer visitante consegue ler, e essa chave foi feita para ser pública. Ela nomeia seu projeto. Sozinha, não concede nada.

Quem decide se um estranho leva seus dados é o Row Level Security: uma regra em cada tabela dizendo quem pode ler quais linhas. Sem regra, a chave é a única coisa entre a internet e aquela tabela, e a chave está escrita na sua página.

Era isso que estávamos medindo. Não se a chave estava visível (ela sempre está), mas o que o banco faz quando alguém a usa.

De que os 57% são uma fatia

De uma base que estreitamos três vezes, e o estreitamento importa mais do que a manchete.

O que contamosApps
Apps no ar escaneados e classificados30.998
Citam um projeto Supabase na página8.435
Tabela confirmada e resposta obtida3.680
Pelo menos uma tabela legível sem login2.096
…e uma delas tinha nome de pessoas394
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.

Três coisas que não fizemos. Cada uma empurra o número real para um lado ou para o outro, e merece ser dita em vez de enterrada.

Só perguntamos por nomes de tabela que conseguimos ver ou adivinhar. O Supabase não deixa mais uma chave publicável listar as tabelas de um projeto, então lemos os nomes que cada app menciona no próprio código e acrescentamos umas duas dúzias de nomes comuns, com teto de trinta por app. Um app cujas tabelas se chamem algo que não nos ocorreu parece limpo para nós e pode não ser.

Contamos linhas, nunca as lemos. Cada sondagem perguntou ao banco quantas linhas ele entregaria e parou por aí. Nenhum dado de ninguém foi baixado, e nenhum app é citado neste artigo nem em nada que publicamos.

Quase todos os apps que conseguimos verificar eram apps Lovable. Eles são a maior fatia do que escaneamos e os mais propensos a citar o projeto Supabase na página, então leia isto como uma medição de apps Lovable com Supabase e não de todo builder. Onde a verificação não conseguiu terminar, registramos que não terminou. Um app que não conseguimos verificar é desconhecido, não limpo.

Uma tabela aberta não é automaticamente um buraco

De fora, uma tabela que qualquer um pode ler tem exatamente a mesma cara, esteja nela seu catálogo de produtos ou seus clientes. A resposta é a mesma. Só o nome muda.

Mesmo pedido, mesma resposta, veredictos opostos. Só quem construiu o app sabe qual dos dois casos é a sua tabela aberta.

É por isso que dividimos o achado em dois. Em 394 desses apps, uma das tabelas legíveis tinha um nome de uma lista curta que para nós significa pessoas: users, profiles, customers, orders, messages, invoices. Isso é um estranho lendo seus clientes, e precisa ser resolvido hoje.

As outras 1.702 não conseguimos julgar de fora, e nenhum outro scanner consegue. Uma tabela posts pode ser um blog público ou anotações privadas. Você sabe qual. Ninguém olhando seu app pela internet sabe.

Se preferir não chutar sobre o seu, nosso scan gratuito verifica seu site no ar de fora e diz quais tabelas responderam. Leva uns 20 segundos e não pede conta: escanear seu app.

Por que isso acontece com apps que ninguém abriu de propósito

Porque o conserto que faz um app quebrado voltar a funcionar costuma ser o que abre a tabela.

A sequência é esta. O Row Level Security é ligado, por você ou pelo builder. Seu app para de mostrar dados na hora, porque ligado sem regras significa que o banco recusa todo mundo, você inclusive. Você cola o erro para o seu assistente, ele escreve uma política que permite qualquer pedido, e o app volta a funcionar. Depois disso, nada parece errado.

Essa política é a que encontramos. O painel informa a tabela como protegida, porque a chave está ligada e existe uma política. O artigo sobre por que Row Level Security ligado não é a mesma coisa que protegido percorre os quatro estados possíveis de uma tabela e como reconhecer o seu.

O vazamento sobre o qual te avisaram era o raro

Em todos os 30.998 apps, uma chave secreta do Supabase parada no navegador (a chave que ignora todas as regras que você escreveu) apareceu 3 vezes.

É o vazamento sobre o qual quem tem um app ouve falar o tempo todo e o que menos encontramos. É sério quando acontece, e vale saber reconhecê-lo, mas a preocupação gasta ali vigia uma porta que quase sempre está fechada. A abertura comum nesses apps é uma tabela qualquer sem nenhuma regra.

Como verificar o seu próprio app

Dois lugares para olhar dentro do seu banco de dados Supabase, e um jeito de vê-lo de onde um estranho está.

Abra o Security Advisor no seu painel do Supabase. Ele lista cada tabela com Row Level Security desligado, que é a versão mais clara desse problema. O Supabase sinaliza bem isso, e se o seu projeto estiver nessa lista você já tem a resposta sem ler uma linha de SQL.

Depois leia as políticas de qualquer tabela que guarde pessoas. O Security Advisor não consegue decidir se uma política permissiva é proposital, porque num catálogo de produtos ela estaria correta. Abra a tabela, olhe a política e veja se ela cita uma condição ou se permite todo mundo.

Ou verifique de fora, que é onde o risco mora. Um estranho não abre seu painel. Nosso scan gratuito faz o mesmo pedido anônimo que alguém de fora faria e relata quais tabelas responderam: escanear seu app, sem conta e sem instalar nada.

O que fazer com uma tabela que não deveria ser legível

O que fazer

  • Comece pelas tabelas que guardam pessoas. users, profiles, customers, orders e messages são onde ficam os dados de outra gente, e são as que valem uma noite.
  • 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.
  • 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.
  • 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.
  • 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.

Verificar isso uma vez é uma noite. Manter a resposta verdadeira no mês que vem é a parte que não cabe numa noite, e é para isso que construímos o Reeve Care. Ele repete essa mesma verificação no seu app em uma programação e envia um e-mail quando a resposta piora, porque uma tabela que estava fechada em março e aberta em junho não é algo que alguém note de dentro do próprio app.

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.

Ele também mantém backups próprios do seu banco de dados Supabase, feitos em uma programação, guardados fora da sua conta Supabase e relidos para verificação antes de contarem, com uma restauração que salva o estado atual antes de reproduzir qualquer coisa. Essa segunda metade importa aqui porque nós só verificamos a leitura. A mesma política permissiva pode permitir escrita, e um estranho escrevendo na sua tabela é a versão que a esvazia, e aí uma cópia de antes é a única coisa que devolve as linhas. O Care cobre o seu banco de dados, e os arquivos enviados para o Storage assim que você os conecta, no Supabase e não em todo tipo de banco: o que ele vigia e quanto custa.

Se preferir seguir por uma lista, o checklist de segurança de 10 minutos cobre isto junto com as outras coisas que vale fechar num app recém-lançado. E se uma tabela ficou aberta por um tempo, o que você poderá desfazer depois depende inteiramente de o que você estava salvando.

Perguntas frequentes

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.

É 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.

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.

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.

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.

Escrito por

Vlad Tkachenko

Fundador da Reeve

Passo meus dias olhando apps criados com Lovable, Bolt, v0, Cursor e Replit, e a curta lista de erros que aparecem neles sem parar.

Mais sobre o autor

Leia depois

Não sabe como está o seu próprio app?

Faça um scan gratuito e receba uma nota clara de A a F em cerca de 20 segundos. Sem conta e sem cartão.

Verificar meu app grátis

Verificação externa automatizada, não uma auditoria completa. A ausência de achados não é garantia de segurança.