Une vague de scrapers sur l’offre gratuite de Cloudflare : ce qui l’a arrêtée, et ce que nous avons laissé désactivé

Opérations

Un matin, l’un de nos sites de fiches produits a cessé de s’ouvrir. Cloudflare affichait une erreur 524 aux visiteurs, l’origine mettait deux à six minutes par page, et rien ne nous a alertés pendant environ dix heures. La cause : un scraper passant par des proxys résidentiels à environ 225 requêtes par seconde.

La forme de la vague

Chaque page était rendue pour chaque requête, de sorte que chaque worker mettait en file des centaines de rendus et atteignait sa limite CPU.

Pourquoi les limites par adresse ne pouvaient pas aider

Une limitation de débit compte les requêtes par adresse. Avec une à trois requêtes provenant de chacune des milliers d’adresses, aucune adresse n’approche jamais d’une limite. Bloquer des pays aurait bloqué nos visiteurs. Ce que le scraper ne pouvait pas simuler à moindre coût, c’était de se comporter comme un navigateur ayant déjà visité le site.

À la périphérie de Cloudflare : trois règles gratuites

L’offre gratuite autorise cinq règles WAF personnalisées par zone. Nous en avons utilisé trois, toutes avec un défi géré plutôt qu’un blocage, afin qu’une personne bloquée par erreur puisse cliquer pour passer :

Les trois laissent passer les robots vérifiés de Cloudflare, les user agents qui se déclarent comme robots, nos propres adresses, les chemins API et webhook, ainsi que les fichiers qui ne sont pas des pages. Deux jours plus tard, l'inondation continuait : en une heure, la règle de faux navigateurs a soumis plus de 10 000 requêtes à un défi. Les 10 000 événements renvoyés par Cloudflare par requête provenaient de 9 627 adresses, aucune n'ayant plus de 4.

À l'origine : une porte dans l'application

La partie headless possède des en-têtes de navigateur complets, de sorte que les règles de bordure ne la détectent pas à elles seules lorsque la règle d'urgence est désactivée. Dans l'application elle-même, nous avons placé un petit middleware devant le moteur de rendu de page :

Durant sa première minute, la porte a refusé environ 6 700 faux navigateurs et écarté environ 6 700 inconnus, tout en servant aux inconnus environ 9 pages par seconde. Les requêtes lentes sont tombées à zéro, le CPU des workers est passé de leur limite à 12 à 15 pour cent, et leur mémoire de 4 à 5 Go chacun à 0,65 Go.

Ce que nous avons laissé désactivé

À retenir

Une inondation via des proxys résidentiels se repère facilement à ce qui lui manque : les en-têtes fetch du navigateur, les cookies et les Referers. Soumettez-la à un défi à la bordure, maintenez les inconnus dans les limites de ce que vos workers peuvent rendre, et assurez-vous que quelque chose à l'extérieur du serveur remarque quand une page cesse de s'ouvrir. Night Watch regroupe les trois : la surveillance, les règles avec un basculement automatique pour la règle d'urgence, et la porte pour les applications web Python.

Mis à jour: