L'intégration d'un mécanisme de défense contre le scraping automatisé dans les applications Spring Boot peut être réalisée grâce à un composant spécifique. Celui-ci s'appuie sur des filtres Servlet et des règles configurables pour identifier et bloquer les requêtes abusives.
Prérequis techniques
- Application construite sur le framework Spring Boot (compatible avec les versions 1.x et 2.x).
- Service Redis opérationnel pour la gestion des états et le stockage temporaire.
Architecture et flux de traitement
Le système s'implémente via un filtre basé sur la spécification Servlet. Ce filtre est enregistré dans le conteneur Spring à l'aide d'un FilterRegistrationBean. Son fonctionnement interne repose sur une chaîne de responsabilité (Chain of Responsibility) où différentes règles de validation sont appliquées séquentiellement.
Lorsqu'une requête échoue à une validation, elle est interceptée. Le serveur renvoie alors un code de statut HTTP 509 et transmet une page de vérification. La validation réussie par l'utilisateur permet de réinitialiser les compteurs associés aux règles.
Règles de détection intégrées
Contrôle par adresse IP
Cette règle analyse le volume de requêtes issues d'une même adresse IP sur une fenêtre de temps glissante. Si le nombre dépasse un seuil configuré, la requête est rejetée. Les paramètres tels que la durée de la fenêtre, le seuil maximal et une liste d'adresses autorisées sont modifiables.
Inspection du User-Agent
Cette règle extrait des informations à partir de l'en-tête User-Agent de la requête, comme le système d'exploitation, le type d'appareil ou le navigateur. Des filtres granulaires peuvent être appliqués sur ces différentes dimensions.
Mécanisme de validation humainne
À la suite d'un blocage, un challenge de type CAPTCHA est présenté à l'utilisateur. Six variantes de tests sont disponibles, mélangeant trois types de contenu (caractères chinois, lettres/chiffres latins, calcul arithmétique) avec deux formats d'image (statique ou animée GIF). Le contenu est généré aléatoirement pour renforcer la difficulté de reconnaissance automatisée.
Procédure d'intégration
Côté serveur
L'ajout de la dépendance Maven suivante au projet suffit à importer le composant :
<dependency>
<groupId>com.example.security</groupId>
<artifactId>spring-boot-scraping-shield</artifactId>
<version>2.1.0</version>
</dependency>
L'activation se fait via une propriété de configuration :
scraping.shield.enabled=true
Côté client
Il est nécessaire d'intercepter les réponses HTTP dans la couche de communication. Pour une application utilisant Axios, l'intercepteur peut être implémenté comme suit :
import axios from 'axios';
const API_ROOT = process.env.VUE_APP_API_BASE_URL;
axios.interceptors.response.use(
response => response,
err => {
if (err.response && err.response.status === 509) {
const popup = window.open('', '_blank', 'width=560,height=400');
popup.document.write(err.response.data);
popup.document.querySelector('#apiEndpoint').value = API_ROOT;
}
return Promise.reject(err);
}
);
Notes de configuration importantes
Compatibilité avec Apollo
Si le projet utilise Apollo Client comme centre de configuration, l'initialisation automatique doit être explicitement activée. Ajouter cette ligne au fichier bootstrap.properties :
apollo.bootstrap.enabled = true
Configuration Redisson
Le composant tente d'obtenir un client Redisson déjà configuré dans le contexte Spring. En l'absence d'un tel bean, les paramètres de connexion doivent être fournis :
spring.redisson.address=redis://adresse-serveur:6379
spring.redisson.password=cle-securite
Récapitulatif des paramètres
Toutes les options de configuration partagent le préfixe scraping.shield et sont documentées avec auto-complétion dans les fichiers application.properties ou application.yml de Spring Boot.