• 7 min de lecture • AI Data Stream Team

La majorité de votre trafic « robots d'IA » n'est pas de l'IA

Nous avons examiné deux jours de journaux Cloudflare pour notre propre site : environ six requêtes sur dix portant un nom de robot d'IA étaient des scanners de vulnérabilités à la recherche de fichiers .env et de clés. Comment les distinguer, deux règles Cloudflare gratuites pour les bloquer, et l'erreur à éviter.

Tout le monde veut savoir si les systèmes d’IA lisent son site. Alors quand nous avons connecté notre propre site marketing à l’intégration Cloudflare et demandé à l’IA quelles pages les robots récupéraient, nous attendions une liste d’articles de blog.

Nous avons obtenu une liste de secrets.

En deux jours, Cloudflare a enregistré un peu plus d’un millier de requêtes vers le site provenant de user agents figurant sur notre liste de robots d’IA connus : GPTBot, ClaudeBot, PerplexityBot, Applebot, Amazonbot, Bytespider et les autres. Environ six de ces requêtes sur dix visaient des chemins comme ceux-ci :

/.env
/.env.production
/.ssh/id_rsa
/.aws/credentials
/firebase-admin.json
/terraform.tfstate
/.docker/config.json
/@fs/proc/self/environ

Rien de cette liste n’existe sur un site marketing statique, et aucun système d’IA n’a la moindre raison de le demander. Ce sont des scanners de vulnérabilités à la chasse aux identifiants exposés, et chacun d’eux se présentait comme GPTBot, ou ClaudeBot, ou Perplexity, ou Apple. La même sonde vers /.env est arrivée sous huit noms de robots différents en 48 heures.

Le véritable trafic d’IA était une petite minorité : ClaudeBot et GPTBot lisant robots.txt et le sitemap, ChatGPT et Perplexity récupérant une poignée d’articles récents parce que quelqu’un venait de poser une question à leur sujet, et Applebot téléchargeant quelques feuilles de style. C’était le chiffre qui nous intéressait, et il était enseveli sous le bruit des scanners.

Pourquoi les scanners se font passer pour des robots

Un user agent n’est qu’une chaîne de caractères envoyée par le client. N’importe qui peut envoyer n’importe quelle valeur, et les scanners ont toujours emprunté des noms respectables : Googlebot pendant des années, et désormais les robots d’IA, pour les deux mêmes raisons.

D’abord, les propriétaires de sites les laissent passer. Un pare-feu qui bloque les robots inconnus mais laisse entrer tout ce qui s’appelle GPTBot est un pare-feu dont le mot de passe est écrit sur la porte. Ensuite, ils se fondent dans la masse. Le trafic des robots d’IA a suffisamment augmenté pour que quelques centaines de requêtes supplémentaires sous un nom de robot paraissent normales dans un journal, alors que les mêmes requêtes venant d’un client Python anonyme sauteraient aux yeux.

Résultat : tout rapport qui compte les « requêtes des robots d’IA » sur la seule base du user agent est gonflé, parfois de plusieurs fois, et ce gonflement tombe précisément sur la question à laquelle vous vouliez répondre.

Comment les distinguer

Trois signaux séparent un vrai robot d’un scanner qui porte son nom. Les trois ne sont pas nécessaires.

La vérification. Les grands opérateurs d’IA publient les plages d’adresses IP utilisées par leurs robots, et Cloudflare confronte chaque requête se réclamant d’un nom de robot connu à ces plages. Une requête qui prétend être GPTBot sans venir des plages d’OpenAI échoue à ce contrôle. Cloudflare expose le résultat sous la forme d’un indicateur de robot vérifié utilisable dans les règles de pare-feu sur toutes les offres, y compris gratuite.

Le code de réponse. Un vrai robot récupère des pages qui existent. Un scanner demande des fichiers qui n’existent pas, donc la quasi-totalité de ses requêtes renvoient un 404. Sur un site statique, la part des scanners dans votre trafic « robots d’IA » est très proche de la part qui a renvoyé une erreur.

Le chemin. Vous savez ce que contient votre site. Des requêtes vers .env, .ssh, .git, .aws, des fichiers de clés et des JSON d’identifiants ne sont pas de la reconnaissance par une IA, quoi qu’en dise le user agent.

Les deuxième et troisième signaux sont aussi ceux que vous pouvez vérifier sans aucun outil : ouvrez les journaux de votre serveur ou de votre CDN, filtrez sur les user agents de robots et regardez les codes de statut et les chemins.

Les bloquer dans Cloudflare avec l’offre gratuite

Si votre site est derrière Cloudflare, deux règles de pare-feu personnalisées règlent la question. Les deux fonctionnent avec l’offre gratuite, qui autorise cinq règles personnalisées. Les deux sont écrites dans la syntaxe de l’offre gratuite : l’opérateur d’expression régulière matches exige une offre Business, elles utilisent donc contains et la fonction ends_with() à la place.

La règle 1 bloque les robots usurpés. Elle se déclenche quand une requête se réclame d’un des grands noms de robots mais échoue à la vérification de Cloudflare.

