Feuilles de root

Logiciels libres, programmation et économie

Antispam en PHP sans CAPTCHA

Les CAPTCHA sont difficiles à mettre en place et posent des problèmes d'accessibilité. Comment protéger un formulaire du spam sans CAPTCHA ?

Première solution : un champ caché

La solution la plus simple à mettre en oeuvre, que j'avais initialement mise en place, consiste tout simplement à ajouter au formulaire un champ de type texte rendu invisible pour l'utilisateur par l'utilisation de CSS. Les robots ne tiennent pas compte des feuilles de style et remplissent tous les champs du formulaire. Cette solution ne s'est toutefois pas avérée très efficace.

<input type="text" name="leaveblank" style="display: none"></input>
<?php
if ( !empty( $_POST['leaveblank'] ) ) {
die();
}

Deuxième solution : une variable de session

Généralement les robots ne sont pas capables de gérer les cookies. La solution consiste à placer un nombre aléatoire dans un champ caché du formulaire et à le stocker en variable de session :

$token = md5( uniqid( microtime(), true ) );
$_SESSION[$form . '_token'] = $token;

Un système anti-spam pour Blubird

J'ai créé une classe Antispam qui sera intégrée à mon cadre de développement Bluebird. Elle propose différentes fonctions permettant d'utiliser différentes techniques anti-spam qui peuvent être combinées pour plus d'efficacité :

public function generateQuestion();
public function verifyAnswer( $answer );
public function generateFormToken( $form );
public function verifyFormToken( $form, $token );
public function verifyTimestamp( $timestamp, $threshold = 30 );

La méthode generateFormTo­ken() peut être utilisée pour générer une valeur aléatoire qui sera stockée dans une variable de session. verifyFormToken() permet de vérifier que la valeur transmise lors de la soumission du formulaire est identique à la valeur générée.

La fonction generateQuesti­on() génère un calcul arithmétique basique à effectuer et stocke le résultat en variable de session. verifyAnswer() vérifie la réponse saisie. L'opération peut être une addition, une soustraction ou une multiplication.

20 juil. 2014 Marqueurs : ,

Ajouter un commentaire

* Champ obligatoire