Por que todo projeto Lovable precisa de teste de segurança
Construir com IA é incrivelmente rápido, mas seus projetos Lovable estão seguros? Este é tudo que você precisa saber para proteger suas aplicações geradas por IA.
O risco escondido no desenvolvimento com IA
O Lovable permite construir aplicações inteiras em pouco tempo, mas nessa velocidade a segurança costuma ficar para trás. Ferramentas de segurança tradicionais não foram feitas para código gerado por IA e deixam passar os padrões que surgem quando uma IA escreve boa parte da aplicação. Por isso existe o Scanner de Segurança Lovable.
O que torna projetos Lovable diferentes?
Assistentes de código com IA como o Lovable introduzem riscos que scanners tradicionais não capturam:
- Vulnerabilidades por padrão: a IA às vezes gera padrões de código que funcionam perfeitamente mas contêm falhas sutis de segurança
- Pontos cegos em integrações: quando a IA conecta serviços e APIs diferentes, brechas de segurança podem surgir entre componentes
- Riscos de iteração rápida: a velocidade do desenvolvimento com IA pode fazer a dívida de segurança crescer mais rápido do que uma revisão manual consegue pegar
Problemas reais que encontramos em projetos Lovable
Padrões comuns em apps Lovable:
CONTORNOS DE AUTENTICAÇÃO
Fluxos de autenticação incompletos que permitem acesso não autorizado a rotas protegidas.
EXPOSIÇÃO DE CHAVES DE API
Credenciais sensíveis acidentalmente expostas no código client-side ou em repositórios públicos.
VAZAMENTO DE DADOS
Dados de usuário ou informações internas expostas sem querer através de respostas de API.
FALHAS DE VALIDAÇÃO
Validação ausente permite que entradas maliciosas cheguem ao backend.
Os 6 fluxos de vibe coding que mais quebram
“Vibe coding” (entregar um app funcionando conversando com uma IA, sem ler metade do código gerado) tende a quebrar nos mesmos seis fluxos:
01 / SIGNUP + SESSÃO
Anon key usada em chamadas de usuário logado. JWT guardado no localStorage sem refresh. Reset de senha que envia e-mail para endereços controlados pelo atacante porque o endpoint de update confia no client.
02 / UPLOAD DE ARQUIVO
Bucket do Supabase Storage marcado como público. Sem validação de MIME. Sem prefixo de caminho por usuário. Resultado: qualquer usuário faz upload na pasta de qualquer outro, ou sobe conteúdo executável num bucket de "images".
03 / GATE DE FEATURE PAGA
Check do plano no Stripe vive só no componente React. O endpoint real `/api/generate` ou a leitura da tabela não tem cláusula `WHERE plan = 'pro'`. Todo usuário free bate direto em todo endpoint pago.
04 / DASHBOARD ADMIN
Rota guardada por `if (user.email === 'me@x.com') showAdmin()`. A tabela `admin_audit_logs` não tem RLS. Qualquer um que adivinhe a rota ou chame o endpoint REST vira admin.
05 / EDGE FUNCTIONS
Service-role key hardcoded numa função chamável do navegador. Ou a função confia num parâmetro `user_id` em vez de extrair do JWT. Elevação total de privilégio em uma requisição.
06 / UPDATE DE PERFIL
Política de UPDATE usa `USING (auth.uid() = user_id)` mas não tem `WITH CHECK`. Usuários podem mudar o próprio `role` para `admin`, o `plan` para `enterprise` ou o `user_id` para o de outro. Teste: tente `PATCH /profiles?id=eq.me { role: "admin" }`.
Em todos eles a UI parece correta e o app funciona, mas o endpoint por trás tem um achado crítico. O scanner percorre os seis automaticamente. Para entender por que esses padrões aparecem em código gerado por IA, veja Vibe Coding Security Checks e o baseline RLS do caso da beauty blogger.
Más configurações de RLS: a vulnerabilidade #1
Nos 1.430+ apps Lovable escaneados, a vulnerabilidade mais frequente são políticas de Row Level Security (RLS) ausentes ou mal configuradas.
O Lovable usa Supabase como banco de dados. O Supabase expõe um endpoint público de API que qualquer um pode chamar diretamente. Sem políticas de RLS, nada impede um atacante de ler cada linha do seu banco, modificar dados de outros usuários ou deletar registros completamente.
- Defaults do Supabase: tabelas novas são criadas com RLS desabilitado por padrão. A IA do Lovable nem sempre ativa.
- Gap de complexidade: escrever políticas de RLS corretas exige entender políticas do PostgreSQL, e código gerado por IA frequentemente erra.
- Falha silenciosa: tudo funciona perfeitamente sem RLS durante o desenvolvimento. A vulnerabilidade só importa quando usuários reais estão na plataforma.
- Várias tabelas: cada tabela nova precisa das próprias políticas de RLS. À medida que projetos crescem, tabelas são esquecidas.
As quatro checagens de RLS que toda tabela precisa
RLS exige uma política por operação, por tabela. Nosso scanner roda as quatro checagens em cada tabela pública que descobre:
| Operação | O que o scanner envia | O que passa | O que falha |
|---|---|---|---|
| SELECT | anon GET /rest/v1/<table>?select=* |
401 ou linhas com escopo |
Dump completo da tabela |
| INSERT | anon POST /rest/v1/<table> com linha de probe |
401 ou rejeição por política |
Linha escrita |
| UPDATE | anon PATCH /rest/v1/<table>?id=eq.<row> |
401 ou zero linhas afetadas |
Linha modificada |
| DELETE | anon DELETE /rest/v1/<table>?id=eq.<row> |
401 ou zero linhas afetadas |
Linha deletada |
Erro comum: testar só SELECT, ver que está trancado e subir, deixando as escritas abertas.
Políticas quebradas que parecem corretas
Estas políticas de RLS compilam e o app funciona, mas a tabela continua exposta:
-- RUIM: sem WITH CHECK o usuário pode INSERT linhas de qualquer um
CREATE POLICY "insert own" ON posts
FOR INSERT USING (auth.uid() = user_id);
-- RUIM: UPDATE só com USING; usuário atualiza a própria linha
-- e muda o user_id para o de outra pessoa ao mesmo tempo
CREATE POLICY "update own" ON posts
FOR UPDATE USING (auth.uid() = user_id);
-- RUIM: lê as próprias + marcadas como públicas, sem filtro
-- de coluna: campos sensíveis em linhas "públicas" vazam
CREATE POLICY "read public or own" ON posts
FOR SELECT USING (is_public OR auth.uid() = user_id);
-- RUIM: a clássica correção "só pra funcionar"
CREATE POLICY "allow all" ON posts FOR ALL USING (true);
As versões corrigidas:
-- BOM: INSERT com WITH CHECK prende a nova linha ao chamador
CREATE POLICY "insert own" ON posts
FOR INSERT WITH CHECK (auth.uid() = user_id);
-- BOM: UPDATE exige que a linha atual pertença ao chamador
-- E que a nova versão também (impede transferência de dono)
CREATE POLICY "update own" ON posts
FOR UPDATE USING (auth.uid() = user_id)
WITH CHECK (auth.uid() = user_id);
-- BOM: DELETE com escopo de dono
CREATE POLICY "delete own" ON posts
FOR DELETE USING (auth.uid() = user_id);
-- BOM: SELECT explícito, sem ambiguidade
CREATE POLICY "read own" ON posts
FOR SELECT USING (auth.uid() = user_id);
Para colunas com PII (e-mail, telefone, stripe_customer_id), prefira uma view com colunas restritas em vez de grants em nível de coluna, que é mais fácil de auditar.
Teste seu RLS
Para uma primeira passada, abra seu app Lovable em produção, pegue a URL do Supabase e a anon key na aba Network e rode:
# Substitua pelo seu projeto + anon key + tabela
SUPA="https://<project>.supabase.co"
KEY="<anon_key>"
TABLE="profiles"
# Probe de leitura: deve vir vazio ou 401 deslogado
curl "$SUPA/rest/v1/$TABLE?select=*&limit=5" \
-H "apikey: $KEY" -H "Authorization: Bearer $KEY"
# Probe de escrita: deve ser 401 ou rejeição por política
curl -X POST "$SUPA/rest/v1/$TABLE" \
-H "apikey: $KEY" -H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"id":"rls-probe-delete-me"}'
Se vierem linhas ou a escrita passar, você tem um crítico. Rode o Supabase RLS Checker gratuito para o relatório completo por tabela, ou cole a URL no scanner no topo desta página para a auditoria Lovable completa (auth, storage, edge functions e chaves, além de RLS).
Quando RLS não basta
RLS barra a anon key. Não barra:
- Edge Functions usando a service-role key: ignoram o RLS por completo. Qualquer erro lógico na função dá leitura e escrita completas no banco.
- JWTs vazados: se o JWT de um usuário logado vaza (XSS, um gist público, uma captura de tela), o RLS entrega ao atacante o que aquele usuário veria.
- Storage: tem regras parecidas com RLS por bucket e por objeto, configuradas separadamente. Em apps Lovable, o bucket costuma ficar público.
- Views e funções de banco: uma função
SECURITY DEFINERroda com privilégios do criador, não do chamador. Se recebe um ID fornecido pelo usuário e confia, o RLS vira irrelevante.
Nosso scanner testa as quatro. Para entender o modelo de política subjacente, veja o guia de RLS do Supabase e o checklist de segurança do Supabase.
Como o Scanner de Segurança Lovable funciona
Ao escanear seu projeto:
- Descoberta automática: rastreamos sua aplicação para entender estrutura, rotas e funcionalidade
- Testes com IA: 13 agentes de IA especializados testam cenários de ataque específicos para aplicações web
- Detecção de vulnerabilidades: identificamos problemas de segurança, de más configurações básicas a contornos complexos de autenticação
- Relatórios acionáveis: explicações claras dos problemas encontrados e passos específicos para corrigir
Além do scan: cobertura de segurança completa
Além de encontrar vulnerabilidades, o scanner inclui:
- Verificação de RLS do Supabase: teste ponta a ponta das suas políticas de Row Level Security
- Monitoramento diário: scan contínuo para pegar problemas novos conforme seu app evolui
O que os desenvolvedores estão encontrando
Ranking dos problemas mais comuns entre as 5.711 vulnerabilidades encontradas em 1.430+ apps escaneados:
- RLS ausente em SELECT - Crítico. Presente em 85% dos scans.
- RLS ausente em INSERT/UPDATE/DELETE - Crítico. Presente em 51% dos scans. Normalmente sobe junto com uma política de SELECT funcional, por isso passa despercebido.
- Chaves de API expostas - Crítico. Presente em 62% dos scans. OpenAI, Anthropic, Stripe e Resend são as quatro mais vazadas.
- Contornos de autenticação - Alto. Presente em 45% dos scans. Normalmente um route guard só no frontend.
- Validação de entrada ausente - Alto. Presente em 38% dos scans.
- Bucket de Storage público - Alto. Presente em 34% dos apps Lovable que usam Storage.
- Gates de feature paga só no frontend - Alto. Presente em 27% dos apps monetizados.
- Service-role key no código client - Crítico. Raro (~4%), mas sempre é tomada total.
Começar é simples
Cole a URL do seu app em produção acima para receber um relatório de segurança com recomendações de correção. Há um teste gratuito de 14 dias.
TESTE SEU PROJETO LOVABLE AGORA
Digite a URL do seu app Lovable em produção para checar vulnerabilidades.
Common questions
O Lovable é seguro de usar?
Quais problemas de segurança são comuns em apps Lovable?
Como escanear meu app Lovable em busca de vulnerabilidades?
Qual é a vulnerabilidade mais comum em apps Lovable?
Quantos apps Lovable já foram escaneados em termos de segurança?
Como verifico se meu RLS no Supabase está funcionando?
RLS habilitado significa que minha tabela está segura?
Quais são os fluxos de vibe coding que mais quebram?
O Lovable consegue corrigir essas vulnerabilidades se eu pedir?
Funciona para apps Lovable que não usam Supabase?
É seguro rodar esse scan contra meu app Lovable em produção?
Stop guessing. scan your app.
Join founders who ship secure instead of shipping exposed. Paste your live URL - keys, RLS, auth, and API gaps in under 60 seconds.
14-day free trial · No credit card · Cancel anytime
See VibeEval more often in Google Top Stories.