Extension:AbuseFilter/Format des règles

From mediawiki.org
This page is a translated version of the page Extension:AbuseFilter/Rules format and the translation is 99% complete.

Les règles sont un langage personnalisé. Elles sont formatées comme des conditions dans un langage similaire à C/Java/Perl.

Chaînes

Vous pouvez spécifier un littéral en le plaçant entre guillemets simples ou doubles (pour les chaînes), ou en le tapant tel quel (pour les nombres, à la fois en virgule flottante et les entiers). Vous pouvez obtenir des sauts de ligne avec \n, des caractères de tabulation avec \t, et vous pouvez également échapper le caractère apostrophe avec une barre oblique inverse \.

Utilisez le symbole + (plus) pour concaténer deux chaînes littérales ou les valeurs de deux variables avec une valeur de chaîne.

Exemples
"Ceci est une chaîne"
'Ceci est aussi une chaîne'
'Cette chaîne ne devrait pas s\'échouer'
"Cette chaîne\nContient un passage à la ligne"
1234
1.234
-123

Variables définies par l'utilisateur

Vous pouvez définir des variables personnelles pour faciliter la compréhension en utilisant le symbole d'assignation := sur une ligne (fermée par ;) à l'intérieur d'une condition. De telles variables peuvent utiliser des lettres, des caractères souligné _ et des chiffres (sauf le premier caractère) et ne sont pas sensibles à la casse. Exemple (avec w:Special:AbuseFilter/79) :

(
	line1:="(\{\{(r|R)eflist|\{\{(r|R)efs|<references\s?/>|</references\s?>)";
	rcount(line1, removed_lines)
) > (
	rcount(line1, added_lines)
)

Tableaux

AbuseFilter prend en charge les tableaux non associatifs pouvant être utilisés comme dans les exemples suivants.

Attention ! Attention : les expressions telles que page_namespace in [14, 15] peuvent ne pas fonctionner comme vous le souhaitez. Ceci vaut true de même quand page_namespace vaut 1, 4, ou 5. Pour plus d'informations et les contournements possibles, voir T181024.
my_array := [ 5, 6, 7, 10 ];
my_array[0] == 5
length(my_array) == 4
int( my_array ) === 4 // Même chose que la longueur
float( my_array ) === 4.0 // Compte les éléments
string(my_array) == "5\n6\n7\n10\n" // Note: le dernier passage à la ligne pourra être supprimé à l'avenir
5 in my_array == true
'5' in my_array == true
'5\n6' in my_array == true // Note: ceci est dû à la manière dont les tableaux sont castés en chaînes par exemple en leur insérant des sauts de ligne
1 in my_array == true // Note: ceci se produit parce que 'in' caste les arguments en chaînes, donc le 1 est pris dans '10' et retourne true.
my_array[] := 57; // Ceci ajoute un élément à la fin du tableau
my_array === [ 5, 6, 7, 10, 57 ]
my_array[2] := 42; // Et ceci pour modifier un élément du tableau
my_array === [ 5, 6, 42, 10, 57 ]

Commentaires

Vous pouvez écrire des commentaires en utilisant la syntaxe suivante :

/* Ceci est un commentaire */

Arithmétique

Vous pouvez utiliser les symbloles de base de l'arithmétique sur les variables et les littérraux avec la syntaxe suivante :

  • - — Soustraire l'opérande de droite de l'opérande de gauche.
  • + — Ajouter l'opérande de droite à l'opérande de gauche.
  • * — Multiplier l'opérande de gauche par l'opérande de droite.
  • / — Diviser l'opérande de gauche par de l'opérande de droite.
  • ** — Elever l'opérande de gauche à la puissance exponentielle spécifiée par l'opérande de droite.
  • % — Retourner le reste de la division de l'opérande de gauche par l'opérande de droite (opération modulo).

Le type du résultat retourné est le même que celui retourné par PHP, pour lequel vous pouvez trouver beaucoup de documentation en ligne. Vous pouvez voir d'autres exemples plus exhaustifs dans ce test sur l'analyseur syntaxique AF.

Exemple Résultat
1 + 1 2
2 * 2 4
1 / 2 0.5
9 ** 2 81
6 % 5 1

Opérations booléennes

Vous pouvez détecter positivement si et seulement si toutes les conditions d'un ensemble sont vraies, si une condition est vraie parmi plusieurs, ou si une et une seule des conditions est vraie.

  • x | y — OR – retourne true si une ou plusieurs conditions sont vraies.
  • x & y — AND – retourne true si à la fois les deux conditions sont vraies.
  • x ^ y — XOR – retourne true si une et une seule des deux conditions est vraie.
  • !x — NOT – retourne true si la condition n'est pas vraie.

Exemples

Code Résultat
1 | 1 true
1 | 0 true
0 | 0 false
1 & 1 true
1 & 0 false
0 & 0 false
1 ^ 1 false
1 ^ 0 true
0 ^ 0 false
!1 false
!0 true

Comparaisons simples

