Protection des forums et des formulaires contre les robots spammeurs

Les Pages Perso Chez Free

Par Al, le , dans Créer ses pages perso. / Dernière modification : le par Al (merci à "Moi", Otomatic, D. St-Sanvain, mithril94, AdditifsTabac, anotherman, a@a.a et fred <none>).
Tags : Assistance, Apache, Fonction mail(), Sécurité, PHP, Spam, Suspension, Tutoriaux

Ce billet est issu des « révélations » de certains utilisateurs sur les méthodes de protection contre le spam des sites qu'ils administrent sur les Pages Perso de Free.

Sur les Pages Perso de Free, la règle est de ne pas autoriser le spam en base de données, même temporairement. Si vous utilisez un CMS ou des scripts permettant les commentaires de vos visiteurs (Wordpress, Dotclear, Joomla, Drupal, CMS Made Simple…), il existe sans doute déjà des solutions ou des extensions permettant de protéger vos formulaires de contact, commentaires ou inscription. Si vous codez vous même vos scripts, vous disposez de nombreuses librairies permettant de mettre en place des protections anti-spam performantes, en vous reposant sur des services externes, sur des captcha ou des bannissements d'IP.

Depuis quelques temps cependant, les appels PHP externes sont coupés et tous les services reposant sur des validations de services externes ne sont plus fonctionnels. Il reste cependant possible de protéger efficacement son forum ou son site Web personnel. Ce billet, qui est un complément au billet de Albert concernant la protection contre le spam, il est davantage orienté sur la protection des forums et autres formulaires. Il est complété par deux autres billets : L'art et la manière d'envoyer des mails depuis les pages perso de Free… et Utiliser correctement les formulaires de contact sur les Pages Perso de Free.

Les CMS

SPIP

Les dernières versions de SPIP inclues par défaut des protections anti-spams efficaces et fonctionnelles sur les pages perso de Free. Il s'agit principalement de système de protection par champs cachés. Il faut cependant évtiter l'extension NoSpam, car elle stocke les spams en base de données et peut donc conduire à la suspension de votre compte. Plus d'informations sur Spip-Contrib.

Joomla!

Joomla! 1.5 est « une passoire à spam », il faut donc veiller à prendre les mesures de protection additionnelle à celles intégrées par défaut : vous pouvez installer Jollom 2.0 (documentation et téléchargement) pour protéger tous vos formulaires (inscriptions, login, commentaires, contacts, etc.). Attention : extension non-testée.

Vous pouvez également faire un tour sur la rubrique dédiée du catalogue d'extensions Joomla! 1.5.

Wordpress

Un grand nombre d'extension anti-spam existe pour le CMS Wordpress mais certains sont plus adaptés à l'infrastructure des PP de Free : toutes les extensions qui reposent sur des appels à des serveurs externes à votre compte (Aksimet, Conditional Captcha, reCaptcha…) ne fonctionneront pas car Free a bloqué les accès externes à votre compte depuis les scripts PHP.

D'autres extensions restent cependant parfaitement fonctionnelles : Antispam Bee (dernière version fonctionnelle 2.4.6, téléchargeable ici ; veillez à décocher l'option « Mark as spam, do not delete » dans les réglages avancés du plugin ainsi que « Do not check trackbacks / pingbacks » et cochez « Comment form used outside of posts »), Growmap Anti Spambot Plugin, ou encore suivre les astuces anti-spam de WolfAryx.

phpBB

Le système de protection anti-spam par défaut de phpBB est faible. Il est avantageux d'ajouter le module Advanced Block Mod, en prenant soin de le configurer correctement (nottament désactiver la journalisation des spams).

Simple Machine Forum (SMF)

Pour les forums SMF, voici quelques astuces pour vous protéger du spam, proposés par un utilisateur régulier de ces forums. Un résumé des ses méthodes de blocage est publié ici, en s'appuyant sur le script Bad Behavior.

Si vous utilisez Simple Machine Forum, voici une liste de mods anti-spams spécifiques pour les forums SMF 2.0.x :

Pour les forums qui veulent vraiment rester 100% publics :

La protection des formulaires

Il est possible de protéger efficacement vos formulaires contre les robots spammeurs, via PHP ou via Apache :

Blocage des IP de spammeurs

Blocage par PHP

Pour protéger simplement vos formulaire de contact, d'inscription, de commentaires (ou autre) en ajoutant simplement ces quelques lignes au début de vos scripts. Ces lignes auront pour fonction de filtrer les spammeurs des visiteurs « normaux » et interdire le formulaire si nécessaire :

$spammeurs = array("IP1","IP2"…); // toutes les IP à bloquer
foreach($spammeur as $value)
{
if($_SERVER['REMOTE_ADDR']==$value){die();} // spammeur détecté, fin du script
}
// ici la suite du script pour les non spammeurs…

Cette méthode n'est pas la plus adaptée au service des Pages Perso de Free, car le filtrage est effectué par le script PHP. Si votre site est la cible de nombreux spammeurs, vous risquez de solliciter très fortement l'exécuteur PHP et, partant, être la cause de nombreux ralentissements, indisponibilités et plantage pour vos colocataires de serveur et de grappe.

Blocage par Apache

Cette méthode de protection la plus appropriée à l'infrastructure des Pages Perso de Free, bien quelle ne soit pas aussi « souple » que la protection par PHP car vous ne pouvez interdire que l'accès à des URL ou des fichiers, pas une fonction ou une section spécifique de vos pages.

Pour interdire l'accès à un fichier contenant un formulaire :

(…)
<Files ~ "/votre-formulaire.php">
Order Allow,Deny
Allow from all
Deny from IP SPAMMEUR 1
Deny from IP SPAMMEUR 2
Deny from IP SPAMMEUR 3
…
</Files>