(http.user_agent contains "GPTBot"
 or http.user_agent contains "ClaudeBot"
 or http.user_agent contains "OAI-SearchBot"
 or http.user_agent contains "PerplexityBot"
 or http.user_agent contains "Amazonbot"
 or http.user_agent contains "Applebot"
 or http.user_agent contains "Bytespider"
 or http.user_agent contains "CCBot"
 or http.user_agent contains "Meta-ExternalAgent"
 or http.user_agent contains "YouBot"
 or http.user_agent contains "cohere-ai")
and not cf.client.bot
and http.host eq "example.com"

Action : Block. Remplacez l’hôte par le nom d’hôte de votre site public.

La règle 2 bloque les sondes d’identifiants, quel que soit l’expéditeur, puisque les scanners arrivent aussi avec des user agents de navigateurs ordinaires.

(lower(http.request.uri.path) contains "/.env")
or (lower(http.request.uri.path) contains "/.ssh/")
or (lower(http.request.uri.path) contains "/.git/")
or (lower(http.request.uri.path) contains "/.aws/")
or (lower(http.request.uri.path) contains "/@fs/")
or (lower(http.request.uri.path) contains "/proc/self/")
or (lower(http.request.uri.path) contains "credentials")
or (lower(http.request.uri.path) contains "service_account")
or (lower(http.request.uri.path) contains "service-account")
or (lower(http.request.uri.path) contains "firebase-admin")
or (lower(http.request.uri.path) contains "terraform.tfstate")
or ends_with(lower(http.request.uri.path), ".pem")
or ends_with(lower(http.request.uri.path), ".key")
or ends_with(lower(http.request.uri.path), ".s3cfg")
or ends_with(lower(http.request.uri.path), ".htpasswd")
or ends_with(lower(http.request.uri.path), ".bashrc")
or ends_with(lower(http.request.uri.path), ".zshrc")

Action : Block. Collez les deux dans la vue « Edit expression » plutôt que dans l’éditeur visuel, qui ne propose pas les fonctions. Si votre site sert légitimement un chemin correspondant à l’une de ces lignes, supprimez cette ligne.

L’erreur que nous avons commise

Notre première version de la règle 1 n’avait pas la condition sur l’hôte, et sa liste contenait Claude-User et ChatGPT-User. En moins d’une heure, chaque client ayant connecté Claude à notre application via notre point de terminaison MCP recevait un 403.

Deux leçons là-dedans. Les user agents d’assistants IA, ceux qui se terminent par -User plus Meta-ExternalFetcher et DuckAssistBot, ne sont pas les robots d’entraînement. Ce sont des récupérations en direct, effectuées parce qu’une personne vient de poser une question à une IA à votre sujet, et certains sont aussi ce que les produits d’IA envoient quand ils appellent une API pour le compte d’un utilisateur. C’est du trafic que vous voulez, et il ne passe pas toujours la vérification. Laissez ces noms hors de la règle 1 et laissez la règle 2 attraper les scanners qui les empruntent.

Et limitez la règle au nom d’hôte de votre site public. Si la même zone Cloudflare sert aussi une application, une API ou un point de terminaison d’intégration, une règle anti-robots écrite pour le site marketing les cassera discrètement.

Vérifier votre propre site

Si vous voulez des chiffres plutôt qu’une impression, connectez Cloudflare à AI Data Stream et demandez dans le chat :

Quelles pages les robots d'IA ont-ils récupérées sur le site ces 7 derniers jours,
et combien de ces requêtes ont échoué ?

Depuis cette semaine, la réponse sépare les deux d’elle-même. Les outils Cloudflare et le widget du tableau de bord comptent les récupérations réussies comme requêtes de robots et rapportent les réponses 4xx et 5xx comme un total distinct de requêtes échouées, avec une note sur ce que sont généralement les requêtes échouées sur un site statique. Pour voir exactement ce que les scanners ont demandé :

Montre-moi les chemins des robots d'IA avec un statut 400 et plus.

Lancez les deux avant et après l’ajout des règles : la seconde liste devrait se taire, tandis que la première montrera enfin ce que les systèmes d’IA lisent réellement.

Les petits caractères

  • L’identification des robots se fait toujours par user agent, sauf si vous payez le Bot Management de Cloudflare. Le Bot Fight Mode, l’option gratuite, est un produit différent : il soumet les robots à un défi mais ne les étiquette pas dans vos analyses. L’indicateur de robot vérifié est la seule pièce du Bot Management accessible à tous, et c’est pourquoi la règle 1 peut s’appuyer dessus.
  • Les requêtes bloquées sont toujours journalisées, avec un 403, donc un outil qui compte les requêtes brutes par user agent continuera de les compter. C’est le comptage des récupérations réussies qui rend le chiffre honnête.
  • Tous les opérateurs d’IA ne peuvent pas être vérifiés. Cloudflare ne vérifie que les robots dont les opérateurs publient leurs plages IP et se comportent correctement, et il en a retiré certains de la liste. Consultez la liste actuelle des robots vérifiés dans votre tableau de bord avant d’ajouter un nom à la règle 1.

Cloudflare est disponible sur les plans Pro et Business. Ajoutez-le depuis la page Connexions de votre propriété, ou consultez la documentation de la connexion.

Articles associes