NoSPAM

Un plugin pour limiter le risque de spam dans les forums de SPIP.

Le plugin introduit plusieurs mécanismes visant à limiter l’envoi de spams depuis les formulaires de SPIP (forums publics, formulaires de contact, formulaires des pétitions).

Un jeton périssable

Les formulaires se voient dotés d’un jeton périssable et lié à l’IP. Ce jeton empêche la réutilisation du même formulaire au delà de la durée de péremption, et rend ainsi le post automatique par robot plus compliqué.

Modération automatique dans les forums non modérés

Le but des spammeurs est de publier du contenu en ligne. Si les messages suspects sont modérés, l’intérêt du site diminue pour les attaquants qui iront voir ailleurs.

Le plugin utilise donc quelques règles de prudence pour modérer automatiquement les messages suspects.

-  Si un message contient trop de lien, il est modéré automatiquement, voire mis à la poubelle (où il peut être repêché par le modérateur). Les liens vers le site lui-même ne sont pas intégrés à ce compte. À partir de la version 1.6.0, on peut utiliser la constante NOSPAM_DOMAINES_AMIS pour indiquer une liste de sites (séparés par une virgule) qui n’entrent pas non plus dans ce compte.
Par exemple, dans votre fichier mes_options.php :
define ("NOSPAM_DOMAINES_AMIS", "spip.net, core.spip.org");

-  De même, si une adresse IP identique a déjà envoyé trop de messages consécutifs dans un laps de temps donné, les nouveaux messages sont automatiquement modérés.

-  A partir de la version 1.2.0, le plugin se base aussi sur la langue du message pour affiner la modération, et compare également l’adresse IP du posteur avec une base actualisée en temps réel des IPs malveillantes [1]

Le plugin pourra être enrichi de nouveaux dispositifs au fur et à mesure de vos retours.

Ne cumulez pas !

Si vous voulez aider à améliorer l’efficacité de ce plugin avec vos retours, ne l’utilisez pas en même temps qu’un plugin captcha ou un autre plugin anti-spam.

Le but de ce plugin est de faire aussi bien ou mieux qu’un captcha, mais sans gêner l’internaute.

Vous avez encore du spam juste après l’avoir installé ?

Les spammeurs aimaient bien votre site ! Alors ils viennent voir avec leurs petites mains pourquoi leurs robots ne passent plus, et ils font des tentatives pour comprendre.

Laissez les faire, mais faites attention à bien déclarer “SPAM” les messages qui en sont. Vous verrez que très vite ils vont se décourager d’envoyer des messages qui ne sont jamais publiés !...

Avec SPIP 2.x, utiliser le plugin Gestion forum pour déclarer un message en SPAM.

Protéger d’autres formulaires - simple

Le plugin peut aussi protéger vos formulaires personnalisés avec son système de jeton.
Pour cela, il suffit de déclarer votre formulaire dans la variable globale formulaires_no_spam, dans votre fichier mes_options.php (ou mon_plugin_options.php). N’oubliez pas de repasser par le panneau d’administration du plugin si vous avez ajouté un fichier mon_plugin_options.php.
Ici, par exemple, on déclare le #FORMULAIRE_CONTACT_LIBRE :

// proteger le #FORMULAIRE_CONTACT_LIBRE
$GLOBALS['formulaires_no_spam'][] = 'contact_libre';

Protéger d’autres formulaires - avancé

Si la protection simple n’est pas suffisante, plusieurs protections supplémentaires sont possibles :

Analyser le résultat saisi

Par exemple pour le plugin contact_libre, qui définit un formulaire de contact : la fonction ’vérifier’ de ce formulaire (définie dans le fichier formulaire_contact_libre.php) utilise les fonctions d’analyse de NoSPAM (définie dans le fichier inc/nospam.php du plugin nospam) :

