Aller au contenu

ALTCHA

WP-ImmoMakler prend en charge la protection anti-spam respectueuse de la vie privée ALTCHA. Elle est chargée entièrement depuis votre propre serveur WordPress, sans connexion à des tiers ni cookies.

ALTCHA soumet au navigateur de votre visiteur un calcul automatisé à effectuer (une preuve de travail, ou proof of work). Le navigateur le résout en arrière-plan dès que la page est chargée, pendant que votre visiteur remplit le formulaire. Seul un petit champ confirmant la réussite de la vérification est visible :

Le champ ALTCHA dans le formulaire de contact avec la confirmation de vérification

Vos visiteurs n’ont donc aucun puzzle à résoudre et rien à cliquer. Pour un robot spammeur qui envoie des formulaires en masse, l’effort de calcul se cumule en revanche jusqu’à devenir un véritable obstacle.

Le serveur vérifie ensuite si la solution soumise correspond bien à un calcul qu’il a lui-même émis. Chaque calcul n’est valable qu’une seule fois et pendant une durée limitée.

ALTCHA est activé par défaut : vous n’avez rien à configurer. Vous trouverez la sélection dans le backend de votre site web (wp-admin) sous WP-ImmoMakler → Paramètres → Protection anti-spam → Niveau 2 : fournisseur de CAPTCHA, au cas où vous souhaiteriez choisir à la place un autre fournisseur ou « Aucun CAPTCHA (niveau 1 uniquement) ». Aucun autre réglage ni compte externe n’est nécessaire, contrairement aux CAPTCHAs hébergés en externe, qui exigent tous un sitekey et un secret key.

Le réglage s’applique à tous les formulaires du plugin :

  • Le calcul est généré et vérifié par votre propre serveur. Il n’y a aucune connexion à des serveurs tiers.
  • Aucun cookie n’est déposé.
  • Aucune donnée comportementale de vos visiteurs (mouvements de souris, frappes au clavier) n’est collectée.
  • Seule la solution du calcul est transmise : une valeur numérique aléatoire accompagnée d’une somme de contrôle.

La mention « Protégé par ALTCHA » dans le champ est un simple lien texte vers altcha.org. Elle ne charge aucun contenu depuis ce site.

Le navigateur récupère le calcul via un point de terminaison de l’API REST de WordPress :

GET /wp-json/immomakler/v1/altcha/challenge

La réponse n’est volontairement pas mise en cache (Cache-Control: no-store), car chaque calcul n’est valable qu’une seule fois.

WP-ImmoMakler choisit le procédé de calcul en fonction des possibilités de votre serveur :

  • Argon2id, si l’extension PHP sodium est chargée — ce qui est le cas chez presque tous les hébergeurs. Argon2id est gourmand en mémoire : chaque étape de calcul occupe 64 Mo de mémoire vive. Pour le navigateur de votre visiteur, cela est négligeable, mais cela empêche un robot spammeur de se rabattre sur des cartes graphiques, qui résoudraient sinon des milliers de calculs simultanément.
  • PBKDF2/SHA-256 dans le cas contraire. Il ne nécessite aucune extension ni de mémoire notable, mais se calcule nettement plus vite sur des cartes graphiques que dans un navigateur.

Les deux valeurs par défaut correspondent à la recommandation d’ALTCHA pour le procédé concerné :

ParamètreArgon2idPBKDF2/SHA-256Description
algorithmARGON2IDPBKDF2/SHA-256Procédé de calcul de la tâche
Itérations (cost)15 000Effort par étape de calcul
Mémoire (memory_cost)65 536 Kio (64 Mo)–Mémoire par étape de calcul
Étapes de calcul (counter)100–2005 000–10 000Nombre d’étapes jusqu’à la solution
Validité30 minutes30 minutesLe calcul expire ensuite
RéutilisationimpossibleimpossibleChaque calcul résolu ne vaut que pour un seul envoi

Sur un ordinateur de bureau, le calcul est résolu avec l’un ou l’autre procédé en deux à trois secondes environ ; sur un smartphone de milieu de gamme, en dix secondes environ. Comme le calcul démarre au chargement de la page, il est en pratique terminé avant que le formulaire ne soit entièrement rempli. Un bot doit résoudre le même calcul à nouveau pour chaque envoi et paie donc le même temps de calcul par envoi.

Le moteur de calcul Argon2id est chargé comme un fichier séparé depuis le répertoire du plugin (vendors/altcha/workers/argon2id.js). Si la mémoire de votre serveur est insuffisante pour qu’Argon2id puisse y être calculé, WP-ImmoMakler émet automatiquement le calcul concerné avec PBKDF2 et le note dans le journal.

Si vous recevez encore du spam malgré ALTCHA activé, vous pouvez augmenter l’effort de calcul via un filtre. Le filtre reçoit les valeurs par défaut du procédé utilisé par votre serveur ; l’exemple suivant double l’effort pour les deux. Notez que le temps d’attente sur les appareils peu puissants augmente également.

add_filter( 'immomakler_altcha_challenge_options', function ( $options ) {
$options['counter_min'] *= 2;
$options['counter_max'] *= 2;
return $options;
} );

Augmentez les étapes de calcul (counter) plutôt que les itérations (cost) ou la mémoire (memory_cost) : l’effort pour le navigateur est dans tous les cas le produit des valeurs, mais les itérations et la mémoire déterminent en plus le temps que met votre serveur à générer et à vérifier chaque calcul.

Ce même filtre permet également de définir le procédé. Cela est nécessaire si le moteur de calcul Argon2id ne peut pas être chargé dans votre configuration — par exemple parce qu’une extension d’optimisation ou un CDN délivre les fichiers du répertoire du plugin depuis un autre domaine :

add_filter( 'immomakler_altcha_challenge_options', function ( $options ) {
$options['algorithm'] = 'PBKDF2/SHA-256';
return $options;
} );

Si le filtre indique un procédé que votre serveur ne prend pas en charge, le filtre est ignoré dans son intégralité — ses étapes de calcul seraient bien trop faibles ou trop lentes pour l’autre procédé.

La protection anti-spam s’intègre dans la validation du formulaire de contact via le filtre suivant :

// Ajouter votre propre logique de validation
add_filter( 'immomakler_contact_form_errors_in_send', function( $errors ) {
// $errors['mon_erreur'] = true;
return $errors;
} );

Le message d’erreur affiché en cas d’échec de la vérification peut être personnalisé :

add_filter( 'immomakler_contactform_altcha_validationfailed', function ( $html ) {
return '<div class="alert alert-danger" role="alert">Veuillez réessayer.</div>';
} );