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

  • Après installation de gestion forum - j’ai « Fichier configurer_forum introuvable » pour la config

    sinon deux erreurs dans le squelette(à l’ouverture d’un article - puis passage à l’espace privé)

    Numéro message squelette boucle Ligne
    1 Filtre #URL_DOCUMENT non défini ../plugins/forum/prive/listes/participer_forum_thread.html _doc 36
    2 Filtre #URL_DOCUMENT non défini ../plugins/forum/prive/listes/participer_forum_thread.html _doc2 68

    les mêmes erreurs de non définitions se répercutent aussi dans le squelettes globenews, que j’utilise
    ici : cultureLLe

    Que faut-il définir au juste ?
    Merci et bonne soirée
    Martin

    Répondre à ce message

  • 1

    Bonjour,

    Tout d’abord, merci pour cette contrib.
    Quelques questions, car je ne trouve pas ces infos dans le descriptif ci-dessus :
    -  Y a-t-il des choses à paramétrer une fois le plugin installé ?
    -  Les forums inclus de base (partie publique) sont protégés d’office ?
    -  Le plugin « Gestion Forum » est-il un pré-requis ?
    -  Y a-t-il d’autres plugins qui constituent un pré-requis à celui-ci ?

    D’avance merci,

    Keev

    • Bonsoir à tous,

      Voici le message SPIP que j’obtiens en partie privée depuis l’installation du plugin “forum” dont il est fait référence dans cette page de présentation du plugin NoSPAM.

      1  	Filtre #URL_DOCUMENT non défini	../plugins/forum/prive/listes/participer_forum_thread.html	_doc	36
      2  	Filtre #URL_DOCUMENT non défini	../plugins/forum/prive/listes/participer_forum_thread.html	_doc2	68

      A noter que pour le moment je n’ai aucun message dans aucun forum.
      D’où vient l’erreur ?

      D’avance merci,

      Keev

    Répondre à ce message

  • 3
    equipement

    Bonjour,

    Je constate que NOSPAM n’arrête pas le spam massif.

    J’ai posté plus de 20 messages (contenant chacun plus de 20 liens) en moins d’une heure et ils ont tous été enregistrés dans la table spip_forums.

    J’ai examiné le code de la fonction nospam_pre_edition et le problème provient de la ligne suivante :

    $spammeur_connu = !isset($GLOBALS['visiteur_session']['id_auteur']) AND (sql_countsel('spip_forum','(ip='.sql_quote($GLOBALS['ip'])."$email) AND statut='spam'")>0);

    il suffit de remplacer dans cette ligne ’id_auteur’ par ’statut’ pour résoudre le problème.

    En effet, lorsque l’on poste dans un forum, une session est crée avec en particulier dans le fichier créé dans tmp/session :

    $GLOBALS['visiteur_session']['id_auteur'] = 0;

    aussi comme cette variable globale est initalisée, la fonction isset (qui détermine si une variable est définie et est différente de NULL), renvoie la valeur true.

    • Bien vu, en effet. Je viens de corriger ce bug : http://zone.spip.org/trac/spip-zone/changeset/39933

    • equipement

      Dans ce code de la fonction nospam_pre_edition :

      $spammeur_connu = !isset($GLOBALS['visiteur_session']['statut']) AND (sql_countsel('spip_forum','(ip='.sql_quote($GLOBALS['ip'])."$email) AND statut='spam'")>0);

      il me semble qu’en ajoutant une parenthèse au début et une parenthèse à la fin, cela évite que seul le premier élément du « AND » soit pris en compte.

      $spammeur_connu = ( !isset($GLOBALS['visiteur_session']['statut']) AND (sql_countsel('spip_forum','(ip='.sql_quote($GLOBALS['ip'])."$email) AND statut='spam'")>0) );
    • equipement

      J’ai noté que la version 0.8.3 du plugin corrige ce bug.

    Répondre à ce message

  • 2

    Hello,
    This plagin doesn’t work on my Farsi site. When I active it, I give this error :
    Warning ! Your message needs to be at least ten characters in length.
    The messages that I sent are more than 10 letters.
    I think it was the first version of the plugin, in file nospam_pipelines.php I changed « $texte = trim(preg_replace(’,[\W]+,ims’,’ ’,$texte)) ; » to «  $texte = trim(preg_replace(’,[\W]+,uims’,’ ’,$texte)) ; » and it worked. But after that I upgraded the plugin and I couldn’t find the line in that fine. It is in file nospam.php. But still I have the same problem.

    Répondre à ce message

  • 1
    laurent

    salut a tous

    j’ai un petit soucis avec le plugin « suivi des forum » mentionné ici.
    j’ai cherché la contrib pour y poster le soucis, mais pas moyen de trouver.

    alors je m’en remet a vous.

    lorsque le plugin « suivi des forum » est activé, il n’y a plus possibilité de poster sur le forum d’un article en privé. les commentaires sont enregistrer dans la partie publique seulement.
    c’est peut etre simplement un choix de l’auteur, mais qui nous prive de forum privé sous les articles.

    pouvez vous m’orienter vers la contrib de ce plugin ou faire suivre pour modif.
    le lien vers la zone de ce plugin m’intéresserait aussi.

    merci d’avance.

    Répondre à ce message

  • 1

    Bonjour Cédric

    J’utilise le plugin « formulaire de contact avancé », juste pour confirmation, le formulaire généré par ce plugin est bien à protéger, comme tu le precise plus haut ou fait il parti des formulaire protégés de base ?

    Cordialement

    eric

    • Salut Eric,
      -  Tu crées un répertoire « formulaires » dans ton dossier squelette (s’il n’existe pas).
      -  Tu copies le fichier contact.php (qui se trouve dans le répertoire « formulaires » du plugin) dans ce dossier « formulaires ».
      -  Tu l’édites et tu colles le code ci-après après la ligne 136 je crois ($erreurs['nobot'] = 'Vous êtes un robot. Méchant robot.';)

      Le code :

            //Config pour le plugin NoSpam
            // si nospam est present on traite les spams
            if (include('./plugins/auto/nospam/inc/nospam.php')) //mettre le repertoire du plugin
      	  {
      		  include_spip('inc/texte');
      		  $erreurs['nom'] = 'Erreur pour verif';
      		  $caracteres = compter_caracteres_utiles(_request('texte'));
      		  // moins de 10 caracteres sans les liens = spam !
      		  if ($caracteres < 10){
      				  $erreurs['texte'] = _T('forum_attention_dix_caracteres');
      		  }
      		  // on analyse le sujet
      		  $infos_sujet = analyser_spams(_request('sujet'));
      		  // si un lien dans le sujet = spam !
      		  if ($infos_sujet['nombre_liens'] > 0)
      				  $erreurs['sujet'] = _T('nospam:erreur_spam');
      		  // on analyse le texte
      		  $infos_texte = analyser_spams(_request('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'] = _T('nospam:erreur_spam');
      				  }
      				  // si le texte contient plus de trois lien = spam !
      				  if ($infos_texte['nombre_liens'] >= 3)
      						  $erreurs['texte'] = _T('nospam:erreur_spam');
      		  }
            }
      	//Fin config plugin NoSpam

      Chez moi cela fonctionne.
      Cordialement
      Phil

    Répondre à ce message

  • martin G

    bonjour,
    n’ayant que de très vagues notions en php, je trouve la doc assez sybilline :
    Afin de protéger le formulaire_abonnement du plugin Spip-Listes, j’ai inséré dans mes_options.php les lignes suivantes comme indiqué plus haut :

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

    J’aimerais maintenant suivre la seconde partie des instructions ci-dessus mais le fichier formulaire_abonnement.php ne comporte aucune fonction verifier()

    Où dois-je insérer le code ?

    merci

    Répondre à ce message

  • 5

    Depuis quelques jours, les mails automatiques de spip (suivi éditorial et mail de contact) sont bloqués par mon serveur de messagerie (orange en l’occurrence). ces mails seraient identifiés comme porteur de spam.
    j’ai installé le plugin « nospam » mais ça ne résoud pas le problème.
    Auriez-vous un début de réponse à mon problème ?

    merci beaucoup

    • Le plugin NOSPAM protège ton site des réponses abusives des robots dans les forums.
      Dans ton cas, il s’agit de ton fournisseur internet qui croit que SPIP est un spammeur, c’est donc le contraire.
      Je pense que ton problème sera résolu en configurant un expéditeur pour les mails :
      Menu « Configuration » > « Interactivité », cadre « Envoi de mails automatique » puis « Adresse email d’envoi »

    • Merci.
      Malheureusement, ça ne change rien.

    • Il faudrait savoir sur quel critère ces mails sont identifiés comme spams ...

    • voici le message renvoyé :
      550 spam detected (in reply to end of DATA command)

    • je crois avoir trouvé la solution.

      dans le Menu « Configuration » > « Interactivité », cadre « Envoi de mails automatique » puis « Adresse email d’envoi », j’avais mis l’adresse mail que j’utilise en tant que webmaster. En y faisant figurer une autre adresse mail : tout fonctionne correctement et les mails automatiques ne sont plus bloqués par les fournisseurs internet.

      merci de ton aide

      Si quelqu’un a une explication rationnelle à ce pb, je suis preneur !

    Répondre à ce message

  • 2

    Bonjour et merci pour ce plugin !

    Petite question : est ce que l’activation du plugin protège automatiquement les formulaires générés par le plugin FORMS&TABLES ?

    Merci

    • Le plugin forms&tables intègre d’origine des mécanismes anti-spam qui le rendent peu sensibles à la soumission par robot.

    • merci pour l’info !

    Répondre à ce message

  • 2

    toujours plein de spam asiatiques alors j’ai essayé le plugin Gestion de forums avec le lien indiqué dans l’article mais cela fait planter l’interface :-(

    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