Vous pouvez comparer des variables avec d'autres variables ou des littéraux en utilisant la syntaxe suivante :

  • <, > — Retourne true si l'opérande de gauche est inférieur à ou plus grand que l'opérateur de droite respectivement. Notez bien : les opérandes sont castés en chaînes et, comme cela se produit en PHP, null < nombre quelconque === true et null > nombre quelconque === false.
  • <=, >= — Retourne true si l'opérande de gauche est inférieur à ou égal à ou plus grand que l'opérande de droite respectivement. Notez bien : les opérandes sont castés en chaînes et, comme cela se produit en PHP, null <= nombre quelconque === true et null >= nombre quelconque === false.
  • == (ou =), != — Retourne true si 'opérande de gauche est égal à ou différent de l'opérande de droite respectivement.
  • ===, !== — Retourne true si l'opérande de gauche est égal à ou différent de l'opérande de droite ET que l'opérande de gauche a le même type de données ou a un type différent de celui de l'opérande de droite respectivement.
Exemple Résultat
1 == 2 false
1 <= 2 true
1 >= 2 false
1 != 2 true
1 < 2 true
1 > 2 false
2 = 2 true
'' == false true
'' === false false
1 == true true
1 === true false
['1','2','3'] == ['1','2','3'] true
[1,2,3] === [1,2,3] true
['1','2','3'] == [1,2,3] true
['1','2','3'] === [1,2,3] false
[1,1,''] == [true, true, false] true
[] == false & [] == null true
['1'] == '1' false[1]

Variables embarquées

Le filtre anti-abus passe par nom diverses variables à l'analyseur syntaxique. Ces variables peuvent être accédées en entrant leur nom, à un endroit destiné à un littéral. Vous pouvez voir les variables associées à chaque requête dans le journal anti-abus.

Variables de AbuseFilter

Variables toujours disponibles

Attention ! Attention : Les variables de l'utilisateur sont toujours disponibles, sauf dans un cas : celui de la création de compte lorsque le créateur n'est pas connecté. Toutes les variables commençant par user_ sont concernées sauf user_type.
Description Nom Type de données Notes
Action action chaîne Une valeur parmi : edit, move, createaccount, autocreateaccount, delete, upload[2], stashupload[3]
Horodatage de la modification timestamp chaîne int(timestamp) vous donne un nombre avec lequel vous pouvez calculer la date, l'heure, le jour de la semaine, etc...
Nom de la base de données du wiki wiki_name chaîne Par exemple, ceci est enwiki sur la Wikipedia anglophone, et itwikiquote sur le Wikiquote italien.
Code de langue du wiki wiki_language chaîne Par exemple ceci vaut en pour la Wikipedia anglophone et it pour le Wikiquote italien. Les wikis multilangue tels que Commons, Meta, et Wikidata rapporteront également en.
Compteur de modifications de l’utilisateur user_editcount entier/nul Nul seulement pour les utilisateurs non enregistrés.
Nom du compte de l’utilisateur (IP in case the user is not registered) user_name chaîne
Pour les actions "createaccount" et "autocreateaccount" , utilisez accountname si vous voulez le nom du compte à créer.
Type du compte utilisateur user_type chaîne Type d'utilisateur, une valeur parmi ip, temp (si l'utilisateur passe par un compte temporaire ), named, external, ou unknown.
Temps depuis la confirmation de l’adresse courriel user_emailconfirm chaîne ou nul Dans le format : AAAAMMJJHHMMSS. Nul si le courriel n'a pas été confirmé.
Âge du compte de l’utilisateur user_age entier En secondes. 0 pour les utilisateurs non enregistrés.
Si l’utilisateur est bloqué user_blocked booléen True pour les utilisateurs enregistrés bloqués. Aussi true pour les modifications faites à partir d'adresses IP bloquées, même si l'éditeur est un utilisateur enregistré qui n'a pas été bloqué. False sinon.
Ceci ne fait pas de différence entre les blocages partiels et les blocages complets.
Groupes (y compris les implicites) dont l’utilisateur est membre user_groups tableau de chaînes voir Special:ListGroupRights
Droits dont dispose l’utilisateur user_rights tableau de chaînes voir Special:ListGroupRights
Identifiant de la page article_articleid entier (obsolète) Utiliser page_id à la place.
Identifiant de la page (peut être vu via le lien "informations sur la page" dans la barre latérale) page_id entier Ceci vaut 0 pour les nouvelles pages, mais ce n'est pas fiable lorsqu'on regarde les anciennes valeurs. Si vous avez besoin du résultat exact pour ces dernières, utilisez page_age == 0 pour identifier la création des nouvelles pages. (notez que ceci est cependant plus lent.) Ce problème a été corrigé sous 9369d08, et fusionné le 11 septembre 2023.
Espace de noms de la page article_namespace entier (obsolète) Utiliser page_namespace à la place.
Espace de noms de la page page_namespace entier fait référence à l'index de l'espace de noms Vérifiez le(s) espace(s) de noms en utilisant des expressions comme "page_namespace == 2" ou "equals_to_any(page_namespace, 1, 3)".
Age de la page (en secondes) page_age entier nombre de secondes depuis la première modification (ou 0 pour les nouvelles pages). Ceci est fiable mais a tendance à être lent ; préférez l'utilisation de page_id si vous n'avez pas besoin de beaucoup de précision.
Titre de la page (sans l’espace de noms) article_text chaîne (obsolète) Utiliser page_title à la place.
Titre de la page (sans l’espace de noms) page_title chaîne
Titre complet de la page article_prefixedtext chaîne (obsolète) Utiliser page_prefixedtitle à la place.
Titre complet de la page page_prefixedtitle chaîne
Modifier le niveau de protection de la page article_restrictions_edit chaîne (obsolète) Utiliser page_restrictions_edit à la place.
Modifier le niveau de protection de la page page_restrictions_edit tableau de chaînes
Renommer le niveau de protection de la page article_restrictions_move chaîne (obsolète) Utiliser page_restrictions_move à la place.
Renommer le niveau de protection de la page page_restrictions_move tableau de chaînes
Protection contre le téléversement du fichier article_restrictions_upload chaîne (obsolète) Utiliser page_restrictions_upload à la place.
Protection contre le téléversement du fichier page_restrictions_upload tableau de chaînes
Protection contre la création de page article_restrictions_create chaîne (obsolète) Utiliser page_restrictions_create à la place.
Protection contre la création de page page_restrictions_create tableau de chaînes
Les dix derniers contributeurs de la page article_recent_contributors array of strings (obsolète) Utiliser page_recent_contributors à la place.
Les dix derniers contributeurs de la page page_recent_contributors tableau de chaînes Ceci tend à ralentir (voir le chapître sur les performances). Essayez de formuler les conditions pour qu'elles rendent généralement false avant celle-ci, pour éviter d'exécuter inutilement la requête. Cette valeur est vide si l'utilisateur est l'unique contributeur de la page(?), et ne vérifie que les 100 dernières révisions.
Premier utilisateur à contribuer à cette page article_first_contributor chaîne (obsolète) Utiliser page_first_contributor à la place.
Premier utilisateur à contribuer à cette page page_first_contributor chaîne Ceci tend à ralentir (voir le chapître sur les performances).[4] Essayez de formuler les conditions pour qu'elles rendent généralement false avant celle-ci, pour éviter d'exécuter inutilement la requête.

Variables disponibles pour certaines actions

Attention ! Attention : Vérifiez toujours que les variables que vous voulez utiliser sont disponibles pour que l'action courante soit filtrée, par exemple en utilisant la variable action. Si vous ne le faites pas (par exemple vous utilisez accountname pour une modification, ou edit_delta pour une suppression) alors tout code qui utilise la variable en question va retourner false.
Les variables d'édition ne sont pas disponibles lors de la vérification d'anciens téléversements. (T345896)
Description Nom Type de données Notes
Résumé / motif des modifications summary chaîne Les résumés créés automatiquement par MediaWiki (Nouvelle section, A vidé la page, etc.) sont créés après que le filtre ait vérifié les modifications, et donc ils ne vont rien détecter actuellement, même si le débogueur indique qu'ils devraient trouver quelque chose. The variable contains whatever the user sees in the edit summary window, which may include MediaWiki preloaded section titles.[5]
Si la modification est marquée comme mineure ou pas (n’est plus utilisé) minor_edit chaîne Désactivé et mis à false pour toutes les entrées entre 2016 et 2018.[6]
Texte wiki de l’ancienne page, avant la modification old_wikitext chaîne Cette variable peut être très grande. Si possible, envisagez l'utilisation de removed_lines pour améliorer les performances.
Wikicode de la page après la modification new_wikitext chaîne Cette variable peut être très grande. Utilisez added_lines si c'est possible afin d'améliorer les performances.
Diff unifié des changements faits lors de la modification edit_diff chaîne
Différence unifiée des changements, transformés dans l’aperçu avant l’enregistrement de la modification edit_diff_pst chaîne Ceci tend à ralentir (voir le chapître sur les performances). Il est probablement plus efficace de vérifier à la fois added_lines et removed_lines.[7]
Nouvelle taille de la page new_size entier
Ancienne taille de la page old_size entier
Différence de taille lors de la modification edit_delta entier
Lignes ajoutées dans l’aperçu avant enregistrement de la modification added_lines_pst tableau de chaînes Utilisez added_lines si c'est possible car c'est plus efficace.
Lignes ajoutées par la modification added_lines tableau de chaînes inclut toutes les lignes dans le diff final qui commencent par +
Lignes supprimées par la modification removed_lines tableau de chaînes
Tous les liens externes dans le nouveau texte all_links tableau de chaînes Ceci tend à être lent (voir la section Performance).
Liens dans la page, avant la modification old_links tableau de chaînes Ceci tend à être lent (voir la section Performance).
Tous les liens externes ajoutés dans la modification added_links tableau de chaînes Ceci tend à ralentir (voir le chapître sur les performances). Essayez de tester added_lines d'abord, puis vérifiez ensuite added_links afin de réduire les ralentissements en traitant un nombre plus petit de modifications à analyser. Ceci suit les règles MediaWiki pour les liens externes . Seuls les liens uniques sont ajoutés au tableau. Modifier un lien sera compté comme un lien ajouté et un lien supprimé.
Tous les liens externes retirés lors de la modification removed_links tableau de chaînes Ceci tend à ralentir (voir le chapître sur les performances). Essayez de tester removed_lines d'abord, puis vérifiez ensuite removed_links afin de réduire les ralentissements en traitant un nombre plus petit de modifications à analyser. Ceci suit les règles MediaWiki pour les liens externes . Seuls les liens uniques sont ajoutés au tableau. Modifier un lien sera compté comme un lien ajouté et un lien supprimé.
Nouveau wikicode de la page, transformé avant enregistrement new_pst chaîne Cette variable peut être très grande.
Code source HTML généré pour la nouvelle version new_html chaîne Cette variable peut être très grande. Si possible, envisagez l'utilisation de added_lines pour améliorer les performances.
Texte de la nouvelle page, nettoyé de tout balisage new_text chaîne Cette variable peut être très grande. Utilisez added_lines si c'est possible afin d'améliorer les performances.
Précédent wikicode de la page, converti en HTML (n’est plus utilisé) old_html chaîne Désactivé pour des raisons de performance.
Texte de l’ancienne page, nettoyé de tout balisage (n’est plus utilisé) old_text chaîne Désactivé pour des raisons de performance.
Time since last page edit (in seconds) page_last_edit_age integer or null null when the page does not exist
Hachage SHA1 du contenu du fichier file_sha1 chaîne [2]
Taille du fichier en octets file_size entier Taille du fichier en octets[2]
Largeur du fichier en pixels file_width entier Largeur en pixels[2]
Hauteur du fichier en pixels file_height entier Hauteur en pixels[2]
Nombre de bits par canal de couleur dans le fichier file_bits_per_channel entier Nombre de bits par canal de couleur[2]
Type MIME du fichier file_mime chaîne Type MIME du fichier.[2]
Type de média pour ce fichier file_mediatype chaîne Type du fichier média.[8][2]
Numéro de la page de destination du renommage moved_to_articleid entier (obsolète) Utiliser moved_to_id à la place.
Numéro de la page de destination du renommage moved_to_id entier
Titre de la page de destination du renommage moved_to_text chaîne (obsolète) Utiliser moved_to_title à la place.
Titre de la page de destination du renommage moved_to_title chaîne
Titre entier de la page de destination du renommage moved_to_prefixedtext chaîne (obsolète) Utiliser moved_to_prefixedtitle à la place.
Titre entier de la page de destination du renommage moved_to_prefixedtitle chaîne
Espace de noms de la page de destination du renommage moved_to_namespace entier
Âge de la page de destination du déplacement (en secondes) moved_to_age entier
Time since last move destination page edit (in seconds) moved_to_last_edit_age integer or null null when the target page does not exist
Modifier le niveau de protection de la page de destination déplacée moved_to_restrictions_edit tableau de chaînes Même chose que page_restrictions_edit, mais pour la cible du déplacement.
Niveau de protection contre le déplacement de la page de destination déplacée moved_to_restrictions_move tableau de chaînes Même chose que page_restrictions_move, mais pour la cible du déplacement.
Niveau de protection contre le téléversement du fichier de destination déplacé moved_to_restrictions_upload tableau de chaînes Même chose que page_restrictions_upload, mais pour la cible du déplacement.
Créer la protection de la page de destination déplacée moved_to_restrictions_create tableau de chaînes Même chose que page_restrictions_create, mais pour la cible du déplacement.
Dix derniers utilisateurs ayant contribué à la page destination déplacée moved_to_recent_contributors tableau de chaînes Même chose que page_recent_contributors, mais pour la cible du déplacement.
Premier utilisateur à contribuer à la page destination déplacée moved_to_first_contributor chaîne Même chose que page_first_contributor, mais pour la cible du déplacement.
Espace de noms de la page d’origine à renommer moved_from_namespace entier
Titre de la page d’origine à renommer moved_from_text chaîne (obsolète) Utiliser moved_from_title à la place.
Titre de la page d’origine à renommer moved_from_title chaîne
Titre entier de la page d’origine à renommer moved_from_prefixedtext chaîne (obsolète) Utiliser moved_from_prefixedtitle à la place.
Titre entier de la page d’origine à renommer moved_from_prefixedtitle chaîne
Identifiant de la page d’origine à renommer moved_from_articleid entier (obsolète) Utiliser moved_from_id à la place.
Identifiant de la page d’origine à renommer moved_from_id entier
Âge de la page source déplacée (en secondes) moved_from_age entier
Time since last move source page edit (in seconds) moved_from_last_edit_age integer
Modifier le niveau de protection de la page source déplacée moved_from_restrictions_edit tableau de chaînes Même chose que page_restrictions_edit, mais pour la page devant être déplacée.
Niveau de protection contre le déplacement de la page source déplacée moved_from_restrictions_move tableau de chaînes Même chose que page_restrictions_move, mais pour la page devant être déplacée.
Niveau de protection contre le téléversement du fichier source déplacé moved_from_restrictions_upload tableau de chaînes Même chose que page_restrictions_upload, mais pour la page devant être déplacée.
Créer la protection de la page source déplacée moved_from_restrictions_create tableau de chaînes Même chose que page_restrictions_create, mais pour la page devant être déplacée.
Dix derniers utilisateurs ayant contribué au déplacement de la page source moved_from_recent_contributors tableau de chaînes Même chose que page_recent_contributors, mais pour la page devant être déplacée.
Premier utilisateur à contribuer à la page source déplacée moved_from_first_contributor chaîne Même chose que page_first_contributor, mais pour la page devant être déplacée.
Nom du compte (lors de la création du compte) accountname chaîne
Modèle de contenu de l'ancienne révision old_content_model chaîne Voir Aide:ChangeContentModel pour l'information concernant les modifications du modèle de contenu
Modèle de contenu de la nouvelle révision new_content_model chaîne Voir Aide:ChangeContentModel pour l'information concernant les modifications du modèle de contenu

