Uma enxurrada de scrapers no plano gratuito da Cloudflare: o que a parou e o que deixamos desativado

Operações

Uma manhã, um dos nossos sites de listagens parou de abrir. A Cloudflare exibia aos visitantes um erro 524, a origem levava de dois a seis minutos por página e nada nos avisou por cerca de dez horas. A causa era um scraper passando por proxies residenciais a cerca de 225 requisições por segundo.

O formato da enxurrada

Cada página era renderizada para cada requisição, então cada worker enfileirava centenas de renderizações e atingia seu limite de CPU.

Por que limites por endereço não ajudavam

Um rate limit conta requisições por endereço. Com uma a três requisições de cada um dos milhares de endereços, nenhum endereço isolado chega perto de um limite. Bloquear países teria bloqueado nossos visitantes. O que o scraper não podia fingir barato era se comportar como um navegador que já tinha visitado o site.

Na borda da Cloudflare: três regras gratuitas

O plano gratuito permite cinco regras personalizadas de WAF por zona. Usamos três, todas com um desafio gerenciado em vez de um bloqueio, para que uma pessoa pega por engano clique para passar:

Todos os três permitem a passagem dos bots verificados da Cloudflare, dos user agents que se identificam como robôs, dos nossos próprios endereços, dos caminhos da API e dos webhooks, e dos arquivos que não são páginas. Dois dias depois, a inundação continuava: em uma hora, a regra de navegador falso desafiou mais de 10.000 requisições. Os 10.000 eventos que a Cloudflare retorna por consulta vieram de 9.627 endereços, nenhum com mais de 4.

Na origem: um portão no aplicativo

A metade headless tem cabeçalhos de navegador completos, então as regras de borda sozinhas não a capturam enquanto a regra de emergência está desativada. No próprio aplicativo, colocamos um pequeno middleware na frente do renderizador de páginas:

No primeiro minuto, o portão recusou cerca de 6.700 navegadores falsos e afastou cerca de 6.700 estranhos, enquanto servia aos estranhos cerca de 9 páginas por segundo. As requisições lentas caíram para zero, a CPU dos workers caiu do limite para 12 a 15 por cento, e a memória de 4 a 5 GB cada para 0,65 GB.

O que deixamos desativado

A conclusão

Uma inundação por meio de proxies residenciais é fácil de identificar pelo que falta: cabeçalhos de requisição do navegador, cookies e Referers. Enfrente isso na borda, mantenha os estranhos dentro do que seus workers conseguem renderizar e garanta que algo fora do servidor perceba quando uma página parar de abrir. O Night Watch reúne os três: o watchdog, as regras com uma troca automática para a de emergência e o guarda para apps web em Python. As três regras e o guarda também são gratuitos e de código aberto no GitHub: cloudflare-free-shield e bot-gate.

Atualizado: