Jump to content

Manuel:$wgSpamRegex

From mediawiki.org
This page is a translated version of the page Manual:$wgSpamRegex and the translation is 100% complete.
Accès: $wgSpamRegex
Un modèle d'expression régulière qui empêche de sauvegarder la page si son contenu vérife le modèle.
Introduit dans la version :1.2.6
Retiré dans la version :Encore utilisé
Valeurs autorisées :(tableau de chaînes représentant des expressions régulières)
Valeur par défaut :[]

Tout texte ajouté à une page wiki vérifiant cette expression régulière (dénommée regex) sera reconnu en tant que pourriel Wiki et la modification sera bloquée. $wgSpamRegex concerne tous les groupes utilisateur; même les membres des groupes utilisateur des administrateurs système (sysop) et des bureaucrates ne pourront pas enregistrer leur texte si celui-ci vérifie $wgSpamRegex. Utilisez Extension:AbuseFilter pour pouvoir définir les règles et vous permettre également de filtrer par groupe ! $wgSpamRegex est l'une des fonctionnalités anti-abus intégrées les plus efficaces de MediaWiki. Cela n'arrête pas tout vandalisme, mais peut le réduire de manière drastique et presque sans impact négatif sur les utilisateurs légitimes. Les paramètres de configuration de $wgSpamRegex contrôlent la façon dont MediaWiki analyse le texte des contributions et détermine si elles relèvent de pourriel ou pas.

Avertissement Avertissement : si l'expression régulière de votre filtre anti-abus échoue systématiquement, il peut nécessiter plus de mémoire ! Voir #pcre.backtrack_limit

Un exemple conséquent

L'exemple suivant est un bon paramètrage que vous pouvez utiliser sur votre wiki, s'il est de taille moyenne ou petite et s'il fait l'objet d'attaques de pourriels. Insérez ce qui suit dans votre fichier LocalSettings.php  :

 $wgSpamRegex = ["/".                        # barre oblique '/' du conteneur d'ouverture
                "s-e-x|zoofilia|sexyongpin|grusskarte|geburtstagskarten|".
                "(animal|cam|chat|dog|hardcore|lesbian|live|online|voyeur)sex|sex(cam|chat)|adult(chat|live)|".
                "adult(porn|video|web.)|(hardcore|teen|xxx)porn|".
                "live(girl|nude|video)|camgirl|".
                "spycam|casino-online|online-casino|kontaktlinsen|cheapest-phone|".
                "laser-eye|eye-laser|fuelcellmarket|lasikclinic|cragrats|parishilton|".
                "paris-(hilton|tape)|2large|fuel(ing)?-dispenser|huojia|".
                "jinxinghj|telemati[ck]sone|a-mortgage|diamondabrasives|".
                "reuterbrook|sex-(with|plugin|zone)|lazy-stars|eblja|liuhecai|".
                "buy-viagra|-cialis|-levitra|boy-and-girl-kissing|". # mots utilisés dans les pourriels
                "dirare\.com|".           # nom de domaine dirare.com du contrevenant
                "overflow\s*:\s*auto|".   # détecte overflow:auto (avec ou sans espace autour de ':')
                "height\s*:\s*[0-4]px|".  # détecte height:0px (présent dans la plupart des CSS cachés des pourriels) (avec ou sans espace autour de ':')
                "==<center>\[|".          # détecte les pourriels récents de starsearchtool.com et similaires
                "\<\s*a\s*href|".         # bloque entièrement tous les liens href, forçant la syntaxe wiki
                "display\s*:\s*none".     # détecte display:none (avec ou sans espace autour de ':')
                "/i"];                     # barre oblique '/' fermant l'expression régulière et le sélecteur 'i' suivant la rend insensible à la casse
                                          # '\s' détecte les espaces
                                          # '*' est un répéteur (signifiant zéro ou plusieurs fois)
                                          # '\s*' correspond à 0 ou plusieurs espaces

