Faro CheckAnálise grátis

Como saber se o banco do meu app no Supabase está aberto (RLS checker)

19 de outubro de 2026 · 4 min de leitura

Para saber se o banco no Supabase está aberto, olhe o Security Advisor: ele lista tabela em public sem RLS. A chave anon é pública de propósito e só é segura com RLS ligado e política que não devolve toda linha. Teste só o seu projeto com a chave anon; o Faro Check vê a chave e não lê tabelas.

A chave anon (e a publishable nova, sb_publishable_...) foi feita para ir no navegador. Ela só é segura com o RLS ligado e com política que não entrega toda linha. A service_role e a secret sb_secret_... ignoram o RLS e ficam só no servidor. A documentação de chaves descreve isso em API keys. As chaves anon e service_role estão marcadas para sair de cena até o fim de 2026; a publishable ocupa o lugar da anon.

Passo a passo

  1. Abra o Security Advisor. No painel, vá em Database e abra o Security Advisor. O lint 0013_rls_disabled_in_public é um erro: tabela no schema public sem RLS. A documentação chama isso de tabela publicamente acessível, porque quem tem a URL do projeto consegue ler e gravar. O lint 0007 avisa o outro caso: a política existe, mas o RLS está desligado, então a política não vale. Fonte: Database Advisors.

  2. Ligue o RLS na tabela citada. O comando que a doc mostra é alter table public.sua_tabela enable row level security. Com o RLS ligado e sem política, a chave do navegador deixa de ler e gravar pela API. Tabela criada no Dashboard já nasce com RLS. Tabela criada no SQL Editor precisa do comando. A página para ligar é Database, Policies: Securing your API.

  3. Teste só o seu projeto, só lendo. Use a URL e a chave anon (ou a publishable) do projeto que é seu. Não use a service_role. Troque o nome da tabela.

curl "https://SEU_PROJETO.supabase.co/rest/v1/SUA_TABELA?select=*&limit=1" \
  -H "apikey: SUA_CHAVE" \
  -H "Authorization: Bearer SUA_CHAVE"

A doc de rotas mostra os dois headers: Creating routes. A doc de chaves diz que publishable e secret novas não são JWT: vão no header apikey. Mandar essas chaves em Authorization: Bearer devolve Invalid JWT. A anon antiga é JWT, então o teste clássico manda os dois. Se a sua começa com sb_publishable_, mande só o apikey.

  1. Leia o que voltou. JSON com linhas: a chave leu dado. Lista vazia ([]): a tabela não tem linha, ou a política não devolveu nenhuma. Uma lista vazia sozinha não prova que está fechado. Erro de permissão, inclusive o código 42501 por grant ausente: a role não tem permissão na tabela. A doc de RLS diz que o grant é checado antes da política, e que política que não casa com nenhuma linha devolve resultado vazio: Row Level Security.

  2. Trate using (true) como tabela aberta. Uma política de SELECT para anon com using (true) casa com toda linha. O efeito, para a chave do navegador, é o mesmo de banco aberto. A mesma doc explica que a política é quem escolhe as linhas. Não coloque service_role no front.

  3. Não peça para o scan ler a tabela. O Faro Check acha a chave anon e a URL do projeto no JavaScript e avisa para conferir o RLS. Ele não executa esse curl e não lê linhas. O insert que quebra está em new row violates row level security policy. Chave no arquivo público: como saber se a chave vazou. O restante, antes de divulgar: checklist antes de subir.

Prompt para colar

Copie e cole este prompt na ferramenta que você usa para criar o app

Não desligue o RLS e não use a service_role no browser. Em cada tabela do schema public com dado de pessoa, rode enable row level security. Políticas de SELECT, INSERT e UPDATE para authenticated devem usar auth.uid() na coluna do dono. Não crie política using (true) para anon em dado de usuário. Mostre o SQL antes de aplicar e não mexa em outras tabelas.

Escanear grátis

Perguntas frequentes

O que é um supabase rls checker?

É a conferência de RLS desativado e de tabela sem política certa. No painel, o Security Advisor lista o lint 0013_rls_disabled_in_public. No seu projeto, um GET só de leitura com a chave anon mostra se essa chave recebe linha.

RLS desativado no Supabase deixa a tabela aberta?

Se a tabela está no schema exposto, sem RLS, e a role anon tem grant, quem tem a URL e a chave lê e grava. Ligar o RLS sem política fecha o acesso pela API até você criar a política. Fonte: Row Level Security.

Lista vazia significa que o banco está fechado?

Não por si só. [] também aparece quando a tabela não tem linha. O Advisor é a confirmação no painel. Linhas no JSON significam que a chave leu dado.

Posso testar o projeto de outra pessoa?

Não. O curl acima é só no projeto seu, com a sua chave, e só leitura. O scan grátis do Faro Check também não lê tabela de ninguém: ele só vê a chave e a URL que o JavaScript já entrega.