include_spip('inc/texte');
// si nospam est present on traite les spams
if (include_spip('inc/nospam')) {
	$caracteres = nospam_compter_caracteres_utiles($texte);
	// moins de 10 caracteres sans les liens = spam !
	if ($caracteres < 10){
		$erreurs['texte_message'] = _T('forum_attention_dix_caracteres');
	}
	// on analyse le sujet
	$infos_sujet = nospam_analyser_spams($sujet);
	// si un lien dans le sujet = spam !
	if ($infos_sujet['nombre_liens'] > 0)
		$erreurs['sujet_message'] = _T('nospam:erreur_spam');
 
	// on analyse le texte
	$infos_texte = nospam_analyser_spams($texte);
	if ($infos_texte['nombre_liens'] > 0) {
		// si un lien a un titre de moins de 3 caracteres = spam !
		if ($infos_texte['caracteres_texte_lien_min'] < 3) {
			$erreurs['texte_message'] = _T('nospam:erreur_spam');
		}
		// si le texte contient plus de trois lien = spam !
		if ($infos_texte['nombre_liens'] >= 3)
			$erreurs['texte_message'] = _T('nospam:erreur_spam');
	}
}

Obfusquer les name du formulaire

A partir de NoSpam v2

C’est une méthode proposée par NoSpam qu’on peut activer au cas par cas en ajoutant une clé dans le tableau renvoyé par la fonction charger() du formulaire :

	$valeurs['_nospam_encrypt'] = true;
	return $valeurs;

Les valeurs possibles sont true pour obfusquer tout sauf les name commençant par session_ ou 'all' pour tout obfusquer.

A noter que cette option est aussi activable globalement pour tous les formulaire du site via un define dans le fichier mes_options.php

define('_SPAM_ENCRYPT_NAME', true);

S’assurer que l’internaute recharge la page avant de lancer l’action

A partir de NoSpam v2

La plupart des bots spammeurs se contentent de faire un POST sans charger le résultat.
Pour éviter de faire une action en base de données déclenchée par un spammeur de ce type, il est possible de retarder l’action faite dans la fonction traiter() du formulaire et de la faire déclencher par l’utilisateur uniquement si il affiche bien le message de succès et execute le Javascript de la page.

Pour cela on peut utiliser la fonction nospam_confirm_action_html() de la façon suivante dans la fonction traiter()

	include_spip('inc/nospam');
 
	if (function_exists('nospam_confirm_action_html')) {
		$html_confirm = nospam_confirm_action_html("mafonction", "Description", $args);
		$res['message_ok'] .= $html_confirm;
	}
	else {
		// ICI lancer normalement mafonction()
	}

Pour simplifier son usage, l’utilisation de nospam_confirm_action_html() est identique à celle de job_queue_add()

Footnotes