Notez que l'avant-dernière ligne n'a pas de '|' à la fin de la chaîne. Ceci est dû au fait que la ligne suivante termine l'expression régulière avec le conteneur de fermeture '/' suivi du sélecteur 'i'.

Cet exemple intègre certains mots clés communs de pourriels (certains sont issus de la liste noire du pourriel de Meta-Wiki) ainsi que des techniques de blocage contre le pourriel caché dans le CSS.

Utiliser les expressions régulières pour bloquer les pourriels

Voici un tutoriel sur les expressions régulières. Essayez avec la valeur de $wgSpamRegex, et testez quelques modifications sur votre page dans le bac à sable, pour vérifier ce qui provoque un blocage. Mais faites attention, prenez soin d' éviter les faux positifs c'est à dire évitez de détecter à tord des modifications légitimes, voir ci-dessous .

La chaîne utilisée pour l'initialisation de $wgSpamRegex que vous avez faite, est une expression régulière (voir l'article Wikipedia et le manuel PHP sur les expressions régulières). L'exemple ci-dessous montre une expression régulière faite de plusieurs lignes, en utilisant la syntaxe à points de PHP pour concaténer les chaînes. Ceci rend cette longue expression régulière plus compacte mais aussi un peu plus compliquée.

Si vous créez vos propres expressions régulières vous voudrez certainement les essayer séparément dans l'évaluateur d'expression régulière PCRE (cliquer sur le lien).

Exemple simple

Voici un exemple plus simple :

$wgSpamRegex = ["/buy-viagra/"];

Rappelez-vous que l'idée est de décider - Est-ce que c'est du pourriel : oui ou non ? Avec cet exemple, toute contribution textuelle contenant 'buy-viagra' sera reconnue comme étant du pourriel. Les symboles '/' au début et à la fin font partie de la syntaxe des expressions régulières.

Bloquer plusieurs mots ou domaines différents

Essayons d'étendre notre exemple pour capturer d'autres types de pourriels supplémentaires :

$wgSpamRegex = ["/buy-viagra|adultporn|online-casino|dirare\.com|sexcluborgy\.net/"];

En utilisant un symbole '|' entre les mots, l'exemple ci-dessus va détecter plusieurs mots différents concernant le pourriel, et aussi quelques noms de domaine introduits par les contrevenants.

$wgSpamRegex est appliqué à tous les textes de contribution, y compris les URLs des liens de pourriel. Et donc bloquer les noms de domaine peut être une manière très efficace pour se débarasser d'un contrevenant donné.

Evitez les faux positifs !

Le vrai challenge ici est d'éviter les faux positifs et on illustre ceci encore mieux avec un mauvais exemple :

# Ne faites pas cela !
$wgSpamRegex = ["/cialis/"];

