Pular para o conteúdo principal
Voltar ao blog
Eduardo Monteiro

Supabase com Next.js, os erros de segurança mais comuns

mosai_blog_reader.sh --post "supabase-nextjs-erros-seguranca"
Supabase com Next.js, os erros de segurança mais comuns

Supabase com Next.js virou o stack favorito de founders que usam IA para construir SaaS. É rápido, barato, escalável e a integração funciona bem.

O problema é que esse stack tem armadilhas específicas de segurança que aparecem com frequência em sistemas construídos dessa forma. Vou listar as que vejo mais.

1. SERVICE_ROLE_KEY no frontend

O Supabase tem duas chaves principais. A anon key é pública, segura para usar no browser, limitada pelo Row Level Security. A service_role_key é a chave de administrador, bypassa todo o RLS, tem acesso irrestrito ao banco.

O erro mais grave que existe nesse stack é a service_role_key chegando ao bundle JavaScript que o browser carrega. Qualquer usuário que inspecionar o código fonte da sua aplicação encontra essa chave e tem controle total do seu banco de dados.

Isso acontece quando a chave é usada em componentes client-side ou quando a separação entre Server Components e Client Components não foi feita corretamente.

A verificação é simples: abra o DevTools, vá em Sources, busque por service_role. Se aparecer, é crítico.

2. RLS desativado ou incompleto

Row Level Security é o mecanismo do Supabase que garante que cada usuário acessa apenas os seus próprios dados. Quando está bem configurado, mesmo que alguém descubra a anon key, não consegue ler dados de outros usuários.

O problema é que RLS precisa ser configurado tabela por tabela, política por política. Em sistemas construídos com IA, é comum ter RLS ativo em algumas tabelas e ausente em outras, especialmente nas criadas depois, quando o desenvolvedor já não está pensando nisso.

3. CORS aberto demais

Access-Control-Allow-Origin: * em uma aplicação autenticada significa que qualquer site na internet pode fazer requisições para sua API e potencialmente ler as respostas. Para uma landing page pública, aceitável. Para uma API que serve dados de usuários autenticados, é um problema.

4. Tokens de sessão acessíveis via JavaScript

Por padrão, o Supabase armazena o token de sessão de forma acessível ao JavaScript no browser. Isso significa que qualquer script injetado na página, via XSS, consegue roubar a sessão do usuário.

A combinação de token acessível via JavaScript com ausência de Content-Security-Policy é especialmente perigosa.

5. Ausência de CSP

Content Security Policy é o header que diz ao browser quais scripts têm permissão de executar na página. Sem ele, um ataque XSS bem-sucedido tem alcance total. Com ele, o dano fica contido.

Em Next.js com App Router, configurar CSP exige atenção, especialmente por causa dos scripts inline que o framework gera. Mas é possível e necessário.

🛡️ O próximo passo: Auditoria Especializada

Saber o que deve ser feito é 10% do caminho. Ter a certeza de que a implementação não criou novos buracos é onde a Mosai Security entra. Faça uma varredura na sua arquitetura antes que seja tarde.