Variables des autres extensions

La plupart de ces variables valent toujours false lors de l'examen des modifications passées et peuvent ne pas refléter leur valeur réelle au moment où la modification a été effectuée. Voir T102944.
Description Name Type de données Valeurs Ajouté par
Groupes globaux auxquels appartient l’utilisateur global_user_groups tableau CentralAuth
Nombre global de modifications de l’utilisateur global_user_editcount entier CentralAuth
Groupes globaux auxquels appartient l’utilisateur (sur création de compte) global_account_groups tableau Available only when action is 'createaccount' (then it is always empty) or 'autocreateaccount'. CentralAuth
Nombre global de modifications de l’utilisateur (sur création de compte) global_account_editcount entier Available only when action is 'createaccount' (then it is always zero) or 'autocreateaccount'. CentralAuth
Consommateur OAuth utilisé pour effectuer cette modification oauth_consumer entier OAuth
Identifiant de la page du flux de Discussions structurées board_articleid entier (obsolète) Utiliser board_id à la place. StructuredDiscussions
Identifiant de la page du flux de Discussions structurées board_id entier StructuredDiscussions
Espace de noms du flux de Discussions structurées board_namespace entier fait référence à l'index de l'espace de noms StructuredDiscussions
Titre (sans l’espace de noms) du flux de Discussions structurées board_text chaîne (obsolète) Utiliser board_title à la place. StructuredDiscussions
Titre (sans l’espace de noms) du flux de Discussions structurées board_title chaîne StructuredDiscussions
Titre complet du flux de Discussions structurées board_prefixedtext chaîne (obsolète) Utiliser board_prefixedtitle à la place. StructuredDiscussions
Titre complet du flux de Discussions structurées board_prefixedtitle chaîne StructuredDiscussions
Texte source de l’unité de traduction translate_source_text chaîne Translate
Langue cible pour la traduction translate_target_language chaîne C'est le code de langue, tel que en pour anglais. Translate
Si la modification a été faite via un nœud de sortie de Tor tor_exit_node booléen true si l'action provient d'un noeud de sortie tor. TorBlock
Si un utilisateur est ou non en cours de modification via l’interface mobile user_mobile booléen true pour les utilisateurs mobile, false sinon. MobileFrontend
Si l’utilisateur modifie au moyen d’une application mobile user_app booléen true si l'utilisateur modifie à partir de l'application mobile, false sinon. MobileApp
Pages vues[1] article_views entier (obsolète) Utiliser page_views à la place. HitCounters/fr
Pages vues[2] page_views entier quantité de pages vues HitCounters/fr
Pages source vues[3] moved_from_views entier quantité de pages vues pour la page source HitCounters/fr
Pages cible vues[4] moved_to_views entier quantité de pages vues pour la page cible HitCounters/fr
Si l’adresse IP est bloquée en utilisant la liste de stopforumspam.com[5] sfs_blocked booléen Indique si l'adresse IP est bloquée en utilisant la liste stopforumspam.com StopForumSpam