Pour interdire l'accès à une URL ou une portion d'une URL (la directive (?i) rend la règle insensible à la casse) :

(…)
RedirectMatch 403 /\$\&
RedirectMatch 403 (?i)/\.(bash|git|hg|log|svn|swp|tar)
RedirectMatch 403 (?i)/(1|contact|i|index1|iprober|phpinfo|phpspy|product|signup|t|test|timthumb|tz|visit|webshell|wp-signup).php
RedirectMatch 403 (?i)/(author-panel|class|database|manage|phpMyAdmin|register|submit-articles|system|usage|webmaster)/?$
RedirectMatch 403 (?i)/(=|_mm|cgi|cvs|dbscripts|jsp|rnd|userfiles)
Order Allow,Deny
Allow from all
Deny from IP SPAMMEUR 1
Deny from IP SPAMMEUR 2
Deny from IP SPAMMEUR 3
…

Il s'agit bien entendu d'exemples divers et variés que vous devez adapter à vos besoins. La directive RedirectMatch est décrite en détail dans la documentation du serveur Apache.

Protection des formulaires par ajout de champs cachés

Une technique de protection, très simple, consiste à mettre en place un champ caché dans votre formulaire et de contrôler sa valeur par PHP. Si elle ne correspond pas, c'est qu'un robot à tenté de remplir le formulaire. Si la valeur correspond à ce que vous attendez, un visiteur humain, qui n'a pas pu voir le champ caché, est à l'origine du message.

Il est également possible de proposer aux utilisateurs du formulaire une devinette dont vous connaissez la réponse, mais qu'un robot ne pourrait comprendre. Par exemple, « Quelle est la couleur du cheval blanc d'Henri IV ? » Ces questions peuvent être présentées aléatoirement dans une liste afin d'éviter la possibilité qu'un attaquant puisse programmer spécifiquement un robot pour soumettre la bonne réponse.

D'autres méthodes existe, tel que des contrôles d'identifiants de session ou des champs cachés modifiés par Javascript lors de la saisie des données.

Vous trouverez plus d'informations sur ce billet du blog de Totof ou le système proposé pour les formulaires de contact proposés au téléchargement sur ce site.

Protection par Catpcha

Il est possible de protéger très efficacement vos formulaires par des captcha, mais vous devez prendre en considération les questions d'accessibilité de ces captcha à des public handicapés. Quelques problèmes peuvent cependant survenir lors de l'utilisation de captcha sur les serveurs des pages perso de Free : tout captcha sollicitant un accès externe (via PHP) pour afficher ou contrôler la valeur du captcha ne fonctionnera pas.

Voici une liste (non-exhaustive) de captcha fonctionnels sur les pages perso de Free :

Bannissement temporaire

Il est possible de protéger vos formulaires de login par des systèmes de bannissement temporaire si l'utilisateur échoue un trop grand nombre de fois. Un exemple de code est proposé par Sebastien Sauvage. Bien que le code présenté corresponde à son CMS de gestion de liens Shaari, il est possible de l'adapter facilement à un autre formulaire.

Les développements personnels

Exemple avec FluxBB/PunBB

J'ai développé un « plugin » personnel pour FluxBB qui effectue des transformations :

Plages type 123.123.123.0-123.123.135.255 vers des notations CIDR si c'est possible ou une notation spécifique FluxBB et vice-versa.

Exemples concrets :

SPAM depuis l'IP 185.8.200.244
whois = Russie 185.8.200.0 - 185.8.202.255
Le plugin dit que la notation CIDR est impossible et que la plage compatible de bannissement FluxBB est 185.8.200 to 185.8.202 et il génère les IP à bannir : 185.8.200 185.8.201 185.8.202…

Avec 221.175.232.247
Whois = Chine 221.172.0.0 - 221.175.255.255
Plugin : notation CIDR = 221.172.0.0/14
Bannissement FluxBB : 221.172 to 221.175
Les IP à bannir : 221.172 221.173 221.174 221.175

Un développement spécifique

Pour ma part, j'ai un petit système avec 3 tables :

rubriques, avec les champs suivants :

  • index (auto incrément, lien)
  • ordre (pour le bon affichage des rubriques entre elles)
  • nom
  • date mise à jour (pour le suivi)
Exemple :
1;1;ENTETE;
2;3;LISTING;
5;2;ERREURS;

htaccess, avec les champs suivants :

  • index
  • rubrique (lien à la table précédente)
  • ordre (au sein de la rubrique)
  • texte (contenu de la rubrique, ordonné par ordre)
  • date (idem)
Exemple :
132;1;1;# TAGAZOUS
133;1;2;CURRENT_TIMESTAMP

IP, avec les champs suivants :

  • IP (en texte 123.456.789.012)
  • masque (par défaut l'IP, mais tronquable : 123.456.789)
  • IP long (en numérique, pour classer)
  • date (idem)

Je gère les entrées séparément dans chaque table, et je génère par rubrique le contenu. Par « mots clés » le contenu, je mets par exemple date et heure, ou la liste des masques d'IP à bloquer :

188.143.232.33;188.143.232;3163547681
193.169.86.33;193.169.86.33;3249100321

Je ne la remplis pas a priori, mais d'après les occurrences de spam (et je mutualise avec d'autres sites, pas forcément de Free).

À la fin, on obtient, par exemple :

# ENTETE
# TAGAZOUS
# 02-12-2012 11:23:51
# ANTI SPAM
Order Allow,Deny
Allow from all
Deny from 188.143.232
Deny from 193.169.86.33

Liens utiles pour se protéger du spam