Extension:AbuseFilter/Format des règles
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 : | 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 – retournetrue
si une ou plusieurs conditions sont vraies.x & y
— AND – retournetrue
si à la fois les deux conditions sont vraies.x ^ y
— XOR – retournetrue
si une et une seule des deux conditions est vraie.!x
— NOT – retournetrue
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 :
<
,>
– Retournetrue
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
etnull > nombre quelconque === false
.<=
,>=
– Retournetrue
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
etnull >= nombre quelconque === false
.==
(ou=
),!=
— Retournetrue
si 'opérande de gauche est égal à ou différent de l'opérande de droite respectivement.===
,!==
– Retournetrue
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
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 ($1) | wiki_name |
chaîne | Par exemple, ceci est enwiki sur la Wikipedia anglophone, et itwikiquote sur le Wikiquote italien. | ||
Code de langue du wiki ($1) | 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 ($1) | user_editcount |
entier/nul | Nul seulement pour les utilisateurs non enregistrés. | ||
Nom du compte de l’utilisateur ($1) (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 ($1) | 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 ($1) | 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 ($1) | user_age |
entier | En secondes. 0 pour les utilisateurs non enregistrés. | ||
Si l’utilisateur est bloqué ($1) | 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 dans ($1) | user_groups |
tableau de chaînes | voir Special:ListGroupRights | ||
Droits dont dispose l’utilisateur ($1) | user_rights |
tableau de chaînes | voir Special:ListGroupRights | ||
Identifiant de la page ($1) | article_articleid |
entier | (obsolète) Utiliser page_id à la place.
| ||
Identifiant de la page ($1) (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 ($1) | article_namespace |
entier | (obsolète) Utiliser page_namespace à la place.
| ||
Espace de noms de la page ($1) | 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 ($1) | 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 ($1) | article_text |
chaîne | (obsolète) Utiliser page_title à la place.
| ||
Titre de la page sans l’espace de noms ($1) | page_title |
chaîne | |||
Titre complet de la page ($1) | article_prefixedtext |
chaîne | (obsolète) Utiliser page_prefixedtitle à la place.
| ||
Titre complet de la page ($1) | page_prefixedtitle |
chaîne | |||
Niveau de protection contre la modification de la page ($1) | article_restrictions_edit |
chaîne | (obsolète) Utiliser page_restrictions_edit à la place.
| ||
Niveau de protection contre la modification de la page ($1) | page_restrictions_edit |
tableau de chaînes | |||
Niveau de protection contre le déplacement de la page ($1) | article_restrictions_move |
chaîne | (obsolète) Utiliser page_restrictions_move à la place.
| ||
Niveau de protection contre le déplacement de la page ($1) | page_restrictions_move |
tableau de chaînes | |||
Protection contre le téléversement du fichier ($1) | article_restrictions_upload |
chaîne | (obsolète) Utiliser page_restrictions_upload à la place.
| ||
Protection contre le téléversement du fichier ($1) | page_restrictions_upload |
tableau de chaînes | |||
Protection contre la création de la page ($1) | article_restrictions_create |
chaîne | (obsolète) Utiliser page_restrictions_create à la place.
| ||
Protection contre la création de la page ($1) | page_restrictions_create |
tableau de chaînes | |||
Les dix derniers contributeurs de la page ($1) | article_recent_contributors |
array of strings | (obsolète) Utiliser page_recent_contributors à la place.
| ||
Les dix derniers contributeurs de la page ($1) | 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 ou première utilisatrice à contribuer à cette page ($1) | article_first_contributor |
chaîne | (obsolète) Utiliser page_first_contributor à la place.
| ||
Premier utilisateur ou première utilisatrice à contribuer à cette page ($1) | 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
Description | Nom | Type de données | Notes |
---|---|---|---|
Résumé / motif des modifications ($1) | 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] |
minor_edit |
Désactivé et mis à false pour toutes les entrées entre 2016 et 2018.[6]
| ||
Texte wiki de l’ancienne page, avant la modification ($1) | 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 ($1) | 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 ($1) | edit_diff |
chaîne | |
Diff unifié des changements, incluant les transformations avant enregistrement ($1) | 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 ($1) | new_size |
entier | |
Ancienne taille de la page ($1) | old_size |
entier | |
Différence de taille lors de la modification ($1) | edit_delta |
entier | |
Lignes ajoutées, incluant les transformations avant enregistrement ($1) | 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 ($1) | added_lines |
tableau de chaînes | inclut toutes les lignes dans le diff final qui commencent par + |
Lignes supprimées par la modification ($1) | removed_lines |
tableau de chaînes | |
Tous les liens externes dans le nouveau texte ($1) | all_links |
tableau de chaînes | Ceci tend à être lent (voir la section Performance). |
Liens dans la page, avant la modification ($1) | old_links |
tableau de chaînes | Ceci tend à être lent (voir la section Performance). |
Tous les liens externes ajoutés dans la modification ($1) | 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 ($1) | 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, incluant les transformations avant enregistrement ($1) | new_pst |
chaîne | Cette variable peut être très grande. |
Code source HTML généré pour la nouvelle version ($1) | new_html |
chaîne | Cette variable peut être très grande. Si possible, envisagez l'utilisation de added_lines pour améliorer les performances.
|
Nouveau texte de la page, nettoyé de tout balisage ($1) | new_text |
chaîne | Cette variable peut être très grande. Utilisez added_lines si c'est possible afin d'améliorer les performances.
|
old_html |
Désactivé pour des raisons de performance. | ||
old_text |
Désactivé pour des raisons de performance. | ||
Temps depuis la dernière modification en secondes ($1) | page_last_edit_age |
entier ou null |
null when the page does not exist
|
Hachage SHA1 du contenu du fichier ($1) | file_sha1 |
chaîne | [2] |
Taille du fichier en octets ($1) | file_size |
entier | Taille du fichier en octets[2] |
Largeur du fichier en pixels ($1) | file_width |
entier | Largeur en pixels[2] |
Hauteur du fichier en pixels ($1) | file_height |
entier | Hauteur en pixels[2] |
Nombre de bits par canal de couleur dans le fichier ($1) | file_bits_per_channel |
entier | Nombre de bits par canal de couleur[2] |
Type MIME du fichier ($1) | file_mime |
chaîne | Type MIME du fichier.[2] |
Type de média pour ce fichier ($1) | file_mediatype |
chaîne | Type du fichier média.[8][2] |
Identifiant de la page de destination du renommage ($1) | moved_to_articleid |
entier | (obsolète) Utiliser moved_to_id à la place.
|
Identifiant de la page de destination du renommage ($1) | moved_to_id |
entier | |
Titre de la page de destination du renommage ($1) | moved_to_text |
chaîne | (obsolète) Utiliser moved_to_title à la place.
|
Titre de la page de destination du renommage ($1) | moved_to_title |
chaîne | |
Titre entier de la page de destination du renommage ($1) | moved_to_prefixedtext |
chaîne | (obsolète) Utiliser moved_to_prefixedtitle à la place.
|
Titre entier de la page de destination du renommage ($1) | moved_to_prefixedtitle |
chaîne | |
Espace de noms de la page de destination du renommage ($1) | moved_to_namespace |
entier | |
Âge de la page de destination du déplacement en secondes ($1) | moved_to_age |
entier | |
Temps depuis la dernière modification de la page destination du renommage en secondes ($1) | moved_to_last_edit_age
|
integer or null |
null when the target page does not exist
|
Niveau de protection de la page de destination du déplacement ($1) | 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 du déplacement ($1) | 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 du déplacement ($1) | moved_to_restrictions_upload |
tableau de chaînes | Même chose que page_restrictions_upload , mais pour la cible du déplacement.
|
Protection contre la création de la page de destination du déplacement ($1) | 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 de destination du déplacement ($1) | moved_to_recent_contributors |
tableau de chaînes | Même chose que page_recent_contributors , mais pour la cible du déplacement.
|
Premier utilisateur ou première utilisatrice à contribuer à la page de destination du déplacement ($1) | 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 ($1) | moved_from_namespace |
entier | |
Titre de la page d’origine à renommer ($1) | moved_from_text |
chaîne | (obsolète) Utiliser moved_from_title à la place.
|
Titre de la page d’origine à renommer ($1) | moved_from_title |
chaîne | |
Titre entier de la page d’origine à renommer ($1) | moved_from_prefixedtext |
chaîne | (obsolète) Utiliser moved_from_prefixedtitle à la place.
|
Titre entier de la page d’origine à renommer ($1) | moved_from_prefixedtitle |
chaîne | |
Identifiant de la page d’origine à renommer ($1) | moved_from_articleid |
entier | (obsolète) Utiliser moved_from_id à la place.
|
Identifiant de la page d’origine à renommer ($1) | moved_from_id |
entier | |
Âge de la page source déplacée en secondes ($1) | moved_from_age |
entier | |
Temps depuis la dernière modification de la page source du renommage en secondes ($1) | moved_from_last_edit_age |
integer | |
Niveau de protection contre la modification de la page source du déplacement ($1) | 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 ($1) | 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 du téléversement du fichier source du déplacement ($1) | moved_from_restrictions_upload |
tableau de chaînes | Même chose que page_restrictions_upload , mais pour la page devant être déplacée.
|
Protection contre la création de la page source du déplacement ($1) | 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é à la page source du déplacement ($1) | 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 ou première utilisatrice à contribuer à la page source du déplacement ($1) | 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) ($1) | 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 protégées
A variable can be considered protected. For instance, on wikis with temporary accounts enabled, IPs are considered PII and access to them must be restricted.
Protected variables and filters that use them are only accessible to maintainers with the abusefilter-access-protected-vars
right.
Using a protected variable flags the filter as protected as well.
The filter subsequently cannot be unprotected, even if it no longer actively uses a protected variable, as its historical logs will remain available.
Logs generated by protected filters can only be viewed by users with the abusefilter-protected-vars-log
right.
The default protected variables are defined in AbuseFilterProtectedVariables
in extension.json
.
user_unnamed_ip
is null
when examining past edits.Description | Nom | Type de donnée | Notes |
---|---|---|---|
IP du compte utilisateur (pour les utilisateurs déconnectés et les comptes temporaires uniquement) ($1) | user_unnamed_ip
|
Chaîne de caractères | User IP for anonymous users/temporary accounts This returns
null for registered users. |
Variables des autres extensions
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 ($1) | global_user_groups
|
tableau | CentralAuth | |
Nombre global de modifications de l’utilisateur ($1) | global_user_editcount
|
entier | CentralAuth | |
Groupes globaux auxquels appartient l’utilisateur (sur création de compte) ($1) | 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) ($1) | 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 ($1) | oauth_consumer
|
entier | OAuth | |
Identifiant de la page du flux de Discussions structurées ($1) | board_articleid
|
entier | (obsolète) Utiliser board_id à la place.
|
StructuredDiscussions |
Identifiant de la page du flux de Discussions structurées ($1) | board_id
|
entier | StructuredDiscussions | |
Espace de noms du flux de Discussions structurées ($1) | 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 ($1) | board_text
|
chaîne | (obsolète) Utiliser board_title à la place.
|
StructuredDiscussions |
Titre (sans l’espace de noms) du flux de Discussions structurées ($1) | board_title
|
chaîne | StructuredDiscussions | |
Titre complet du flux de Discussions structurées ($1) | board_prefixedtext
|
chaîne | (obsolète) Utiliser board_prefixedtitle à la place.
|
StructuredDiscussions |
Titre complet du flux de Discussions structurées ($1) | 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 ($1) | 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 ($1) | user_mobile
|
booléen | true pour les utilisateurs mobile, false sinon.
|
MobileFrontend |
Si l’utilisateur modifie à partir de l'appli mobile ($1) | 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 siadded_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
Les moys-clés spéciaux suivants sont inclus pour les fonctionnalités souvent utilisées :
like
(oumatches
) retournetrue
si l'opérande de gauche correspond au modèle global de l'opérande de droite.in
retournetrue
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 commein
, 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
(ouregex
) etirlike
retournenttrue
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).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 :
- Tout ce qui est entouré de parenthèses (
(
et)
) est évalué comme une seule unité. - En remplaçant les variables et le littéraux par leur données respectives. (par exmple
page_namespace
par0
) - Appels de fonctions (
norm
,lcase
, etc.) +
et-
unaire (définissant une valeur positive ou negative, par exemple-1234
,+1234
)- Mots-clés (
in
,rlike
, etc.) - Inversion booléenne (
!x
) - Exponentiation (
2**3 → 8
) - Relatif aux multiplications (multiplication, division, modulo)
- Addition et soustraction (
3-2 → 1
) - Comparaisons. (
<
,>
,==
) - Opérations booléennes. (
&
,|
,^
) - Opérateur ternaire (
... ? ... : ...
) - Attributions (
:=
)
Exemples
A & B | C
est équivalent à(A & B) | C
, mais non pas àA & (B | C)
. En particulier, à la foisfalse & true | true
etfalse & false | true
valenttrue
.A | B & C
est équivalent à(A | B) & C
, mais pas àA | (B & C)
. En particulier, à la foistrue | true & false
ettrue | false & false
valentfalse
.added_lines rlike "foo" + "|bar"
est incorrect, utilisezadded_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
- syntaxe des modèles PCRE (Perl Compatible Regular Expressions)
- Modifier les filtres d'intérêt inter-wiki
- Extension:AbuseFilter/Conditions
Notes
- ↑ Comparer des tableaux d'un autre type va toujours retourner
false
, sauf pour l'exemple ci-dessus - ↑ 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').
- ↑ Depuis MediaWiki 1.28 (gerrit:295254)
- ↑ 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.
- ↑ Voir phabricator:T191722
- ↑ Obsolète avec cette validation et désactivé avec celle-ci.
- ↑ 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êmeedit_diff
), envisagez quelque chose comme"text" in added_lines & !("text" in removed_lines)
- ↑ Voir le code source pour une liste des types.
- ↑ Faites attention à phab:T27619. Vous pouvez utiliser Special:AbuseFilter/tools pour évaluer
ccnorm( "your string" )
et voir quels caractères ont été transformés. - ↑ https://3v4l.org/S6IGP
- ↑ T24713 - retour en arrière non détecté par AF