Retour au blog
mai 2018·4 min de lectureTraduit par IA
Langue:DeutschEnglishFrançaisÖsterreichischKlingonian Version originale: Deutsch

Méthodes de protection contre le SPAM n° 3 : encore une fois, tout est une question de timing

#php

Pour la navigation entre pages aussi, on peut assez bien exploiter la différence de vitesse entre un bot et un utilisateur réel. Alors qu'un utilisateur reste normalement quelques secondes sur la page, le temps d'absorber et de traiter toutes les informations (et peut-être même de remplir un formulaire), un bot fait tout cela en une fraction de seconde. Nous pouvons exploiter cela de plusieurs façons.

1. Quand est-ce un bot, quand est-ce un humain

En principe, il est judicieux de travailler avec des durées moyennes. Une page d'erreur 404 n'est probablement regardée que 3 secondes au maximum, alors qu'un long texte (comme des actualités d'entreprise, la page « À propos » ou même les mentions légales) est probablement lu bien plus longtemps. Si une navigation intervient plusieurs fois en moins de 3 secondes, on peut supposer que quelque chose ne va pas ! Nous pouvons aussi mesurer le temps que l'utilisateur passe sur la page. Si la navigation intervient toujours à peu près après le même temps (même supérieur à 3 secondes), quelle que soit la longueur du document, quelque chose cloche probablement aussi. Qui navigue toujours après le même temps, indépendamment du contenu de la page ? Les développeurs de haut niveau envisageraient aussi de mesurer individuellement, pour chaque page, la durée de visite de tous les utilisateurs et d'en faire une moyenne. Tout utilisateur qui s'en écarte de plus de X % peut être considéré comme un bot. Mais attention : si quelqu'un se trompe de clic et quitte aussitôt la page, ou constate sur la page que le contenu ne correspond finalement pas à ce qu'il attendait, il navigue peut-être plus vite que la moyenne et sera donc pris à tort pour un bot. Il faudrait éventuellement pousser un peu plus loin la réflexion :-)

2. PHP : variante numéro uno

<?php
session_start();
if (time() - $_SESSION['last_navigation'] < 5) if (!isset($_SESSION['quicknavigation']) ? $_SESSION['quicknavigation'] = 1 : $_SESSION['quicknavigation']++);
if (time() - $_SESSION['last_navigation'] > 10) $_SESSION['quicknavigation'] = 0;
if (isset($_SESSION['quicknavigation']) && $_SESSION['quicknavigation'] == 8) die("Du bist höchstwahrscheinlich ein Bot!");
$_SESSION['last_navigation'] = time();
?>

Que se passe-t-il ici ? Le script ci-dessus est appelé sur chaque page. Si la différence entre l'horodatage Unix actuel et celui du dernier chargement de page est inférieure à 5 secondes (l'utilisateur a donc navigué vers la page suivante en moins de 5 secondes), la valeur de la variable de session « quicknavigation » (il s'agit bien d'une… alors ? Quick Navigation !) est augmentée de un (ou, sinon, fixée à 1 si elle n'était pas définie). Si elle dépasse 5 secondes mais reste inférieure à 10, il ne se passe d'abord rien : dans cet intervalle, je considère qu'il peut s'agir aussi bien d'un bot que d'un humain (le bot calcule peut-être quelque chose, a besoin de temps pour enregistrer l'adresse e-mail trouvée, ou autre…). Mais si la navigation suivante n'a lieu qu'après 10 secondes ou plus, nous remettons la valeur de « quicknavigation » à 0, car nous pouvons supposer que, même si l'on a navigué rapidement plusieurs fois et que quicknavigation a une valeur plus élevée, aucun bot ne met 10 secondes à analyser une page. Il s'agit donc sans doute d'un humain malgré la navigation rapide précédente, et nous remettons la valeur à 0 (je sais, les bots peuvent aussi avoir des délais d'attente pour contourner précisément ce genre de mesures de sécurité. Mais d'après mon expérience, les bots cherchent surtout à obtenir vite des informations ou à trouver vite la fonction de commentaire pour diffuser du spam, selon le principe « la quantité plutôt que la qualité ». J'ai donc opté pour une réinitialisation complète des données après 10 secondes). Si l'utilisateur/bot a navigué 8 fois de suite en moins de 5 secondes, nous affichons le message de bot (et demandons éventuellement un captcha ?).

3. PHP : variante numéro due

<?php
session_start();
if ($_SESSION['block'] === true) die('BOT');
if (count($_SESSION['navigation']) == 5) array_shift($_SESSION['navigation']);
if ($_SERVER['SCRIPT_FILENAME'] != $_SESSION['last_called_script']){
  $_SESSION['navigation'][] = time();
  $diff[] = $_SESSION['navigation'][1] - $_SESSION['navigation'][0];
  $diff[] = $_SESSION['navigation'][2] - $_SESSION['navigation'][1];
  $diff[] = $_SESSION['navigation'][3] - $_SESSION['navigation'][2];
  $diff[] = $_SESSION['navigation'][4] - $_SESSION['navigation'][3];
  $diff[] = $_SESSION['navigation'][5] - $_SESSION['navigation'][4];
  if (abs($diff[0] - $diff[1]) < 5 && abs($diff[1] - $diff[2]) < 5 && abs($diff[2] - $diff[3]) < 5 && abs($diff[3] - $diff[4]) < 5 && abs($diff[4] - $diff[5]) < 5) $_SESSION['block'] = true;
}
?>

Oh, qu'est-ce que… que se passe-t-il ici ? Nous mesurons la durée moyenne des dernières navigations. Si la page a changé 5 fois en moins de 5 secondes, nous mettons la variable de session 'block' à « true » et bloquons l'utilisateur sur toutes les pages suivantes. Ici aussi, il serait approprié de commencer éventuellement par un captcha plutôt que d'exclure directement l'utilisateur.

4. Conclusion

Face à de telles mesures, il faut toujours garder à l'esprit que nous pouvons certes détecter des bots potentiels, mais que les faux positifs ne peuvent bien sûr jamais être exclus. C'est pourquoi on ne devrait en principe jamais exclure complètement un utilisateur du site simplement parce qu'il se comporte comme un bot du point de vue du rythme de navigation. En revanche, nous pouvons, à partir du rythme de navigation, émettre un premier soupçon et prendre des mesures adaptées, comme une demande de captcha, pour protéger efficacement notre site des bots. Vous avez d'autres idées ou suggestions sur cette méthode ? Écrivez-les dans les commentaires, qui sont publiés après vérification de ma part.

Plus récentMéthodes de protection contre le SPAM n° 2 : tout est une question de timingPlus ancienTraiter une requête HTTP Range avec PHP