Beaucoup de contrevenants aiment parler de 'cialis' (un certain type de drogue. On s'en fout? pas nous!) et donc vous seriez tenté de sélectionner ce mot comme pourriel, mais ceci va également empêcher les utilisateurs d'utiliser le mot 'specialist.' Cette erreur est très facile. Faites attention aux paramètres de votre expression régulière. Vous voulez bloquer les contrevenants sans impacter vos utilisateurs. Ce problème peut être résolu dans de nombreux cas en incluant le modèle de limite de mot \b avant et après tout mot qui pourrait être contenu dans un mot plus grand, par exemple :

# Ceci détecte « cialis » mais pas « specialist »
$wgSpamRegex = ["/\bcialis\b/"];

# Vous pouvez aussi inclure cette option autour d'un groupe de modèles, par exemple :
$wgSpamRegex = ["/\b(cialis|viagra|porn|sex|anal)\b/"];
# Ceci évitera de bannir des mots comme « analysis » ou « Essex » .

Autres conseils concernant les expressions régulières

Les expressions régulières sont très puissantes. $wgSpamRegex est appliqué à l'ensemble du texte de toute la page ou de la section modifiée et pas seulement aux URLs. Il vous permet de bloquer tout ce que vous ne voulez pas voir, si vous trouvez une bonne expression régulière qui corresponde (soyez aussi précis que possible pour éviter les faux positifs). Dans la section suivante relative au pourriel caché dans le CSS nous allons utiliser cet outil.

Message de détection de pourriel

Habituellement lorsque le paramètre $wgSpamRegex détecte du pourriel, le message suivant est affiché  :

La page que vous vouliez enregistrer a été bloquée par le filtre anti-abus. Ceci est probablement causé par un lien vers un site externe appartenant à la liste noire.
Le texte suivant est celui qui a déclenché notre filtre anti-abus :

[mot/nom du domaine bloqué]

Ce texte peut être modifié; il se trouve sur deux pages modifiables du wiki dans l'espace de noms MediaWiki. Cliquez sur 'Pages spéciales' → 'Données et outils : Messages système', entrez 'spampro' dans le champ 'Filtrer par préfixe :' et cliquez sur 'Entrée'. Si vous voyez 'Afficher le source' au lieu de 'Modifier' dans l'onglet supérieur, alors vous n'avez pas le droit de modifier. Vous devez être connecté en tant qu'administrateur système (sysop ou l'utilisateur WikiSysop que vous avez configuré lors de l'installation).

'$1' de MediaWiki:Spamprotectionmatch affiche l'expression régulière concernée par la modification qui a déclenché le filtre anti-abus. Supprimez '$1' si vous voulez la masquer.

Afficher/Masquer le texte compatible

Si vous avez créé une expression régulière trop restrictive, ou si vous avez fait une erreur dans les paramètres, vous pouvez obtenir des faux positifs. En effet, l'exemple complet ci-dessus pourrait correspondre à du texte légitime en de rares circonstances (peut-être que vos utilisateurs veulent vraiment vouloir acheter du Viagra).

En affichant le texte détecté, le message MediaWiki:Spamprotectionmatch aide à réduire les problèmes causés par les faux positifs.

Il permet à vos utilisateurs de vous signaler précisément les problèmes concernant le paramètre $wgSpamRegex.

Cela leur permet également de trouver une solution de contournement, afin qu'ils puissent continuer avec leur modification du wiki.

Malheureusement, c'est aussi une information très utile pour les contrevenants qui visitent votre site. Certains d'entre eux sont des robots automatisés, ils ne verront donc pas ces informations de toute façon, mais de nombreux contrevenants (croyez-le ou non) sont des humains. Ces humains pourraient se donner la peine de regarder les informations correspondantes et essayer de trouver une solution de contournement (par exemple, simplement omettre le nom de domaine que vous avez bloqué, et créer un lien vers divers autres domaines). Il est difficile de savoir à quel point ce type de comportement est répandu, mais si vous vouliez lui rendre la vie plus difficile. Vous pourriez masquer les informations de correspondance du pourriel en définissant simplement votre message MediaWiki:Spamprotectionmatch comme étant vide. Vous ne devez faire ceci que si vous êtes très conscient des points ci-dessus concernant les faux positifs et que vous avez soigneusement conçu votre expression régulière pour les éviter.

Pourriel caché dans le CSS

MediaWiki est assez permissif quant aux balises HTML et aux définitions de styles CSS (voir Aide:HTML dans le wikicode ).

Cela a donné aux contrevenants l'occasion d'inventer une astuce sournoise pour masquer leur pourriel. Il n'apparaît pas sur vos pages, mais il apparaît dans vos zones d'édition, et les modifications apparaissent dans votre affichage des « modifications récentes ». En tant que tel, cela crée la confusion pour vos utilisateurs légitimes, et ceci avant de considérer les conséquences si vous aidez un contrevanant en hébergeant ses liens. Généralement, le pourriel caché dans le CSS est mauvais. Ce n'est pas parce que vous ne pouvez pas le voir (facilement) que vous devez l'ignorer.

Le problème a été identifié par les personnes de chongqed.org en 2005, mais s'est aggravé en 2006, au point où il semble que la plupart des contrevenants de MediaWiki utilisent cette astuce.

Nous pouvons utiliser une expression régulière pour empêcher les astuces CSS qu'ils utilisent. Deux d'entre elles sont incluses dans l'exemple complet ci-dessus (combinées en utilisant le symbole '|') :

Pour bloquer le pourriel caché dans le CSS de la forme <div style="overflow:auto; height:0px;" :

$wgSpamRegex = ["/".
  "overflow\s*:\s*auto|".
  "height\s*:\s*[0-4]px|".
  "/i"];

Pour bloquer le pourriel caché dans le CSS de la forme style="display:none;" :

$wgSpamRegex = ["/style\s*=\s*"\s*display\s*:\s*none\s*"/i"];
     # Which parses as follows:
     # "       = PHP string wrapper
     # /       = RegEx opening wrapper

     # style   = search for the string 'style'
     # \s*=\s* = search for an equals sign with any amount of whitespace (including no whitespace) on either end
     # display = search for the string 'display'
     # \s*:\s* = search for a colon sign with any amount of whitespace (including no whitespace) on either end
     # none\s* = search for the string 'none' followed by any amount of whitespace (including no whitespace)

     # /       = RegEx closing wrapper
     # i       = RegEx switch makes tests case-insensitive
     # "       = PHP string wrapper
     # ;       = PHP line end

Pour une définition un peu plus restrictive vous pouvez interdire simultanément tous les attributs de la balise style :

$wgSpamRegex = ["/\<.*style.*(display|position|overflow|visibility|height)\s*:.*>/i"];

...mais vous pourriez penser que ceci commence à restreindre vos utilisateurs davantage que vous ne l'auriez voulu.

Bloquer TOUS les liens externes

Vous pouvez bloquer tous les liens externes en utilisant l'expression régulière suivante :

# Bloquer TOUS les liens externes
$wgSpamRegex = ["/https?:\/\//"];
$wgSummarySpamRegex = "/https?:\/\//";

Ceci est extrêmement restrictif pour les utilisateurs légitimes du wiki parce qu'ils ne peuvent plus accéder à aucun site externe. C'est une solution pauvre pour un problème de vandalisme bien qu'elle soit marginalement meilleure qu'un blocage complet.

Si vous allez utiliser ceci, assurez-vous que votre page 'MediaWiki:Spamprotectiontext' possède une explication de ce que vous avez fait.

Limiter à 100 le nombre de liens externes

Vous pouvez limiter le nombre total de liens externes autorisés par page à 100 par exemple, avec ceci

# Limiter le nombre total de liens externes autorisés par page (le ? dans *? rend * moins gourmand et est important pour l'efficacité)
$wgSpamRegex = ["/(http:(.|\n)*?){101}/"];

Si vous faites cela, assurez-vous que votre page 'MediaWiki:Spamprotectiontext' possède une explication de ce que vous avez fait.

pcre.backtrack_limit

Avertissement Avertissement : si l'expression régulière de votre filtre anti-abus échoue systématiquement, il peut nécessiter plus de mémoire ! Ou peut-être devrez-vous améliorer votre expression régulière pour qu'elle ne se généralise pas : rendre * non gourmand en ajoutant un ? , ainsi *? peut beaucoup améliorer l'efficacité ! Testez vos propres expressions régulières dans l'évaluateur d'expression régulière PCRE (cliquer sur le lien).

Depuis la version 5.3.7 PHP a pcre.backtrack_limit dont la valeur par défaut est 1000000 (1M). Néanmoins ceci peut encore être trop bas. Essayez d'ajouter la ligne suivante à votre fichier « LocalSettings.php » :

// Traçage des limites mémoire des expressions régulières compatibles Perl
ini_set( 'pcre.backtrack_limit', '2M' );

Si cela n'est pas encore suffisant, vous pouvez augmenter cette limite progressivement jusqu'à ce qu'elle satisfasse les besoins actuels de vos wikis.

Voir aussi