Notes

Lorsque action='move', seules les variables summary, action, timestamp et user_* sont disponibles. Les variables page_* sont aussi disponibles, mais le préfixe est remplacé par moved_from_ et moved_to_, qui représentent respectivement les valeurs du nom original de l'article et celui de la destination. Par exemple, moved_from_title et moved_to_title au lieu de page_title.

Depuis MediaWiki 1.28 (gerrit:295254), action='upload' n'est utilisé que lorsque vous publiez un téléversement et non plus lorsque vous téléversez dans la zone de préparation (stash). Un nouveau action='stashupload' a été introduit et qui est utilisé pour tous les téléversements, y compris ceux vers la zone de préparation. Ceci a le même comportement qu'avait action='upload', et ne fournit que les variables des métadonnées de fichier (file_*). Les variables relatives aux modifications de la page, y compris summary, new_wikitext et quelques autres, sont maintenant disponibles pour action='upload'. Pour chaque téléversement de fichier, les filtres peuvent être appelés avec action='stashupload' (pour les téléversements vers la zone de préparation), et sont toujours appelés avec action='upload'; ils ne sont pas appelés avec action='edit'.

Les auteurs de filtres doivent utiliser action='stashupload' | action='upload' dans leur code lorsqu'un fichier peut être vérifié en se basant simplement sur son contenu – par exemple, pour rejeter les fichiers de faible résolution – et utiliser action='upload' seulement lorsque les parties de wikicode de la modification doivent être examinées aussi – par exemple, pour rejeter les fichiers qui n'ont pas de description. Ceci va autoriser les outils qui séparent le téléversement des fichiers de leur publication (par exemple UploadWizard ou le dialogue du téléversement) pour informer les utilisateurs de l'échec avant qu'ils ne passent leur temps à remplir les détails du téléversement.

Performances

