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()

Notes

[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

137 discussions

  • 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é ?

    Répondre à ce 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é.

    Répondre à ce message

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

    Répondre à ce 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.

    Répondre à ce 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.

    Répondre à ce 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 !

    Répondre à ce 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 ?

    Répondre à ce message

  • 11
    Benoits

    Bonjour,
    Suite à une mise à jour de SPIP dernière version + formidable et no spam je reçois le message suivant au dessus du formulaire à chaque validation de réponse :
    Impossible de prendre en compte votre message. Merci de le soumettre à nouveau !
    Qui est visiblement lié à une histoire de jeton sur nospam d’après la doc...
    On avait pas de problèmes de SPAM mais par contre on risque de louper des réponses assez importantes sur ce formulaire destiné à des personnes agées...
    Car ça fonctionne si on revalide une seconde fois le formulaire...
    Y’a-t-il possibilité de désactiver nospam, au moins pour tester si le problème vient bien de là ? Car si on le désactive seul dans l’interface ça désactive d’office formidable.
    Please help me !
    (argh j’ai le même message quand je veux valider ma réponse sur ce site !!! cf copie d’écran)

    • il est possible de supprmer dans le fichier paquet.xml de formidable le fait qu’il nécessite nospam, et cela permettra d’activer formidable mais pas nospam.

      Cela étant, ce n’est pas normal. Peux tu voir du coté des fichiers nospam.log pour qu’on comprenne ?

      ps : le choix de mettre nospam en obligatoire sur formidable a été pris car beaucoup se plaignait de spam, sans connaitre le plugin. Tu es la première personne qui nous remonte un problème similaire au tien — que je ne nie pas, mais que j’aimerais comprendre.

    • Oui mais c’est pas la bonne réponde @maieul !

      Si il y a ce problème récurrent c’est parce que le formulaire a perdu son dynamisme et le jeton est mis dans le cache au lieu d’être calculé à chaque affichage du formulaire.
      C’est donc un problème de structure de squelette, et d’utilisation abusive de #INCLURE qui par construction transforme en texte/html tout ce qui est inclus (en perdant donc les partie dynamique)
      Il faut donc remplacer les #INCLURE par des <INCLURE> car vous avez sinon le risque de divulger du contenu saisi par une personne à d’autres personnes…

      (ou alors le formulaire est inclus via un modèle perso ce qui produit le même résultat)

    • Ce qui est étrange est que Benoits a eu aussi le problème ici. En consultant les logs, je vois qu’une IP a été considéré comme problématique à l’heure où il postait son message.

      Du coup il faudrait peut etre tester depus une autre IP.

      par contre cerdric, ce que tu dis sur le dynamisme des squelettes est pas hyper clair, notamment sur les modèles : c’est problématiqur d’appeler un formulaire via un modèle ?

    • Benoits

      Re-bonjour,
      En fait c’est étrange le problème est aléatoire certains collègues arrivent à poster sans problème (depuis la même IP) alors que des personnes extérieures se sont plaintes de ne pas avoir reçu de réponse suite à leur validation du formulaire depuis que nous avons fait la mise à jour de spip 3.2
      Nous envoyons des mails sur de très grosses newsletters à partir de l’IP du boulot, peut-être est on classés comme spammeurs ? (ce n’est pas le cas je vous rassure)
      Je ne trouve pas de fichier nospam.log dans le dossier du plugin ou dans tmp pourriez vous me dire où il se cache ?

    • Non c’est pas étrange, c’est normal. Il y a un jeton de validité généré dans le html du formulaire, normalement à chaque affichage, qui est valide 1h uniquement.

      Donc selon l’état du cache, selon que le jeton est plus ou moins vieux ça passe ou pas. C’est un problème de structure des squelettes et d’insertion des formulaires, rien à voir avec l’IP

      Quand l’IP est suspecte ou que le comportement de l’utilisateur fait penser à un bot, le message le dit explicitement

    • Benoits

      Ça reste mystérieux pour moi étant donné que ça marchait très bien depuis des années et que depuis la màj en de 3.0 vers 3.2 ça pose souci.... Mais effectivement il y a beaucoup d’ « #INCLURE » dans nos squelettes.

    • A tester donc en remplacang par des <INCLURE>.

    • Benoits

      Bon ben effectivement ça a l’air d’aller mieux en remplaçant tous les #INCLURE par des <INCLURE /> à confirmer sur le long terme mais merci pour vos réponses rapides !!

    • Bonjour,

      J’ai le même problème et j’utilise que des <INCLURE mais je me rends compte que le _jeton ne change pas sauf si on revalide le formulaire avec le message d’erreur.

      Le formulaire est utiliser dans un article avec le modelè.

      J’ai le problème sur 3 des 5 formulaires.

      Comment chercher ce qui bloque ?

      Merci.

    • benoits

      Je réagis un peu tard mais oui ben moi en fait, le coup de tout remplacer par des <INCLURE n’a pas vraiment résolu le problème... Le problème est apparu moins fréquemment peut-être (il me semble) toujours de façon assez aléatoire, j’ai laissé tomber pour résoudre le souci de façon technique et j’ai du appeler nos adhérents a bien valider une seconde fois le cas échéant mais j’aimerai bien trouver une solution à terme afin d’éviter d’avoir à proposer des formulaires à la mano pour être sur de la fiabilité du truc...

    • @Cédric j’ai un site Z-core assez simple dans son contenu, càd que ya quasiment pas de sous-inclusions, les contenus sont dans le bloc principal (« main » chez moi) qui est donc inclus par <INCLURE>
       ?

    Répondre à ce message

  • 1

    Bonjour,
    Je me rends compte à l’instant que mon plugin NoSpam 2.1.6 bloque l’envoi de mes courriers avec le formulaire Contact Libre 2.0.3, sur un SPIP 3.2.5
    J’active NoSpam, j’arrive sur une page blanche après envoi.
    Je désactive NoSpam, le message est envoyé.
    Après vidage du cache, le symptôme persiste.
    A noter que le plugin Formulaire de contact avancé 0.16.6 ne semble pas affecté.
    A noter aussi que j’utilise le plugin Facteur sur le site posant problème.
    Pouvez-vous me donner une piste pour débugger cela ? Merci !

    • Le problème venait d’une surchage que j’avais faite sur les formulaires du plugin Contact Libre => Bref, mes vieux formulaires Contact Libre en surcharge ne prenait pas en compte les ajustements récents des formulaires du plugin NoSpam mis à jour.
      Au temps pour moi, et merci à Maïeul pour son aide !

    Répondre à ce message

  • 6

    Bonjour,

    Confronté à de nombreux SPAM dans formidable, je m’attendais à y trouver comme pour les forums un bouton [Déclarer en SPAM].
    Et en fait, ça n’est pas prévu actuellement (dixit Maëul).

    Est-ce que c’est imaginable de le rajouter ?
    C’est beaucoup de code à faire ?
    Des pistes (doc à lire, lignes de codes existantes à comprendre, API) ?

    • Ici c’est le support de NoSpam, rien à voir donc

      (NoSpam ne gère aucune interface utilisateurs, seulement de la detection et blocage de robot à la saisie et du taggage spam pour les forums, qui par ailleurs gèrent déjà le statut SPAM sur les messages et leur propre interface de taggage, notification etc.)

    • A voir quand même. En effet, à ce jour nospam 1.6.1 tient compte des messages deja existant pour calculer la probabilité qu’un message soit du spam (pipeline nospam_preedition). C’était là le sens de mon propos : à quoi servirait-il que formidable puisse déclarer un message comme spam si après on ne peut tirer profit de cette information ? Et à mon sens ce serait à nospam de pouvoir proposer un mécanisme général tenant compte du statut « spam » de l’objet.

    • nospam propose toute une panoplie d’outils et de fonctions de detection, et un heuristique sur le comportement de post des utilisateurs mais :

      1/ il faut bien que l’objet editorial (formidable en l’occurence) propose/supporte un statut SPAM
      2/ qu’il propose une interface pour signaler manuellement du SPAM, ou a contrario valider un message qui aurait été détecté en SPAM si on une detection automatique (car sinon ça n’a pas de sens)
      3/ et alors, si tu connais la structure éditoriale de l’objet tu peux envisager de faire une fonction de detection/supposition pour essayer de repérer les SPAMs

      Pour 1/ et 2/ ça dépend totalement du plugin editorial (formidable toujours).

      Pour 3/ ça peut se discuter, mais dans la mesure ou formidable est une structure éditoriale complexe et variable que lui seul connait, je ne vois pas du tout mettre toute cette complexité dans nospam.

      Donc là aussi c’est à formidable de gérer ça en ajoutant ses fonctions de detection, ce pour quoi il peut s’appuyer sur les fonctions de nospam...

    • oui pour 1 et 2 je suis d’accord.

      pour 3 est-ce qu’il n’y aurait pas, à tout du moins, possibilité d’envisager une structure commune fournie par nospam sur lequel des formulaires pourraient se brancher ? je suis d’accord que la structure éditoriale de formidable est complexe. Mais est-ce qu’on ne pourrait pas envisager une fonction générique de nospam recevant des infos « normalisées » sur un objet, charge au plugin qui crée cet objet (en l’occurence, Formidable) de fournir ces infos.

      En l’occurence, si je prend ce que je vois d’existant dans nospam actuellement (pas la version de dev) je vois trois element d’heureustique
      1), le statut spam + l’heure + IP des objets précédements enregistrés
      2) le nombre de lien
      3) langue

      En séparant ces 3 élèments en fonction distinctes, on pourrait brancher dessus des objets (charge aux plugins de fournir les paramètres de ces fonctions d’après ses objets propres)

    • Comme j’ai dit, il y a des fonctions utilitaires dans nospam, mais l’heuristique est à adapter à la structure éditoriale.

      Si tu as 10 champs URLs dans ton formulaire, tu vas pas déclarer en SPAM sous pretexte que tu trouves 10 urls…

      Bref, y a pas de magie, moi je sais pas faire. Dans le plugin on a déjà une fonction spécifique et différente pour les petitions et pour les forums.

      Mais sentez vous libres d’inventer une heuristique universelle hein (et vous ferez fortune au passage)

    • hum, ce que j’en disais c’était surtout pour éviter de se retrouver avec 36 fonctions similaires dans 36 plugins différents. Je sais parfaitement qu’il n’existe pas de fonction universelle....

      Pour l’heure, je vais laisser refroidir. Je prendrais ensuite ce qui existe dans nospam, et je verrais ce qui peut ou pas être mutualisé.

    Répondre à ce message

Ajouter un commentaire

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
  • 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 apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom