Veloz Shield · Supabase

O erro de RLS que derruba metade dos projetos Supabase em produção.

Row Level Security ativo na leitura, esquecido na escrita. O Shield ataca esse padrão com sondas não-destrutivas usando um sentinela impossível: descobre a falha sem nunca tocar em uma linha real.

Sonda não-destrutiva: o que o Shield executa

Exatamente esta forma. O sentinela garante que o filtro nunca casa com nenhuma linha: o banco responde o código de política, não o resultado da escrita.

SB-004 · probenão-destrutivo
# Sonda não-destrutiva — nunca toca em linhas reais.
# O filtro exige id='__veloz_audit_nonexistent__', um valor que não existe.
# 204 = RLS aberta (falha). 401 ou 42501 = RLS protegendo (passa).

curl -s -o /dev/null -w '%{http_code}\n' \
  -X PATCH "$SUPABASE_URL/rest/v1/<tabela>?id=eq.__veloz_audit_nonexistent__" \
  -H "apikey: $ANON_KEY" \
  -H "Authorization: Bearer $ANON_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Prefer: return=minimal' \
  -d '{}'

Os 10 checks de Supabase

SB-001Baixo

Introspecção de schema restrita ao service_role

Verifica se o schema do PostgREST não é exposto para a chave anônima.

Ver detalhes →
SB-002Médio

Cadastro por email exige confirmação

Garante que novos cadastros não virem sessões autenticadas sem validar o email.

Ver detalhes →
SB-003Médio

Buckets de Storage não são listáveis publicamente

Verifica se buckets privados bloqueiam o endpoint de listagem anônima.

Ver detalhes →
SB-004Crítico

RLS bloqueia UPDATE/DELETE pela chave anônima

Tenta PATCH/DELETE com filtro impossível. 204 = falha (RLS aberta). 42501 = passa.

Ver detalhes →
SB-005Crítico

RLS bloqueia INSERT pela chave anônima

Sonda de INSERT com payload mínimo para confirmar que a role anon não pode criar linhas em tabelas sensíveis.

Ver detalhes →
SB-006Baixo

JWT anônimo sem validade excessiva

Decodifica o JWT da chave anon e alerta quando `exp - iat > 10 anos`.

Ver detalhes →
SB-007Alto

Sem RPC perigoso exposto para anon

Verifica se funções como `http_get`, `pg_net.*` e `dblink_*` estão fora do schema exposto.

Ver detalhes →
SB-008Médio

CORS em /rest/v1 não é wildcard com credenciais

Confirma que a API não devolve `Access-Control-Allow-Origin: *` combinado com `Allow-Credentials: true`.

Ver detalhes →
SB-009Alto

Role anon não lê auth.users via PostgREST

Garante que a tabela `auth.users` não está exposta no schema público nem acessível por views.

Ver detalhes →
SB-010Informativo

Divulgação de contagem via Content-Range

Sinaliza quando a API devolve a contagem total de linhas mesmo em listagens anônimas.

Ver detalhes →

Rode uma auditoria no seu projeto Supabase.

Cole a URL pública. Em menos de 60 segundos, você tem o relatório.

Começar agora