Pular para o conteúdo
Salak Security
Sites e aplicações webCódigo, build publicado, cabeçalhos e sessãoApps Lovable, Bolt e CursorBanco exposto, chaves no navegador, permissões só na tela
01 → Diagnóstico Express
R$ 12.500

Sua aplicação foi feita em Lovable ou Bolt? Em até 5 dias úteis você recebe as falhas críticas com prova e o caminho da correção.

Ver a oferta →
Bancos de dadosAcesso, privilégios, criptografia e backupsAPIs e integraçõesAutorização por objeto, limites e contratosPlataformas corporativasEscopo sob medida, vários times e ambientesPipeline e nuvemCI/CD, containers e infraestrutura como códigoVer todas as soluções →
OfertasMétodoGuiasPara quemSobre
Falar com especialistaVer relatório de exemplo
Ver relatórioFalar com especialista
  1. Início
  2. Guias
  3. RLS no Supabase
Guia · 9 min de leitura

RLS no Supabase: o que é e como configurar sem vazar dados

Row Level Security é a única coisa entre a chave pública do seu app e os dados de todos os usuários. Como ligar, como escrever políticas, os erros mais comuns e como testar de verdade.

Por Equipe Salak Security · Atualizado em 31 de outubro de 2026

Neste guia
  1. O que é Row Level Security
  2. Como ligar
  3. Como escrever as políticas
  4. Os erros mais comuns
  5. Como testar de verdade
  6. Checklist de RLS
SoluçãoBancos de dadosVer →

O que é Row Level Security

Row Level Security (RLS) é um recurso do PostgreSQL que aplica um filtro automático a cada consulta: antes de devolver ou alterar uma linha, o banco confere se ela passa na política da tabela. É como se cada select ganhasse um where que o usuário não consegue tirar.

No Supabase, o RLS não é opcional na prática. O app envia para o navegador a URL do projeto e a chave pública (chamada anon ou publishable), e com elas qualquer pessoa consegue chamar a API do banco diretamente. Sem RLS, essa chamada devolve a tabela inteira.

Como ligar

Tabelas criadas pelo editor visual do painel costumam vir com RLS ligado. Tabelas criadas por SQL, por migração ou por ferramentas de IA podem não vir. Ligue em toda tabela do schema public:

alter table public.pedidos enable row level security;
RLS ligado e nenhuma política significa que ninguém passa (exceto a chave service_role). É o estado seguro: a partir dele, você abre só o necessário.

Como escrever as políticas

Cada política vale para uma operação (select, insert, update, delete) e um papel (anon para visitantes, authenticated para logados). A cláusula using filtra as linhas que podem ser lidas ou alteradas; with check valida as linhas que estão sendo gravadas.

O caso mais comum: cada usuário vê e altera só os próprios registros.

-- Ler só os próprios pedidos
create policy "pedidos: ler os próprios"
on public.pedidos for select
to authenticated
using ((select auth.uid()) = user_id);

-- Criar pedidos só em nome próprio
create policy "pedidos: criar os próprios"
on public.pedidos for insert
to authenticated
with check ((select auth.uid()) = user_id);

-- Alterar só os próprios, sem poder passar o pedido para outra pessoa
create policy "pedidos: alterar os próprios"
on public.pedidos for update
to authenticated
using ((select auth.uid()) = user_id)
with check ((select auth.uid()) = user_id);

Envolver auth.uid() em (select …) faz o banco calcular o valor uma vez por consulta, não uma vez por linha, o que importa em tabelas grandes.

Os erros mais comuns

  • using (true) para "fazer funcionar". É o mesmo que não ter RLS. Aparece muito em código gerado por IA depois de um erro de permissão.
  • Update sem with check. O usuário altera o próprio registro e troca o user_id para o de outra pessoa.
  • Confiar em user_metadata. O usuário consegue alterar os próprios metadados. Papel de administrador nunca vem dali: use uma tabela de papéis protegida ou app_metadata, que só o servidor altera.
  • Views que ignoram as políticas. Por padrão, uma view roda com as permissões de quem a criou. No PostgreSQL 15 ou superior, crie com with (security_invoker = true).
  • Funções security definer chamáveis pela API, que rodam com privilégio total e precisam conferir o usuário por conta própria.
  • Storage esquecido. Arquivos ficam em storage.objects, que tem as próprias políticas. Bucket público é público para todos.
  • Chave service_role no front-end. Ela ignora o RLS inteiro. Veja chave exposta no frontend.

Como testar de verdade

Política escrita não é política testada. O teste que vale é o que um atacante faria: chamar a API direto, sem a tela.

1. Sem login, com a chave pública. Toda tabela que não é pública deve voltar vazia.

curl "https://SEU-PROJETO.supabase.co/rest/v1/pedidos?select=*" \
  -H "apikey: SUA_CHAVE_PUBLICA"

2. Logado como o usuário A, lendo dados do usuário B. Faça login com dois usuários de teste, copie o token de acesso do A (na aba Network, cabeçalho Authorization) e peça um registro do B pelo ID.

curl "https://SEU-PROJETO.supabase.co/rest/v1/pedidos?id=eq.ID_DO_PEDIDO_DE_B" \
  -H "apikey: SUA_CHAVE_PUBLICA" \
  -H "Authorization: Bearer TOKEN_DO_USUARIO_A"

3. Escrita. Repita com POST e PATCH, tentando gravar um registro com o user_id de outra pessoa. A resposta certa é erro.

4. Automatize. Transforme esses testes em testes do seu repositório, para que uma migração futura que desligue o RLS quebre o build em vez de ir para produção. O Security Advisor do painel do Supabase também aponta tabelas sem RLS e deve ser revisado a cada mudança de schema.

Checklist de RLS

  1. RLS ligado em toda tabela do schema public.
  2. Nenhuma política using (true) em tabela com dado pessoal.
  3. Toda política de update e insert com with check.
  4. Papel de administrador fora de user_metadata.
  5. Views com security_invoker e funções security definer revisadas.
  6. Políticas do Storage revisadas e buckets privados por padrão.
  7. Testes sem login e com dois usuários, no repositório.
Auditoria Completa · R$ 22.300Quer saber se o seu sistema tem essas falhas?

A Salak testa o seu sistema com usuários de cada perfil e entrega cada falha com prova, correção recomendada e teste de regressão. Veja como funciona para bancos de dados.

Falar com especialistaVer a oferta
Leia também
Guia · 7 minO Lovable é seguro?A plataforma é; seu app pode não ser. As 3 falhas que mais aparecem e como checar cada uma.Ler o guia →Guia · 7 minChave de API exposta no frontendQual chave pode ser pública, qual nunca pode, como achar no bundle e por que revogar.Ler o guia →
Salak Security

Auditoria de segurança com prova, correção e verificação independente.

Soluções

Apps Lovable, Bolt e CursorSites e aplicações webAPIs e integraçõesBancos de dadosPlataformas corporativasPipeline e nuvemTodas as soluções

Método

MétodoRelatório de exemploOfertas e preçosGuiasPerguntas

Empresa

SobreParceirosTrabalhe conoscoContato

Legal

Política de privacidadeTermos de usoPolítica de cookies
Salak Security
© 2026 Salak Security. Todos os direitos reservados.Divulgação responsável de vulnerabilidades