Comme indiqué dans la table ci-dessus, certaines de ces variables peuvent être très lentes. Lorsque vous codez des filtres, rappelez-vous que la condition aux limites n'est pas une bonne métrique de l'importance des filtres. Par exemple, les variables comme *_recent_contributors ou *_links ont toujours besoin de construire une requête à la base de données, tandis que les variables *_pst devront faire l'analyse syntaxique du texte, qui est encore une opération lourde; toutes ces variables doivent être utilisées très, très soigneusement. Par exemple, sur la Wikipedia italienne on a vu que, avec 135 filtres actifs et une moyenne de 450 conditions utilisées, le temps d'exécution des filtres était d'environ 500ms, avec des pointes jusqu'à 15 secondes. En supprimant la variable added_links d'un filtre unique, et réduisant de moitié les cas où un autre filtre utiliserait added_lines_pst on ramène le temps moyen d'exécution à 50 ms. Plus particulièrement :

  • Utilisez les variables _links lorsque vous avez besoin d'une grande précision et vérifier « http://... » dans les autres variables (par exemple, added_lines) peut conduire à de lourds dysfonctionnements;
  • Utiliser les variables _pst lorsque vous êtes réellement sûr que les variables non-PST ne sont pas assez suffisantes. Vous pouvez aussi décider conditionnellement ce qui sera à vérifier : si par exemple vous voulez examiner une signature, vérifiez d'abord si added_lines contient ~~~;
  • En général, quand vous utilisez ces variables, il est toujours mieux d'exécuter les autres conditions en évitant de calculer des éléments très lourds. Afin de réaliser cela, placez toujours les variables conséquentes dans les dernières conditions.

Enfin notez que dès qu'une variable est évaluée pour un filtre donné, elle est sauvegardée et les autres filtres peuvent immédiatement récupérer sa valeur. Cela signifie qu'un filtre unique qui évalue cette variable représente plus ou moins plusieurs dizaines de filtres qui l'utilisent.

Mots-clés

Lorsque cela n'est pas précisé, les mot-clés castent les opérandes en chaînes

Les moys-clés spéciaux suivants sont inclus pour les fonctionnalités souvent utilisées :

  • like (ou matches) retourne true si l'opérande de gauche correspond au modèle global de l'opérande de droite.
  • in retourne true si l'opérande de droite (une chaîne) contient l'opérande de gauche. Note : les chaînes vides ne sont pas contenues dans, ni ne contiennent, tout autre chaîne (même pas la chaîne vide elle même).
  • contains fonctionne comme in, mais en permutant les opérandes gauche et droit. Note : les chaînes vides ne sont pas contenues dans, ni ne contiennent, tout autre chaîne (même pas la chaîne vide elle même).
  • rlike (ou regex) et irlike retournent true si l'opérande de gauche correspond (contient) le modèle regex dans l'opérande de droite (irlike pour le cas insensible à la casse).
    • Le système utilise les PCRE (Perl Compatible Regular Expressions).
    • La seule option PCRE autorisée est PCRE_UTF8 (modificateur u en PHP); pour irlike, à la fois PCRE_CASELESS et PCRE_UTF8 sont activés (modificateur iu).
  • if ... then ... end
  • if ... then ... else ... end
  • ... ? ... : ...
  • true, false, null

Exemples

Code Résultat Commentaire
"1234" like "12?4" True
"1234" like "12*" True
"foo" in "foobar" True
"foobar" contains "foo" True
"o" in ["foo", "bar"] True A cause du cast de la chaîne
"foo" regex "\w+" True
"a\b" regex "a\\\\b" True Pour chercher le caractère d'échappement barre oblique arrière '\' en utilisant une expression régulière il vous faudra utiliser soit quatre barres obliques ou deux \x5C. (Sinon cela fonctionne bien.)
"a\b" regex "a\x5C\x5Cb" True

Fonctions

Un nombre de fonctions embarquées est inclus pour faciliter quelques problèmes communs. Ils sont exécutés dans le format général functionName( arg1, arg2, arg3 ), et peuvent être utilisés à la place de n'importe quel littéral ou variable. Ses arguments peuvent être passés en tant que littéraux, variables, ou même d'autres fonctions.