[1Cette comparaison se fait par récupération de la liste des IPs qui abusent, et non en envoyant des données à un service externe sur la personne qui écrit le message. Cette fonctionnalité ne fonctionnera pas sur certains hébergements gratuits.

Discussion

131 discussions

  • Bonjour,

    Je crois avoir trouvé une parade provisoire efficace au spam de notre ami hongkongais qui multiplie les IP de provenance (soluce Deny IP caduque, donc).

    Dans le fichier spip/plugins/auto/inscription_motdepasse[…]/inscriptionmotdepasse_pipelines.php,
    juste sous :

    function inscriptionmotdepasse_formulaire_verifier($flux){
    if ($flux['args']['form'] == 'inscription'){

    Insérer :

    // Si soupçon de spam by oli
    $indice = "645792927"; // tél du spammeur de hong kong systématiquement renseigné dans le champ nom_inscription 
    $nom_spammeur = (_request('nom_inscription'));
    if (strpos($nom_spammeur, $indice) !== false) {
    header("Location: https://marreDuSpam.net");
    exit();
    }

    Mon souci était de ne pas pénaliser mes vrais visiteurs hongkongais.
    Je partage … en attendant mieux. 😊

    Reply to this message

  • 34

    bonjour
    depuis qq jours, j’ai une avalanche d’inscription (chinoise!) sur mon site, presque une toutes les 2 minutes...
    pourtant nospam est bien actif sur le formulaire d’inscription ? version à jour 2.41 sur un spip 3.2.14
    une innovation chinoise pour contourner nospam ?

    需要購買大站協議發郵件請加QQ:645792927 邹红费
    ce qui veut dire “Si vous avez besoin d’acheter le grand accord de station, veuillez ajouter QQ : 645792927 pour envoyer un e-mail à Zou Hongfei” !!! merci deepl... et c’est toujours ce même message..

    s’il y a qq chose à faire, merci d’avance

    pam

    • je complète
      c’est toujours la même IP 103.197.70.56
      pas de log nospam (normal, puisque pas vu), pas de log spip (bizarre ? )
      je le trouve que dans le log http... avec un GET et un POST à chaque fois
      l’inscription a bien été stocké, avec un statut à confirmer

      il est possible de bloquer spécifiquement cet IP ?

      pam

    • Dans les “REGLAGES PERSONNALISES” du htaccess
      mettre un :

      Deny from 103.197.70.56

      Ca devrait etre bon ?

    • merci

      c’est ce que j’ai fait, mais ca continue
      mais je ne suis pas sûr que le serveur apache prenne en compte tout de suite le htaccess, il faut peut-être le redémarrer, ou à minima le rafraichir, or je suis sur un mutualisé ovh, donc je n’y ai pas accès

      je ne sais pas comment vérifier si le htaccess est bien actif ?

      encore merci
      pam

    • Il suffit de faire une erreur dans le .htaccess
      Par exemple ecrire “Erreur” sur la premiere ligne.
      Il devrait y avoir alors une page avec Internal Servor Error.
      Si tout marche, c’est que le .htaccess est inactif.

    • exact, c’est immédiat donc le htaccess fonctionne bien
      j’ai essayé Deny from 103.197.70.
      et finalement, j’ai interdit les inscriptions en ligne...
      j’attends un peu pour réouvrir, on verra

    • Bonjour,
      Je rencontre exactement le même soucis depuis ce weekend, par contre cela impacte une dizaine (au moins) de mes sites, j’aimerais trouver une solution perenne? Quelqu’un aurait une idée?
      Merci, c’est urgent!
      Pour info l’Ip est 103.158.160.136

    • et bien le fait de supprimer les inscriptions et de vider le cache, a stoppé le pb
      mais après 24h, j’ai réouvert, et quelques heures plus tard, ca a recommencé, d’abord lentement, puis encore plus fort qu’avant... 700 inscriptions par heure !
      j’ai donc refermé les inscriptions

      ca devient problématique, car au milieu des 2400 inscriptions de cet après-midi, il y avait UNE vraie inscription, ca aurait été dommage de la purger avec les autres !!

      si les logs http peuvent aider... me le dire

      pam

    • Quelle Ip maitenant?

    • la même que toi... !!!
      103.158.160.136
      exactement 1648 enregistrements dans la table auteurs en 6h30...
      bizarrement, plus de mails ? il faudrait que je les rapproche pour voi...

      pam

    • Moi j’ai bloqué via htaccess et je suis tranquille depuis :
      Deny from 103.158.160.
      Deny from 103.197.70.
      Cela dit je suis pas complétement serein non plus. On va peut-être se réveiller avec des milliers de faux comptes en BDD.. Moi j’ai presque une vingtaine de site impactés... La galère...

    • le D majuscule de Deny à de l’importance ?

      S’il y a une nouvelle IP à chaque vague, que faire de plus ?!

      visiblement, il arrive à piéger le “jeton” périssable du formulaire... il pourrait y avoir un log nospam pour avoir une idée des jetons et de leur durée de vie ?

    • Bonjour,

      Dans le htaccess au début je pemets:

      RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^AU|BG|CZ|GA|IL|RU|KZ|SG|SK|UK$ [NC]
      RewriteRule .* https://casse-toi.com [R=301,L]

      les pays lister n’ont pas accès au site et ça évite des soucis.

    • Bonjour,
      @pamillet :
      Perso j’ai mis rajouter dans le fichier inscription.php deux lignes :
      spip_log($_SERVER[’REMOTE_ADDR’], ’spam_form_inscription’ . _LOG_CRITIQUE);
      spip_log(_request, ’spam_form_inscription’ . _LOG_CRITIQUE);
      Juste en dessous de la ligne :
      $erreurs[’message_erreur’] = _T(’pass_rien_a_faire_ici’);
      Cela permet de garder dans les logs, les tentatives infructueuses de validation du formulaire et de consulter le contenu du formulaire et l’IP du bot. C’est du vite fait, mais ca permets de voir si il y a beaucoup de tentatives.

      @Pierre Kuhn :
      De mon coté, le filtrage par Pays n’est pas possible, j’ai des sites un peu partout dont en chine...
      Merci,
      Jul

    • site en chine donc seveur chinois, spamer par les chinois ?

    • Non, mes sites chinois sont chez GANDI ;)

    • et tu as un url que l’on regarde ce qui se passe ?

    • Les IPs sont de Hong Kong.
      Ca fait une cible plus precise que la Chine continentale.

    • Le but de notre message est moins de bloquer les IPs que de trouver une alternative a recaptcha.
      Aujourd’hui c’est des IPs de la chine, demain ca viendra d’ailleurs...

    • Jul, oui bien sur mais est ce que tu as bien les champs adéquate dans le formulaire en question qui sont rajouter par nospam ?
      Est ce que tu as la dernière version du plugins ? idem pour SPIP ?

    • Oui, j’ai bien les champs adéquate, j’en ai même deux supplémentaires.
      Dernière version de tous les plugins et SPIP 3.2.15.

    • de mon coté, SPIP 3.2.14 [24407], NoSPAM 2.4.1
      idem, j’ai des lecteurs francophones en chine qui peuvent commenter..
      par contre, comment vérifier que le formulaire a bien les champs “adéquate” dans le formulaire, c’est le formulaire d’inscriptions standard de spip (spip.php?page=inscription)
      Il serait surchargé par nospam ?

    • Pamillet,

      Tu as une url ? Normalement cela rajoute un champs dans le formulaire à ne pas remplir.

    • et ca recommence ce matin avec une nouvelle IP, toujours à Honk Kong...
      175.100.204.5

      pourtant j’ai désactivé les inscriptions sur le site... Mais le formulaire reste accessible avec l’URL ?

      je revide le cache...

      pam

    • Idem avec cette IP...
      175.100.205.4

      Je confirme que le champs nobot est bien en place et que j’utilise moi deux champs invisibles avec Id variable...

    • Pour le coup, je vais bloquer cette fois-ci toutes les IPs provenant de Hong Kong, vu qu’il semble que toutes les attaques proviennent de la pour le moment.
      Je recommande ce site pour récupérer facilement la liste des Ips à bloquer.
      https://www.countryipblocks.net/acl.php

    • @pamillet tu as une url ?

    • L’url de quoi?

    • http://lepcf.fr/spip.php
      ?page=identifiants
      &lang=fr
      &mode=6forum
    • @jul
      le champ nobot, tu le vois où ?
      chez moi, il y a bien un champ nobot dans le formulaire inscription.html
      mais je ne sais pas faire le lien avec l’URL d’inscription de mon site spip.php?page=identifiants&lang=fr&mode=6forum
      ... ?

      pam

    • Je vois bien les protections nospam, peut etre lire la doc de nospam et rajoute des config en plus pour limité les spams alors.
      Mais ce site est peut etre a limité au visiteurs français ....

    • @pierre
      le site lepcf.fr est pour francophone, (avec quelques traductions) mais il y a des lecteurs francophones vivant dans d’autres pays, dont la Chine...

    • De mon coté, ca continue avec une IP chinoise :
      111.77.229.47
      J’ai déjà bloqué toutes les IPs HongKongaise.
      Vous confirmez que NoSpam protège le formulaire d’inscription par défaut de SPIP?

    • Bonjour Pamillet,
      je sais pas si tu es tranquille avec les spams chinois mais de mon coté cela reprends alors que je bloque beaucoup d’IP désormais.
      Je viens de retravailler les vérifications effectués lors de l’inscription de manière à bloquer tous les signes chinois et tous les emails @qq.com
      Ca devrait aider... Je peux partager le code évidement.

    • Ben j’ai un copain vivant en chine avec un mail qq.com et qui est un des auteurs de mon site...

      Et ça a recommence ce jour avec une nouvelle ip.. Malheureusement, depuis une péniche en bretegne. Difficile de suivre, ça attendra

      Mais il faudrait trouver le truc de ce hacker qui contourne la protection nospam... Car ce jour il y a eu 20 attaques constatées et bloquées.. Et malgré tout des centaines d’attaques qui cherchent Pourquoi ?

    Reply to this message

  • 2

    Bonjour, puis-je ajouter ceci

    // proteger le #FORMULAIRE_FORMIDABLE
    $GLOBALS['formulaires_no_spam'][] = 'formidable';

    à mon fichier config/mes_options.php ?

    Est-ce que cela fonctionnera ?

    Merci

    Reply to this message

  • Actuellement on reçoit un mail de notification pour chaque forum posté, même quand il est détecté comme spam et rejeté.
    Est-ce qu’il y a un moyen d’éviter des mails de notification pour chaque spam bloqué ?

    Reply to this message

  • 6

    Oups, je viens de mettre à jour mon SPIP en 4.1, peut-être un peu trop tôt : NoSPAM n’est pas encore qualifié pour cette version, et donc il a été sèchement éjecté de mon site.

    En 24 heures, une trentaine de pourriels étaient à supprimer (alors que je suis bien certain de ne jamais en avoir laissé passer un seul au filtre).

    J’espère que l’adaptation de NoSPAM à cette V4.1 ne posera pas de problème, parce qu’en plus j’ai bien lu la doc disant qu’on ne peut pas revenir en arrière (sauf à repiquer sur sauvegarde bien sûr, donc en renonçant à l’activité intervenue depuis).

    • La doc dit aussi comment activer les plugins qui ne sont pas marqués comme compatible :)

      define('_DEV_VERSION_SPIP_COMPAT', '4.0.99');

      dans mes_options.php

    • Mwais. J’avais pas ce fichier mes_options.php, ça avait l’air simple et je l’ai ajouté avec cette ligne de code dedans.

      Résultat des courses : site bloqué. Retirer mon fichier bricolé n’a rien permis de récupérer. J’ai du refaire une install complète du SPIP, J’ai sauvé mon site après avoir sévèrement balisé. Maintenant tous les caractères accentués sont pétés. Y a que mille articles et 17 ans de boulot dedans, une paille !

      J’aurais mieux fait de rester au lit.

    • heu? comment t’a fait ton coup pour bloquer ton site ?
      pour les caractères accentués, c’est vraiment pas de pot, c’est le cas des sites très vieux qui ont connu une migration de charset mal foutu dans le passé (je le sais j’ai eu un problème similaire il y a 2 ans...)

      Après il y moyen de les récuperer, je sais, mais c’est tjr galère. Je t’inviterai si ce n’est fait à demander de l’aide sur discuter.spip.net

    • Ah ça, ce qui m’est arrivé, ça me dépasse un peu. Oui, ce site est ancien, il tourne depuis 2004. J’ai eu des ennuis de charset en quittant la version 1.8 pour la V2 je crois, à moins que cela ne remonte carrément à la version 1.4, bref, les moins de vingt ans n’en ont qu’une idée assez vague. J’ai été obligé de tout passer à la moulinette de remplacer des séquences de caractères barbares par les bons caractères, ça m’a pris des années et d’ailleurs il en restait encore un peu. Je n’envisage pas très sereinement de recommencer ce cirque !

      Cela dépasse le problème de ce plugin, je vais exposer mes difficultés ailleurs sur le forum. Mais je continue à devoir effacer plein de spams chaque jour. Je m’en souviendrai, de cette mise à jour 4.1...

    • Oui enfin faire une maj sans vérifier la compat...

      Cela etant c’est pas normal que tu ait pas pu utiliser le define...

      Tu a mis quoi exactement dans ld fichier mes_options?

      Sinon la solution serait dd modifier la borne dans le paquet.xml du plugin

    • Oui enfin faire une maj sans vérifier la compat...

      Pardon, je suis passé de la version 3 à la 4.0 sans aucun problème : en passant de 4.0 à 4.1, je m’estime en droit de ne pas craindre de coup fourré.

    Reply to this message

  • Le plugin ne semble pas poser de problème en spip 4.1.1 en forçant le bornage.

    Reply to this message

  • 1

    Bonjour,
    Pour info lorsque je mets à jour
    NoSPAM 2.1.6 - stable

    vers
    NoSPAM v2.4.0

    cela semble empêcher le fonctionnement de AnythingSlider 2.0.2 - dev dans l’espace public. (page cassée)

    Je suis retournée à la version qui ne pose pas ce problème.

    C’est un SPIP 3.2.8 [24473]
    PHP Version 5.4.45
    (je sais il n’est pas à jour mais je n’ai pas la main)

    • Bonjour et merci, car j’ai je viens d’avoir un problème semblable : suite à la mise à jour de NoSPAM v2.4.0, mon formulaire d’inscription à la newsletter ne s’affichait plus, et bloquait tout l’affichage du site.
      Je suis redescendu à une version inférieure (v2.2.1) et tout est rentré dans l’ordre.

    Reply to this message

  • 1

    Bonjour,

    Depuis la v2.2.0, Nospam s’applique sur tous les formulaires du backoffice.

    Certaines pratiques s’en trouvent pénalisées. Par exemple, il n’est plus possible d’insérer par copier-coller un tweet, une vidéo ou tout autre code html comprenant des liens dans un article.

    J’aimerai donc savoir s’il est possible d’exclure un formulaire du filtrage nospam ?

    • Ce problème résultait d’une incompatibilité entre Nospam et la lame du couteau suisse de lutte contre le spam.

      Je m’en suis donc sorti en désactivant cette dernière.

    Reply to this message

  • J’essaie de mettre en place un formulaire de contact relativement simple en suivant le tuto Formulaires CVT par l’exemple

    J’ai installé le plugin NoSPAM et ai tenté d’obfusquer l’ensemble des names de mon formulaire en ajoutant $valeurs['_nospam_encrypt'] = true; dans ma fonction charger().

    Par contre, je bute sur la manière de récupérer mes names dans ma fonction verifier(). J’ai essayé de regarder dans le fichier inc/nospam_encrypt.php du plugin mais je ne vois pas trop comment procéder in fine...

    Merci par avance pour le coup de main !

    Reply to this message

  • Sur les forums, les seuls spams qui passent nospam sont des tentatives d’arnaque faites à la main sur des thèmes spécialisés. Pour ajouter un filtrage par motclés sur le formulaire de forum, j’ai défini une fonction nospam_verifier_formulaire_forum() dans un fichier nospam/verifier_formulaire_forum.php   comme indiqué dans la doc. Ça calcule donc un score sur la base de la présence de motclés, et ensuite :
    -  Soit ça lève une erreur $flux['data']['message_erreur'] .= $erreur et ça vide la prévisu unset($flux['data']['previsu']); Du coup c’est pas enregistré et un message d’erreur s’affiche.
    -  Soit, quand le score est moins fort, j’aimerais enregistrer le forum avec le statut “prop” (proposé). Avec $flux['data']['statut'] = 'prop' , le message disparaît après validation, sans message d’erreur, mais il n’est pas enregistré du tout.
    Du coup comment faire pour enregistrer un commentaire comme “proposé”, via la fonction nospam_verifier_formulaire_forum(); ou autrement ?

    Reply to this message

Add a comment

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite / PostgreSQL
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparait.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Who are you?
[Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom