Jump to content

Extension:AbuseFilter/Rules format

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

Pravidla jsou vlastní jazyk. Jsou formátovány podobně jako podmíněné podmínky v jazyce podobném C/Java/Perlu.

Řetězce

Literál můžete zadat tak, že jej umístíte do jednoduchých nebo dvojitých uvozovek (pro řetězce), nebo jej napíšete tak, jak je (pro čísla s plovoucí desetinnou čárkou i celé číslo). Můžete získat zalomení řádků s \n, znaky tabulátoru s \t a znak uvozovky můžete také escapovat zpětným lomítkem.

Pomocí symbolu + (plus) zřetězí dva znakové řetězce nebo hodnoty dvou proměnných s řetězcem hodnoty.

Příklady
"Toto je řetězec"
'Toto je také řetězec'
'Tento řetězec by neměl\t selhat'
"Tento řetězec\nMá zalomení řádku"
1234
1.234
-123

Uživatelsky definované proměnné

Pro snazší pochopení můžete definovat vlastní proměnné pomocí přiřazovacího symbolu := v řádku (uzavřeném ;) v rámci podmínky. Tyto proměnné mohou používat písmena, podtržítka a čísla (kromě prvního znaku) a nerozlišují malá a velká písmena. Příklad (pro w:Special:AbuseFilter/79):

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

Pole

AbuseFilter má podporu pro neasociativní pole, která lze použít jako v následujících příkladech.

Pozor! Pozor: Výrazy jako page_namespace in [14, 15] nemusí fungovat podle očekávání. Tento bude vyhodnocen jako true také v případě, že page_namespace je 1, 4 nebo 5. Další informace a možná řešení naleznete v části T181024.
my_array := [ 5, 6, 7, 10 ];
my_array[0] == 5
length(my_array) == 4
int( my_array ) === 4 // Stejná jako délka
float( my_array ) === 4.0 // Počítá prvky
string(my_array) == "5\n6\n7\n10\n" // Poznámka: Poslední zalomení řádku může být v budoucnu odstraněno
5 in my_array == true
'5' in my_array == true
'5\n6' in my_array == true // Poznámka: Toto je způsobeno tím, jak jsou pole přetypována na řetězec, tj. jejich implodováním pomocí zalomení řádků
1 in my_array == true // Poznámka: K tomu dochází, protože 'in' přenáší argumenty na řetězce, takže 1 je zachycena v '10' a vrací true.
my_array[] := 57; // Tím se přidá prvek na konec pole
my_array === [ 5, 6, 7, 10, 57 ]
my_array[2] := 42; // A to pro změnu prvku v poli
my_array === [ 5, 6, 42, 10, 57 ]

Komentáře

Komentáře můžete zadat pomocí následující syntaxe:

/* Toto je komentář */

Aritmetika

Základní aritmetické symboly můžete použít k aritmetice proměnných a literálů s následující syntaxí:

  • - – odečte pravý operand od levého operandu.
  • + – přidá pravý operand k levému operandu.
  • * – vynásobí levý operand pravým operandem.
  • / – vydělí levý operand pravým operandem.
  • ** – zvýší levý operand na exponenciální mocninu určenou pravým operandem.
  • % – vrátí zbytek daný, když je levý operand dělen pravým operandem.

Typ vráceného výsledku je stejný, jaký by vrátilo PHP, pro které lze nalézt mnoho dokumentace online. Vyčerpávající příklady lze nalézt v tomto testu analyzátoru AF.

Příklad Výsledek
1 + 1 2
2 * 2 4
1 / 2 0.5
9 ** 2 81
6 % 5 1

Booleovské operace

Shodovat se můžete tehdy a pouze tehdy, pokud jsou splněny všechny podmínky, jedna z mnoha podmínek nebo jedna a pouze jedna ze všech podmínek.

  • x | y — OR – vrátí hodnotu true, pokud je splněna jedna nebo více podmínek.
  • x & y — AND – vrátí hodnotu true, pokud jsou splněny obě podmínky.
  • x ^ y — XOR – vrátí true, pokud je splněna jedna a pouze jedna ze dvou podmínek.
  • !x — NOT – vrátí true, pokud podmínka není pravdivá.

Příklady

Kód Výsledek
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

Jednoduchá přirovnání

proměnné můžete porovnat s jinými proměnnými a literaly s následujícími syntaxemi:

  • <, > – vrátí hodnotu true, pokud je levý operand menší než/větší než pravý operand. Pozor: Operandy jsou přetypovány do řetězců a, stejně jako v PHP, null < jakékoli číslo === true a null > jakékoli číslo === false.
  • <=, >= – vrátí hodnotu true, pokud je levý operand menší nebo roven/větší nebo roven pravému operandu. Pozor: Operandy jsou přetypovány do řetězců a, stejně jako v PHP, null <= jakékoli číslo === true a null >= jakékoli číslo === false.
  • == (nebo =), != – vr8t9 true, pokud se levý operand rovná/nerovná pravému operandu.
  • ===, !== – vrátí true, pokud je levý operand rovný/není se pravý operand A levý operand je stejný/není stejný datový typ pro pravý operand. .
Příklad Výsledek
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]

Vestavěné proměnné

Filtr zneužívání předává různé proměnné podle názvu do analyzátoru. K těmto proměnným lze přistupovat zadáním jejich názvu na místo, kde by fungoval literál. Proměnné přidružené ke každému požadavku můžete zobrazit v protokolu zneužití.

Proměnné z AbuseFilter

Vždy dostupné proměnné

Pozor! Pozor: Uživatelské proměnné jsou vždy k dispozici, kromě jednoho případu: vytvoření účtu, když tvůrce není přihlášen. Všechny proměnné začínající na user_ jsou ovlivněny kromě user_type.
Popis Název Datový typ Poznámky
Akce action řetězec Jedna z následujících: edit, move, createaccount, autocreateaccount, delete, upload[2], stashupload[3]
Unix časové razítko změny timestamp řetězec int(timestamp) vám dává číslo, pomocí kterého můžete vypočítat datum, čas, den v týdnu atd.
Databázový název wiki wiki_name řetězec Například toto je "enwiki" na anglické Wikipedii a "itwikiquote" na italské Wikiquote.
Kód jazyka wiki wiki_language řetězec Například toto je "en" na anglické Wikipedii a "it" na italské Wikicitaci. Vícejazyčné wiki jako Commons, Meta a Wikidata se také budou hlásit jako "en".
Počet uživatelových editací user_editcount celé číslo/nula Null pouze pro neregistrované uživatele.
Uživatelské jméno (IP in case the user is not registered) user_name řetězec
Pro akce "createaccount" a "autocreateaccount" použijte accountname, chcete-li název vytvářeného účtu.
Typ uživatelského účtu ($1) user_type řetězec Typ uživatele, který bude jeden z ip, temp (pokud uživatel používá dočasný účet ), named, external nebo unknown.
Čas, kdy byla ověřena e-mailová adresa user_emailconfirm řetěz/nula Ve formátu: RRRRMMDDHHMMSS. Null, pokud e-mail nebyl potvrzen.
Stáří uživatelského účtu user_age celé číslo V sekundách. 0 pro neregistrované uživatele.
Jestli je uživatel zablokovaný user_blocked boolean True pro zablokované registrované uživatele. Platí také pro úpravy z blokovaných IP adres, i když je editor registrovaným uživatelem, který není blokován. False jinak.
To nerozlišuje mezi částečnými a celowebovými bloky.
Skupiny (včetně implicitních), do kterých uživatel patří user_groups pole řetězců Podívejte se na stránku Special:ListGroupRights
Práva, která má uživatel user_rights pole řetězců Podívejte se na stránku Special:ListGroupRights.
ID stránky article_articleid celé číslo (zastaralé) Použijte místo toho page_id.
ID stránky (lze zobrazit pomocí odkazu "informace o stránce" v postranním panelu) page_id celé číslo Toto je 0 pro nové stránky, ale je nespolehlivé při kontrole minulých přístupů. Pokud při kontrole minulých požadavků potřebujete přesný výsledek, použijte "page_age == 0" k identifikaci vytvoření nové stránky. (všimněte si však, že je pomalejší.) Tento problém byl opraven v 9369d08, sloučeno 11. září 2023.
Jmenný prostor stránky article_namespace celé číslo (zastaralé) Místo ní používejte přímo page_namespace.
Jmenný prostor stránky page_namespace celé číslo odkazuje na index jmenného prostoru . Zkontrolujte jmenné prostory pomocí výrazů jako "page_namespace == 2" nebo "equals_to_any(page_namespace, 1, 3)"
Stáří stránky (v sekundách) page_age celé číslo počet sekund od první úpravy (nebo 0 pro nové stránky). To je spolehlivé, ale bývá pomalé. Zvažte použití page_id, pokud nepotřebujete velkou přesnost.
Název stránky (bez jmenného prostoru) article_text řetězec (zastaralé) Místo ní používejte přímo page_title.
Název stránky (bez jmenného prostoru) page_title řetězec
Úplný název stránky article_prefixedtext řetězec (zastaralé) Místo ní používejte přímo page_prefixedtitle.
Úplný název stránky page_prefixedtitle řetězec
Úroveň zamčení stránky pro editaci article_restrictions_edit řetězec (zastaralé) Místo ní používejte přímo page_restrictions_edit.
Úroveň zamčení stránky pro editaci page_restrictions_edit pole řetězců
Úroveň zamčení stránky pro přesun article_restrictions_move řetězec (zastaralé) Místo ní používejte přímo page_restrictions_move.
Úroveň zamčení stránky pro přesun page_restrictions_move pole řetězců
Úroveň zamčení souboru pro načtení article_restrictions_upload řetězec (zastaralé) Místo ní používejte přímo page_restrictions_upload.
Úroveň zamčení souboru pro načtení page_restrictions_upload pole řetězců
Úroveň zamčení stránky pro založení article_restrictions_create řetězec (zastaralé) Místo ní používejte přímo page_restrictions_create.
Úroveň zamčení stránky pro založení page_restrictions_create pole řetězců
Posledních deset uživatelů, kteří editovali příslušnou stránku article_recent_contributors array of strings (zastaralé) Místo ní používejte přímo page_recent_contributors.
Posledních deset uživatelů, kteří editovali příslušnou stránku page_recent_contributors pole řetězců To bývá pomalé (viz #Výkon). Pokuste se dát podmínky s vyšší pravděpodobností vyhodnocení na false před tuto, abyste se vyhnuli zbytečnému spouštění dotazu. Tato hodnota je prázdná, pokud je uživatel jediným přispěvatelem na stránku (?) a skenuje pouze posledních 100 revizí
První autor této stránky article_first_contributor řetězec (zastaralé) Místo ní používejte přímo page_first_contributor.
První autor této stránky page_first_contributor řetězec To bývá pomalé (viz #Výkon).[4] Pokuste se dát podmínky s vyšší pravděpodobností vyhodnocení na false před tuto, abyste se vyhnuli zbytečnému spouštění dotazu.

Proměnné dostupné pro některé akce

Pozor! Pozor: Vždy zkontrolujte, zda jsou proměnné, které chcete použít, dostupné pro aktuální filtrovanou akci, např. pomocí proměnné action. Pokud tak neučiníte (například pomocí accountname pro úpravu nebo edit_delta pro smazání), jakýkoli kód používající danou proměnnou vrátí hodnotu false.
Upravené proměnné nejsou při kontrole dříve nahraných souborů k dispozici. (T345896)
Popis Název Datový typ Poznámky
Shrnutí editace/zdůvodnění summary řetězec Souhrny automaticky vytvořené MediaWiki ("Nová sekce", "Vyprázdněná stránka" atd.) jsou vytvořeny poté, co filtr zkontroluje úpravy, takže se ve skutečnosti nikdy nezachytí, i když debugger ukazuje, že by měly. The variable contains whatever the user sees in the edit summary window, which may include MediaWiki preloaded section titles.[5]
Zda byla editace označena jako malá (už se nepoužívá) minor_edit řetězec Zakázáno a nastaveno na hodnotu false pro všechny položky v letech 2016 až 2018.[6]
Původní zdrojový text stránky před editací old_wikitext řetězec Tato proměnná může být velmi velká. Pokud je to možné, zvažte použití removed_lines ke zlepšení výkonu.
Nový zdrojový text stránky po editaci new_wikitext řetězec Tato proměnná může být velmi velká. Pokud je to možné, zvažte použití added_lines ke zlepšení výkonu.
Unifikovaný diff změn způsobených editací edit_diff řetězec
Unifikovaný rozdíl změn způsobených editací, po transformaci před uložením edit_diff_pst řetězec To bývá pomalé (viz #Výkon). Kontrola added_lines a removed_lines je pravděpodobně efektivnější.[7]
Nová velikost stránky new_size celé číslo
Původní velikost stránky old_size celé číslo
Změna velikosti způsobená editací edit_delta celé číslo
Řádky přidané při editaci, po transformaci před uložením added_lines_pst pole řetězců Pokud je to možné, použijte added_lines, což je efektivnější.
Řádky přidané při editaci added_lines pole řetězců Zahrnuje všechny řádky v konečném rozdílu, které začínají +
Řádky odstraněné při editaci removed_lines pole řetězců
Všechny externí odkazy ve výsledném textu all_links pole řetězců To bývá pomalé (viz #Výkon).
Odkazy na stránce před editací old_links pole řetězců To bývá pomalé (viz #Výkon).
Všechny externí odkazy přidané při editaci added_links pole řetězců To bývá pomalé (viz #Výkon). Zvažte nejprve kontrolu proti added_lines, poté zkontrolujte added_links, aby bylo zpomaleno méně úprav. Toto se řídí pravidly MediaWiki pro externí odkazy . Do pole se přidávají pouze jedinečné odkazy. Změna odkazu se bude počítat jako 1 přidaný a 1 odstraněný odkaz.
Všechny externí odkazy odstraněné při editaci removed_links pole řetězců To bývá pomalé (viz #Výkon). Zvažte nejprve kontrolu proti removed_lines, poté zkontrolujte removed_links, aby bylo zpomaleno méně úprav. Toto se řídí pravidly MediaWiki pro externí odkazy . Do pole se přidávají pouze jedinečné odkazy. Změna odkazu se bude počítat jako 1 přidaný a 1 odstraněný odkaz.
Wikitext nové stránky po transformaci před uložením new_pst řetězec Tato proměnná může být velmi velká.
Vygenerovaný HTML kód nové verze new_html řetězec Tato proměnná může být velmi velká. Pokud je to možné, zvažte použití added_lines ke zlepšení výkonu.
Nový text stránky zbavený formátování new_text řetězec Tato proměnná může být velmi velká. Pokud je to možné, zvažte použití added_lines ke zlepšení výkonu.
Původní text stránky naformátovaný do HTML (už se nepoužívá) old_html řetězec Zakázáno z důvodu výkonu.
Původní text stránky bez všech značek (už se nepoužívá) old_text řetězec Zakázáno z důvodu výkonu.
Čas od poslední úpravy stránky v sekundách ($1) page_last_edit_age celé číslo nebo null null, když stránka neexistuje
SHA-1 otisk obsahu souboru file_sha1 řetězec [2]
Velikost souboru v bajtech file_size celé číslo Velikost souboru v bajtech[2]
Šířka souboru v pixelech file_width celé číslo Šířka v pixelech[2]
Výška souboru v pixelech file_height celé číslo Výška v pixelech[2]
Barevná hloubka souboru v bitech na barevný kanál file_bits_per_channel celé číslo Počet bitů na barevný kanál[2]
MIME typ souboru file_mime řetězec Typ souboru MIME.[2]
Typ obsahu tohoto souboru file_mediatype řetězec Typ média souboru.[8][2]
ID stránky, na kterou se přesouvá moved_to_articleid celé číslo (zastaralé) Místo ní používejte přímo moved_to_id.
ID stránky, na kterou se přesouvá moved_to_id celé číslo
Název, na který se stránka přesouvá moved_to_text řetězec (zastaralé) Místo ní používejte přímo moved_to_title.
Název, na který se stránka přesouvá moved_to_title řetězec
Úplný název, na který se stránka přesouvá moved_to_prefixedtext řetězec (zastaralé) Místo ní používejte přímo moved_to_prefixedtitle.
Úplný název, na který se stránka přesouvá moved_to_prefixedtitle řetězec
Jmenný prostor, do kterého se přesouvá moved_to_namespace celé číslo
Stáří stránky, na kterou se přesunuje (v sekundách) moved_to_age celé číslo
Time since last move destination page edit in seconds ($1) moved_to_last_edit_age celé číslo nebo null null, pokud cílová stránka neexistuje
Úroveň zamčení stránky, na kterou se přesouvá, pro editaci moved_to_restrictions_edit pole řetězců Stejně jako page_restrictions_edit, ale pro cíl přesunu.
Úroveň zamčení stránky, na kterou se přesouvá, pro přesun moved_to_restrictions_move pole řetězců Stejně jako page_restrictions_move, ale pro cíl přesunu.
Úroveň zamčení stránky, na kterou se přesouvá, pro načtení souboru moved_to_restrictions_upload pole řetězců Stejně jako page_restrictions_upload, ale pro cíl přesunu.
Úroveň zamčení stránky, na kterou se přesouvá, pro založení stránky moved_to_restrictions_create pole řetězců Stejně jako page_restrictions_create, ale pro cíl přesunu.
Posledních deset uživatelů, kteří editovali stránku, na kterou se přesouvá moved_to_recent_contributors pole řetězců Stejně jako page_recent_contributors, ale pro cíl přesunu.
První uživatel, který editoval stránku, na kterou se přesouvá moved_to_first_contributor řetězec Stejně jako page_first_contributor, ale pro cíl přesunu.
Původní jmenný prostor přesouvané stránky moved_from_namespace celé číslo
Název přesouvané stránky moved_from_text řetězec (zastaralé) Místo ní používejte přímo moved_from_title.
Název přesouvané stránky moved_from_title řetězec
Úplný název přesouvané stránky moved_from_prefixedtext řetězec (zastaralé) Místo ní používejte přímo moved_from_prefixedtitle.
Úplný název přesouvané stránky moved_from_prefixedtitle řetězec
ID přesouvané stránky moved_from_articleid celé číslo (zastaralé) Místo ní používejte přímo moved_from_id.
ID přesouvané stránky moved_from_id celé číslo
Stáří stránky, která se přesunuje (v sekundách) moved_from_age celé číslo
Time since last move source page edit in seconds ($1) moved_from_last_edit_age celé číslo
Úroveň zamčení přesouvané stránky pro editaci moved_from_restrictions_edit pole řetězců Stejné jako page_restrictions_edit, ale pro stránku, která se přesouvá.
Úroveň zamčení přesouvané stránky pro přesun moved_from_restrictions_move pole řetězců Stejné jako page_restrictions_move, ale pro stránku, která se přesouvá.
Úroveň zamčení přesouvané stránky pro načtení souboru moved_from_restrictions_upload pole řetězců Stejné jako page_restrictions_upload, ale pro stránku, která se přesouvá.
Úroveň zamčení přesouvané stránky pro založení stránky moved_from_restrictions_create pole řetězců Stejné jako page_restrictions_create, ale pro stránku, která se přesouvá.
Posledních deset uživatelů, kteří editovali přesouvanou stránku moved_from_recent_contributors pole řetězců Stejné jako page_recent_contributors, ale pro stránku, která se přesouvá.
První uživatel, který editoval přesouvanou stránku moved_from_first_contributor řetězec Stejné jako page_first_contributor, ale pro stránku, která se přesouvá.
Uživatelské jméno (při zakládání nového účtu) accountname řetězec
Obsahový model staré revize old_content_model řetězec Informace o změnách modelu obsahu naleznete v části Nápověda:ChangeContentModel
Obsahový model nové revize new_content_model řetězec Informace o změnách modelu obsahu naleznete v části Nápověda:ChangeContentModel

Chráněné proměnné

Proměnnou lze považovat za chráněnou. Například na wiki s povolenými dočasnými účty jsou IP považovány za PII a přístup k nim musí být omezen. Chráněné proměnné a filtry, které je používají, jsou přístupné pouze správcům s právem abusefilter-access-protected-vars. Použití chráněné proměnné označí filtr také jako chráněný. Filtr následně nelze zrušit, i když již chráněnou proměnnou aktivně nepoužívá, protože jeho historické protokoly zůstanou dostupné.

Výchozí chráněné proměnné jsou definovány v AbuseFilterProtectedVariables v extension.json.

Popis Název Datový typ Poznámky
IP adresa uživatelského účtu (pouze odhlášení a dočasné účty) ($1) user_unnamed_ip řetězec IP uživatele pro anonymní uživatele/dočasné účty
Toto vrátí null pro registrované uživatele.

Proměnné z jiných rozšíření

Většina těchto proměnných je při zkoumání minulých úprav vždy nastavena na hodnotu false a nemusí odrážet jejich skutečnou hodnotu v době, kdy byla úprava provedena. Podívejte se na stránku T102944.
Popis Název Datový typ Hodnoty Přidáno
Globální skupiny, do kterých uživatel patří global_user_groups pole CentralAuth
Globální počet editací uživatele global_user_editcount celé číslo CentralAuth
Global groups that the user is in on account creation ($1) global_account_groups pole Dostupné pouze v případě, že action je createaccount (pak je vždy prázdné) nebo autocreateaccount. CentralAuth
Global edit count of the user on account creation ($1) global_account_editcount celé číslo Dostupné pouze v případě, že action je createaccount (pak je vždy nula) nebo autocreateaccount. CentralAuth
OAuth consumer used to perform this change ($1) oauth_consumer celé číslo OAuth
ID Strukturované diskuse board_articleid celé číslo (zastaralé) Místo ní používejte přímo board_id. StructuredDiscussions
ID Strukturované diskuse board_id celé číslo StructuredDiscussions
Jmenný prostor Strukturované diskuse board_namespace celé číslo odkazuje na index jmenného prostoru StructuredDiscussions
Název (bez jmenného prostoru) strukturovaného diskusního fóra board_text řetězec (zastaralé) Místo ní používejte přímo board_title. StructuredDiscussions
Název (bez jmenného prostoru) strukturovaného diskusního fóra board_title řetězec StructuredDiscussions
Úplný název Strukturované diskuse board_prefixedtext řetězec (zastaralé) Místo ní používejte přímo board_prefixedtitle. StructuredDiscussions
Úplný název Strukturované diskuse board_prefixedtitle řetězec StructuredDiscussions
Zdrojový text překladové jednotky translate_source_text řetězec Translate
Target language for translation translate_target_language řetězec Toto je kód jazyka, například en pro angličtinu. Translate
Zda byla tato editace provedena z výstupního uzlu sítě Tor tor_exit_node boolean true, pokud akce pochází z výstupního uzlu toru. TorBlock
Zda uživatel edituje prostřednictvím mobilního rozhraní user_mobile boolean true pro mobilní uživatele, jinak false. MobileFrontend
Zda uživatel edituje z mobilní aplikace user_app boolean true, pokud uživatel provádí úpravy z mobilní aplikace, jinak false. MobileApp
Zobrazení stránky[1] article_views celé číslo (zastaralé) Místo ní používejte přímo page_views. HitCounters
Zobrazení stránky[2] page_views celé číslo počet zobrazení stránek HitCounters
Zobrazení zdrojové stránky[3] moved_from_views celé číslo počet zobrazení zdrojové stránky HitCounters
Cílová zobrazení stránek[4] moved_to_views celé číslo počet zobrazení cílové stránky HitCounters
Zda je IP adresa blokována pomocí seznamu stopforumspam.com[5] sfs_blocked boolean Zda je IP adresa blokována pomocí seznamu stopforumspam.com StopForumSpam

Poznámky

Když je action='move', jsou k dispozici pouze proměnné summary, action, timestamp a user_*. Proměnné page_* jsou také k dispozici, ale předpona je nahrazena moved_from_ a moved_to_, které představují hodnoty názvu článku původního a cílového. Například moved_from_title a moved_to_title místo page_title.

Od verze MediaWiki 1.28 (1 $) se action='upload' používá pouze při publikování nahraného obsahu, nikoli pro nahrání do úschovy. Zavádí se nový action='stashupload', který se používá pro všechna nahrávání, včetně nahrávání do zásobníku. Chová se jako dřívější action='upload' a poskytuje pouze proměnné metadat souboru (file_*). Proměnné související s úpravou stránky, včetně summary, new_wikitext a několika dalších, jsou nyní k dispozici na action='upload'. Pro každé nahrání souboru mohou být filtry volány s action='stashupload' (pro nahrávání do zásobníku) a jsou vždy volány s action='upload'. Nejsou voláni s action='edit'.

Autoři filtrů by měli použít action='stashupload' | action='upload' v kódu filtru, když lze soubor zkontrolovat pouze na základě obsahu souboru – například pro odmítnutí souborů s nízkým rozlišením – a action='upload' pouze tehdy, když je třeba prozkoumat i wikitextové části úpravy – například, odmítnout soubory bez popisu. To umožňuje nástrojům, které oddělují nahrávání souboru a publikování souboru (např. UploadWizard nebo upload dialog), informovat uživatele o selhání dříve, než stráví čas vyplňováním údajů o nahrávání.

Výkon

Jak je uvedeno v tabulce výše, některé z těchto proměnných mohou být velmi pomalé. Při psaní filtrů mějte na paměti, že limit podmínky není dobrá metrika toho, jak těžké jsou filtry. Například proměnné jako *_recent_contributors nebo *_links vždy potřebují k výpočtu DB dotaz, zatímco proměnné *_pst budou muset provést analýzu textu, což je opět těžká operace; všechny tyto proměnné by měly být používány velmi, velmi opatrně. Například na italské Wikipedii bylo pozorováno, že při 135 aktivních filtrech a průměrně 450 použitých podmínkách byla doba provedení filtrů kolem 500 ms, přičemž špičky dosahovaly 15 sekund. Odstranění proměnné added_links z jednoho filtru a snížení případů, kdy by jiný filtr použil added_lines_pst, přineslo průměrnou dobu provádění na 50 ms. Konkrétněji:

  • Použijte proměnné _links, když potřebujete vysokou přesnost a kontrola "http://..." v jiných proměnných (například added_lines) by mohla vést k vážným poruchám;
  • Proměnné _pst použijte, pokud jste si opravdu jisti, že proměnné jiné než PST nestačí. Můžete se také podmíněně rozhodnout, který z nich zkontrolovat: pokud například chcete prozkoumat podpis, nejprve zkontrolujte, zda added_lines obsahuje ~~~;
  • Obecně platí, že když se zabýváme těmito proměnnými, je vždy mnohem lepší použít další podmínky, ale vyhnout se náročným výpočtům. Abyste toho dosáhli, vždy dávejte těžké proměnné jako poslední podmínky.

V neposlední řadě si uvědomte, že kdykoli je pro daný filtr vypočítána proměnná, bude uložena a jakýkoli jiný filtr ji okamžitě načte. To znamená, že jeden jediný filtr počítající tuto proměnnou se počítá víceméně jako desítky filtrů, které ji používají.

Klíčová slova

Kde to není konkrétně uvedeno jinak, klíčová slova přenášejí své operandy na řetězce

Pro často používané funkce jsou zahrnuta následující speciální klíčová slova:

  • like (nebo matches) vrátí true, pokud levý operand odpovídá globálnímu vzoru v pravém operandu.
  • in vrátí hodnotu true, pokud pravý operand (řetězec) obsahuje levý operand. Poznámka: Prázdné řetězce nejsou obsaženy ani neobsahují žádný jiný řetězec (ani prázdný řetězec samotný).
  • contains funguje jako in, ale s přepnutým levým a pravým operandem. Poznámka: Prázdné řetězce nejsou obsaženy ani neobsahují žádný jiný řetězec (ani prázdný řetězec samotný).
  • rlike (nebo regex) a irlike vrátí hodnotu true, pokud levý operand odpovídá (obsahuje) vzoru regulárního výrazu v pravém operandu (irlike nerozlišuje malá a velká písmena) .
    • Systém používá PCRE (Perl kompatibilní regulární výrazy).
    • Jediná povolená volba PCRE je PCRE_UTF8 (modifikátor u v PHP). Pro irlike jsou povoleny jak PCRE_CASELESS, tak PCRE_UTF8 (modifikátor iu).
  • if ... then ... end
  • if ... then ... else ... end
  • ... ? ... : ...
  • true, false, null

Příklady

Kód Výsledek Poznámka
"1234" like "12?4" True
"1234" like "12*" True
"foo" in "foobar" True
"foobar" contains "foo" True
"o" in ["foo", "bar"] True Kvůli obsazení řetězce
"foo" regex "\w+" True
"a\b" regex "a\\\\b" True Chcete-li hledat zpětné lomítko escape znaku pomocí regulárního výrazu, musíte použít buď čtyři zpětná lomítka, nebo dvě \x5C. (Obě funguje dobře.)
"a\b" regex "a\x5C\x5Cb" True

Funkce

Pro usnadnění některých běžných problémů je zahrnuta řada vestavěných funkcí. Jsou prováděny v obecném formátu functionName( arg1, arg2, arg3 ) a lze je použít místo libovolného literálu nebo proměnné. Jeho argumenty mohou být uvedeny jako literály, proměnné nebo dokonce jiné funkce.

název popis
lcase Vrátí argument převedený na malá písmena.
ucase Vrátí argument převedený na velká písmena.
length Vrátí délku řetězce zadaného jako argument. Pokud je argument pole, vrátí počet jeho prvků.
string Přetypuje na datový typ řetězce. Pokud je argument pole, imploduje jej pomocí zalomení řádků.
int Přetypuje na celočíselný datový typ.
float Přetypuje na datový typ s plovoucí desetinnou čárkou.
bool Přetypuje na booleovský datový typ.
norm Ekvivalent rmwhitespace(rmspecials(rmdoubles(ccnorm(arg1)))).
ccnorm Normalizuje zaměnitelné/podobné znaky v argumentu a vrací kanonický tvar. Seznam znaků a jejich náhrad lze nalézt na git, např. ccnorm( "Eeèéëēĕėęě3ƐƷ" ) === "EEEEEEEEEEEEE".[9] Výstup této funkce je vždy velkým písmenem. I když tato funkce není náročná, není ani jednoduchá a při opakovaném volání by mohla filtr zpomalit.
ccnorm_contains_any Normalizuje zaměnitelné/podobné znaky ve všech svých argumentech a vrací hodnotu true, pokud první řetězec obsahuje jakýkoli řetězec z následujících argumentů (neomezený počet argumentů, logický režim OR). Seznam znaků a jejich nahrazení lze nalézt na git. Kvůli použití ccnorm může být tato funkce pomalá, pokud je předáno příliš mnoho argumentů.
ccnorm_contains_all Normalizuje zaměnitelné/podobné znaky ve všech svých argumentech a vrátí hodnotu true, pokud první řetězec obsahuje řetězec každý z následujících argumentů (neomezený počet argumentů, režim logického AND). Seznam znaků a jejich nahrazení lze nalézt na git. Kvůli použití ccnorm může být tato funkce pomalá, pokud je předáno příliš mnoho argumentů.
specialratio Vrátí počet nealfanumerických znaků vydělený celkovým počtem znaků v argumentu.
rmspecials Odstraní všechny speciální znaky v argumentu a vrátí výsledek. Neodstraňuje mezery. (Ekvivalent s/[^\p{L}\p{N}\s]//g.)
rmdoubles Odstraní opakované znaky v argumentu a vrátí výsledek.
rmwhitespace Odstraní mezery (mezery, tabulátory, nové řádky).
count Vrátí, kolikrát se jehla (první řetězec) objevila v kupce sena (druhý řetězec). Pokud je zadán pouze jeden argument, rozdělí jej čárkami a vrátí počet segmentů.
rcount Podobné jako count, ale jehla místo toho používá regulární výraz. Může být rozlišováno mezi malými a velkými písmeny tím, že necháte regulární výraz začínat "(?i)". Upozorňujeme, že pro prosté řetězce může být tato funkce až 50krát pomalejší než count[10], takže pokud je to možné, používejte tuto funkci.
get_matches MW 1.31+ Hledá shody jehly regulárního výrazu (první řetězec) v kupce sena (druhý řetězec). Vrátí pole, kde prvek 0 je celá shoda a každý prvek [n] je shoda n'-té skupiny zachycení jehly. Může být rozlišováno mezi malými a velkými písmeny tím, že necháte regulární výraz začínat "(?i)". Pokud se zachytávací skupina neshoduje, pozice pole bude mít hodnotu false.
ip_in_range Vrátí hodnotu true, pokud IP (první řetězec) uživatele odpovídá zadanému rozsahu IP adres (druhý řetězec může být v CIDR notace, explicitní notaci jako "1.1.1.1-2.2.2.2" nebo jeden IP). Funguje pouze pro anonymní uživatele. Podporuje adresy IPv4 i IPv6.
ip_in_ranges Vrátí true, pokud IP (první řetězec) uživatele odpovídá jakémukoli ze zadaných rozsahů IP (následující řetězce v režimu logického NEBO, může být v CIDR notace, explicitní zápis jako "1.1 .1.1-2.2.2.2" nebo jedna IP adresa). Funguje pouze pro anonymní uživatele. Podporuje adresy IPv4 i IPv6.
contains_any Vrátí hodnotu true, pokud první řetězec obsahuje řetězec any z následujících argumentů (neomezený počet argumentů v režimu logického OR). Pokud je prvním argumentem pole, přetypuje se na řetězec.
contains_all Vrátí hodnotu true, pokud první řetězec obsahuje řetězec každý z následujících argumentů (neomezený počet argumentů v režimu logického AND). Pokud je prvním argumentem pole, přetypuje se na řetězec.
equals_to_any Vrátí hodnotu true, pokud je první argument identický (===) s kterýmkoli z následujících (neomezený počet argumentů). V zásadě je equals_to_any(a, b, c) totéž jako a===b | a===c, ale je kompaktnější a šetří podmínky.
substr Vrátí část prvního řetězce pomocí posunu od druhého argumentu (začíná na 0) a maximální délky od třetího argumentu (volitelné).
strlen Stejné jako length.
strpos Vrátí číselnou pozici prvního výskytu jehly (druhý řetězec) v kupce sena (první řetězec), počínaje odsazením od třetího argumentu (volitelné, výchozí hodnota je 0). Tato funkce může vrátit 0, když je jehla nalezena na začátku kupky sena, takže může být jiným srovnávacím operátorem chybně interpretována jako hodnota false. Lepší způsob je použít === nebo !== pro testování, zda je nalezen. 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 Nahradí všechny výskyty hledaného řetězce náhradním řetězcem. Funkce přebírá 3 argumenty v následujícím pořadí: Text, ve kterém se má vyhledávat, text k nalezení, nahrazující text.
str_replace_regexp Nahradí všechny výskyty hledaného řetězce náhradním řetězcem pomocí regulárních výrazů. Funkce přebírá 3 argumenty v následujícím pořadí: text, ve kterém se má vyhledávat, regulární výraz, který se má shodovat, nahrazující výraz.
rescape Vrátí argument s některými znaky, kterým předchází znak escape "\", takže řetězec lze použít v regulárním výrazu, aniž by tyto znaky měly zvláštní význam.
set Nastaví proměnnou (první řetězec) s danou hodnotou (druhý argument) pro další použití ve filtru. Další syntaxe: name := value.
set_var Stejné jako set.

Příklady

Kód Výsledek Poznámka
length( "Wikipedia" ) 9
lcase( "WikiPedia" ) wikipedia
ccnorm( "w1k1p3d14" ) WIKIPEDIA ccnorm výstup je vždy velkými písmeny
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 odstraní mezery, speciální znaky a duplikáty a poté použije 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']

Pořadí operací

Operace se obecně provádějí zleva doprava, ale existuje pořadí, podle kterého se řeší. Jakmile filtr nevyhoví jedné z podmínek, přestane kontrolovat zbývající z nich (kvůli vyhodnocení zkratu) a přejde k dalšímu filtru. Pořadí hodnocení je:

  1. Vše v závorkách (( a )) je vyhodnoceno jako jedna jednotka.
  2. Převádění proměnných/literálů na jejich příslušná data. (např. page_namespace až 0)
  3. Volání funkcí (norm, lcase atd.)
  4. Unární + a - (definující kladnou nebo zápornou hodnotu, např. -1234, +1234)
  5. Klíčová slova (in, rlike atd.)
  6. Booleovská inverze (!x)
  7. Umocňování (2**3 → 8)
  8. Související s násobením (násobení, dělení, modulování)
  9. Sčítání a odčítání (3-2 → 1)
  10. Porovnání (<, >, ==)
  11. Booleovské operace (&, |, ^)
  12. Ternární operátor (... ? ... : ...)
  13. Úkoly (:=)

Příklady

  • A & B | C je ekvivalent (A & B) | C, nikoli A & (B | C). Konkrétně false & true | true a false & false | true se vyhodnotí jako true.
  • A | B & C je ekvivalent (A | B) & C, nikoli A | (B & C). Konkrétně true | true & false a true | false & false se vyhodnotí jako false.
  • added_lines rlike "foo" + "|bar" je špatně, použijte místo toho added_lines rlike ("foo" + "|bar").

Počítání podmínek

Limitem podmínky je (víceméně) sledování počtu porovnávacích operátorů + počtu zadaných volání funkcí.

Další vysvětlení, jak snížit použité podmínky, lze nalézt na Extension:AbuseFilter/Conditions .

Vyjímky

Přestože funkce prozkoumání AbuseFilter identifikuje akce "vrácení zpět" jako úpravy, AbuseFilter nevyhodnotí akce vrácení pro shodu.[11]

Užitečné odkazy

Poznámky pod čarou

  1. Porovnání polí s jinými typy vždy vrátí hodnotu false, s výjimkou příkladu výše
  2. 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 Jediné proměnné, které jsou aktuálně dostupné pro nahrávání souborů (action='upload'), jsou user_*, page_*, file_sha1, file_size, file_mime, file_mediatype, file_width, file_height, file_bits_per_channel (posledních pět bylo přidáno teprve od vydání za MediaWiki 1.27 gerrit:281503). Všechny proměnné file_* nejsou dostupné pro jiné akce (včetně action='edit').
  3. Od MediaWiki 1.28 (gerrit:295254)
  4. Několik filtrů (12), které používají tuto proměnnou, se zobrazilo v řídicí panel AbuseFilterSlow Grafanak ( zobrazení vyžaduje přístup logstash). Zdálo se, že posunutí této proměnné ke konci filtru pomohlo.
  5. Podívejte se na phabricator:T191722
  6. Zastaralé s tímto potvrzením a zakázané s tímto.
  7. Některé filtry používající tuto proměnnou se zobrazily na řídicím panelu AbuseFilterSlow Grafana (příklad, vyžaduje přístup logstash). Například místo použití "text" in edit_diff_pst (nebo dokonce edit_diff) zvažte něco jako "text" in added_lines & !("text" in removed_lines)
  8. Seznam typů viz zdrojový kód.
  9. Buďte si vědomi phab:T27619. Můžete použít Special:AbuseFilter/tools k vyhodnocení ccnorm( "your string" ), abyste viděli, které znaky jsou transformovány.
  10. https://3v4l.org/S6IGP
  11. T24713 - rollback neodpovídá AF