nom description
lcase Retourne l'argument converti en minuscules.
ucase Retourne l'argument converti en majuscules.
length Retourne la longueur de la chaîne passée en argument. Si l'argument est un tableau, retourne son nombre d'éléments.
string Cast en type de donnée chaîne. Si l'argument est un tableau, insère des caractères de saut de ligne.
int Cast des données en type entier.
float Cast en type de donnée à virgule flottante.
bool Cast en type de donnée booléenne.
norm Equivalent à rmwhitespace(rmspecials(rmdoubles(ccnorm(arg1)))).
ccnorm Normalise les caractères confondables ou similaires de l'argument, et retourne une forme canonique. Vous pouvez trouver sous Git une liste des caractères et de leurs remplacements, par exemple ccnorm( "Eeèéëēĕėęě3ƐƷ" ) === "EEEEEEEEEEEEE".[9] La sortie de cette fonction est toujours en majuscules. Bien qu'elle ne soit pas coûteuse, cette fonction n'en est pas pour autant moins chère car elle peut ralentir les filtres quand elle est appelée plusieurs fois.
ccnorm_contains_any Normalise les caractères confondables ou similaires des arguments, et retourne true si la première chaîne contient n'importe quelle chaîne des arguments suivants (nombre illimité d'arguments reliés par des conditions logiques OR). Vous pouvez trouver sous Git une liste des caractères et de leurs remplacements. En raison de l'utilisation de ccnorm, cette fonction peut être lente si on lui passe trop d'arguments.
ccnorm_contains_all Normalise les caractères confondables ou similaires des arguments, et retourne true si la première chaîne contient chacune des chaînes des arguments suivants (nombre illimité d'arguments reliés par des conditions logiques ET). Vous pouvez trouver sous Git une liste des caractères et de leurs remplacements. En raison de l'utilisation de ccnorm, cette fonction peut être lente si on lui passe trop d'arguments.
specialratio Retourne le nombre de caractères non alphanumériques divisé par le nombre total de caractères dans l'argument.
rmspecials Supprime les caractères spéciaux présents dans l'argument et retourne le résultat. Ne supprime pas les espaces blancs. (Equivalent à s/[^\p{L}\p{N}\s]//g.)
rmdoubles Supprime les caractères répétés de l'argument et retourne le résultat.
rmwhitespace Supprime les espaces (caractères espace, tabulations, passages à la ligne).
count Retourne le nombre de fois que l'aiguille (première chaîne) apparaît dans le foin (seconde chaîne). Si un argument est fourni, fragmentez-le à l'aide de virgules et retournez le nombre de segments trouvés.
rcount Similaire à count mais l'aiguille utilise une expression régulière à la place. Peut être rendu indépendant de la casse si on préfixe l'expression régulière avec (?i). Remarquez que pour des chaînes simples, cette fonction est en gros cinquante fois plus lente que count[10] ; utilisez donc cette dernière lorsque c'est possible.
get_matches MW 1.31+ Cherche la correspondance entre l'aiguille de l'expression régulière (première chaîne) dans le foin (seconde chaîne). Retourne un tableau où l'élément 0 est la détection complète, et chaque élément [n] est la correspondance entre le nième groupe de capture de l'aiguille. Peut être rendu indépendant de la casse si on préfixe l'expression régulière avec (?i). Si un groupe de capture ne correspond pas, la position correspondante dans le tableau aura la valeur false.
ip_in_range Renvoie true si l'adresse IP (première chaîne) se trouve dans l'intervalle des adresses IP (seconde chaîne, éventuellement en notation CIDR, ou en notation explicite comme « 1.1.1.1-2.2.2.2 », ou comme unique adresse IP). Ne fonctionne qu'avec les utilisateurs anonymes. Prend en charge à la fois les adresses IPv4 et IPv6.
ip_in_ranges Renvoie true si l'adresse IP de l'utilisateur (première chaîne) se trouve dans l'intervalle des adresses IP spécifiées (chaîne suivante en appliquant un OU logique, pouvant être en notation CIDR, en notation explicite comme « 1.1.1.1-2.2.2.2 », ou comme unique adresse IP). Ne fonctionne qu'avec les utilisateurs anonymes. Prend en charge les adresses IPv4 et IPv6.
contains_any Retourne true si la première chaîne contient n'importe quelle chaîne des arguements suivants (nombre illimité d'arguments reliés par des conditions logiques OR). Si le premier argument est un tableau, il est casté en une chaîne.
contains_all Retourne true si la première chaîne contient chacune des chaînes des arguments suivants (nombre illimité d'arguments reliés par des conditions logiques AND). Si le premier argument est un tableau, il est casté en une chaîne.
equals_to_any Retourne true si le premier argument est identique (===) à l'un quelconque des arguments qui suivent (nombre illimité d'arguments). Fonctionnellement equals_to_any(a, b, c) est la même chose que a===b | a===c, mais plus compacte et il sauvegarde les conditions.
substr Retourne la portion de la première chaîne, à partir de l'index donné dans le second argument (commençant à 0) et de la longueur maximale donnée par le troisième argument (optionnel).
strlen Même chose que length.
strpos Retourne la position numérique de la première occurence de l'aiguille (seconde chaîne) dans le foin (première chaîne), en commençant à l'index donné par le troisième argument (optionnel, défaut à 0). Cette fonction peut rentourner 0 si l'aiguille est trouvée au début de foin, et donc elle peut être mal interprétée par la valeur false avec d'autres opérateurs de comparaison. La meilleur manière est d'utiliser === ou !== pour tester s'il a été trouvé. Differently from PHP's strpos(), which returns false when the needle is not found, this function returns -1 when the needle is not found.
str_replace Remplace toutes les occurences de la chaîne recherchée, avec la chaîne de remplacement. La fonction utilise trois arguments dans l'ordre suivante : le texte dans lequel la recherche doit être faite, le texte à trouver, et le rexte de remplacement.
str_replace_regexp Remplace toutes les occurrences de la chaîne de recherche par la chaîne de remplacement en utilisant des expressions régulières. La fonction prend 3 arguments dans l'ordre suivant : texte sur lequel effectuer la recherche, expression régulière à appliquer, expression de remplacement.
rescape Retourne l'argument avec quelques caractères précédés du caractère d'échappement "\", de sorte que la chaîne puisse être utilisée dans une expression régulière sans que ces caractères spéciaux n'aient de signification particulière.
set Initialise une variable (première chaîne) avec une valeur donnée (second argument) pour une utilisation ultérieure dans le filtre. Autre syntaxe : name := value.
set_var Même chose que set.

Exemples

Code Résultat Commentaire
length( "Wikipedia" ) 9
lcase( "WikiPedia" ) wikipedia
ccnorm( "w1k1p3d14" ) WIKIPEDIA La sortie de ccnorm est toujours en majuscules
ccnorm( "ωɨƙɩᑭƐƉ1α" ) WIKIPEDIA
ccnorm_contains_any( "w1k1p3d14", "wiKiP3D1A", "foo", "bar" ) true
ccnorm_contains_any( "w1k1p3d14", "foo", "bar", "baz" ) false
ccnorm_contains_any( "w1k1p3d14 is 4w3s0me", "bar", "baz", "some" ) true
ccnorm( "ìíîïĩїį!ľ₤ĺľḷĿ" ) IIIIIII!LLLLLL
norm( "!!ω..ɨ..ƙ..ɩ..ᑭᑭ..Ɛ.Ɖ@@1%%α!!" ) WIKIPEDAIA
norm( "F00 B@rr" ) FOBAR norm supprime les espaces, les caractères spéciaux et les doublons, puis utilise ccnorm
rmdoubles( "foobybboo" ) fobybo
specialratio( "Wikipedia!" ) 0.1
count( "foo", "foofooboofoo" ) 3
count( "foo,bar,baz" ) 3
rmspecials( "FOOBAR!!1" ) FOOBAR1
rescape( "abc* (def)" ) abc\* \(def\)
str_replace( "foobarbaz", "bar", "-" ) foo-baz
str_replace_regexp( "foobarbaz", "(.)a(.)", "$2a$1" ) foorabzab
ip_in_range( "127.0.10.0", "127.0.0.0/12" ) true
ip_in_ranges( "127.0.10.0", "10.0.0.0/8", "127.0.0.0/12" ) true
contains_any( "foobar", "x", "y", "f" ) true
get_matches( "(foo?ba+r) is (so+ good)", "fobaaar is soooo good to eat" ) ['fobaaar is soooo good', 'fobaaar', 'soooo good']

Ordre des opérations

Les opérations sont généralement faites de gauche à droite mais il existe un ordre dans lequel elles sont résolues. Dès que le filtre évalue une condition qui sort en échec, il arrête l'analyse des autres conditions restantes (à cause de l'évaluation en court-circuit) et passe à l'analyse du filtre suivant. L'ordre d'évaluation est :

  1. Tout ce qui est entouré de parenthèses (( et )) est évalué comme une seule unité.
  2. En remplaçant les variables et le littéraux par leur données respectives. (par exmple page_namespace par 0)
  3. Appels de fonctions (norm, lcase, etc.)
  4. + et - unaire (définissant une valeur positive ou negative, par exemple -1234, +1234)
  5. Mots-clés (in, rlike, etc.)
  6. Inversion booléenne (!x)
  7. Exponentiation (2**3 → 8)
  8. Relatif aux multiplications (multiplication, division, modulo)
  9. Addition et soustraction (3-2 → 1)
  10. Comparaisons. (<, >, ==)
  11. Opérations booléennes. (&, |, ^)
  12. Opérateur ternaire (... ? ... : ...)
  13. Attributions (:=)

Exemples

  • A & B | C est équivalent à (A & B) | C, mais non pas à A & (B | C). En particulier, à la fois false & true | true et false & false | true valent true.
  • A | B & C est équivalent à (A | B) & C, mais pas à A | (B & C). En particulier, à la fois true | true & false et true | false & false valent false.
  • added_lines rlike "foo" + "|bar" est incorrect, utilisez added_lines rlike ("foo" + "|bar") à la place.

Comptage des conditions

La condition limite est (plus ou moins) le suivi du nombre d'opérateurs de comparaison + le nombre d'appels de fonctions dans lesquelles on est entré.

Vous trouverez d'autres explications concernant la manière de réduire les conditions utilisées sur Extension:AbuseFilter/Conditions .

Exclusions

Bien que la fonction d'analyse de AbuseFilter identifie les actions de restitution (rollback) comme des modifications, AbuseFilter n'évaluera pas les restitutions pour les filtrer.[11]

Liens utiles

Notes

  1. Comparer des tableaux d'un autre type va toujours retourner false, sauf pour l'exemple ci-dessus
  2. 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Les seules variables actuellement disponibles pour les téléversements (action='upload') sont user_*, page_*, file_sha1, file_size, file_mime, file_mediatype, file_width, file_height, file_bits_per_channel (les cinq dernières n'ont été ajoutées que depuis la version MediaWiki 1.27 gerrit:281503). Toutes les variables file_* sont indisponibles pour d'autres actions (y compris action='edit').
  3. Depuis MediaWiki 1.28 (gerrit:295254)
  4. Plusieurs filtres (12) qui utilisent cette variable sont indiqués dans le tableau de bord AbuseFilterSlow Grafana (nécessite un accès logstash pour les voir). Le fait de déplacer cette variable vers la fin du filtre semble aider.
  5. Voir phabricator:T191722
  6. Obsolète avec cette validation et désactivé avec celle-ci.
  7. Plusieurs filtres qui utilisent cette variable sont indiqués dans le tableau de bord AbuseFilterSlow Grafana (exemple, nécessite un accès logstash pour les voir). Par exemple, au lieu d'utiliser "text" in edit_diff_pst (ou même edit_diff), envisagez quelque chose comme "text" in added_lines & !("text" in removed_lines)
  8. Voir le code source pour une liste des types.
  9. Faites attention à phab:T27619. Vous pouvez utiliser Special:AbuseFilter/tools pour évaluer ccnorm( "your string" ) et voir quels caractères ont été transformés.
  10. https://3v4l.org/S6IGP
  11. T24713 - retour en arrière non détecté par AF