扩展:防滥用过滤器/規則格式

From MediaWiki.org
Jump to navigation Jump to search
This page is a translated version of the page Extension:AbuseFilter/Rules format and the translation is 93% complete.

Other languages:
English • ‎dansk • ‎español • ‎français • ‎русский • ‎मराठी • ‎中文 • ‎日本語

規則格式与类C/JAVA/Perl语言的条件式十分相近。

字符串

宣告变量时,你可以将值填写在单引号或双引号中(字符串常量),亦可直接填写(数字变量,包括整型与浮点型浮點數)。 你可以使用\n插入换行字符、\t插入制表符(Tab),也可以使用半角反斜杠来转义引号字符。

使用+(加號)來串接兩個字符串常量或字符串值的变量

示例
"这是一条字符串/這是一個字串"
'这也是一条字符串/這也是一個字串'
'单引号\'可以\'存在于字串里/單引號\'可以\'存在於字串內'
"这是一条带有\n换行符的字符串/這是一個帶有\n換行字元的字串"
1234
1.234
-123

用戶自訂變數

你可以定義自訂的變數,只要在一行中使用賦值符號:=(以;結尾)並跟隨一個條件。 這些变量可以使用字母、下划线和數字(除第一個字符外),並且區分大小寫。 例如(來自w:Special:AbuseFilter/79):

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

陣列

防濫用過濾器支援非關聯式陣列,如以下範例一樣使用。

my_array := [ 5, 6, 7, 10];
my_array[0] == 5
length(my_array) == 4
int( my_array ) === 4 // 與length相同
float( my_array ) === 4.0 // 計算元素數量
string(my_array) == "5\n6\n7\n10\n" //注意:最後一個換行將在未來移除
5 in my_array == true
'5' in my_array == true
'5\n6' in my_array == true //注意:與陣列轉型為字串的方式相同,即使用換行來implode陣列。
1 in my_array == true //注意:因為「in」指令將變數轉型為字串,所以 1 在 10 中被找到且回傳 true。
my_array[] := 57 // 這會在-{zh-hant:陣列;zh-hans:数组;}-末尾-{zh-hant:追加;zh-hans:添加;}-一個元素
my_array === [ 5, 6, 7, 10, 57 ]
my_array[2] := 42 // 這是更改陣列的元素
my_array === [ 5, 6, 42, 10, 57 ]


注释文字

您可以使用以下語法來添加注释:

/* 這是一條注釋 */

算术

你可以使用基本的算术符号对变量和常量进行算术运算,语法规则如下:

  • - — 用左操作数减去右操作数。
  • + — 将左、右操作数相加。
  • * — 将左、右操作数相乘。
  • / — 用右操作数來除左操作数。
  • ** — 对左操作数求幂,幂次由右操作数指定。
  • % — 返回左操作数除以右操作数后的余数。

返回結果的類型與PHP返回的結果相同,可以在線上找到大量文檔。 更多詳盡的例子可以在此AF解析器測試中找到。

示例 结果
1 + 1 2
2 * 2 4
1 / 2 0.5
9 ** 2 81
6 % 5 1

布尔运算

你可以要求满足所有条件为真,或满足任一条件为真,或只满足任一条件为真。

  • x | y — OR – 如果两个条件中有一个或多个为真,则返回True。
  • x & y — AND – 如果两个条件中所有条件都为真,则返回True。
  • x ^ y — XOR – 如果两个条件中当且仅当一个条件为真,则返回True。
  • !x — NOT – 如果条件为假,则返回True。

示例

代码 结果
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

简单的比较

你可以将变量与其他变量进行比较及運算,以下是语法规则:

  • <> — 如果左運算元分別小於/大於右運算元,則返回true。 注意:運算元會被轉換為字符串,就如同在PHP發生的一樣,null < 任何數值 === truenull > 任何數值 === false
  • <=>= — 如果左運算元分別小於或等於/大於或等於右運算元,則返回true。 注意:運算元會被轉換為字符串,就如同在PHP發生的一樣,null <= 任何數值 === truenull >= 任何數值 === false
  • ==(或=)、!= —如果左運算元分別等於/不等於右運算元,則返回true。
  • ===!== —如果左運算元等於右運算元左運算元的資料類型等於右運算元的資料類型,則返回true,只要有一個不符合,返回false。
示例 结果
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]

內建變數

防滥用过滤器可以根据变量的名称将各种变量传送给解析器。 你可以输入这些变量的名称来取用它们,就像取用常量一样。 在过滤日志中,你还可以看到各种请求的相关变量。

來自防濫用過濾器的变量

可用變數
描述 名称 資料型態 注释
動作 action 字符串 以下之一: edit, move, createaccount, autocreateaccount, delete, upload[2], stashupload[3]
用户的编辑次数 user_editcount 整數/Null 未註冊之用户為Null。
用户账户名称 user_name 字符串
"createaccount"動作時為空,請使用accountname
电子邮件地址得到确认的时间 user_emailconfirm 字符串 以YYYYMMDDHHMMSS的格式。 若電子郵件未確認則為Null。
用户账户的年龄 user_age 整数 單位為秒。 未註冊之用户為0。
用户是否被封禁 user_blocked 布尔值 已封禁之註冊帳戶為True。 對於來自被封禁IP地址的編輯也是如此,即使編輯者是未被封鎖的已註冊用戶。 否則為Null。
這無法區分部分封禁和全站封禁。
用户所在群组(包括隐藏群组) user_groups 字符串数组 参见Special:ListGroupRights
用户拥有的权限 user_rights 字符串数组 参见Special:ListGroupRights
页面编号 article_articleid 整数 (已弃用) 請使用page_id
页面编号 (found in the page's HTML source - search for wgArticleId) page_id 整数 理論上新建页面时为0,但这不一定可靠。 如果您需要準確的結果,使用「page_age == 0」判断是否为新建页面。 (請注意它速度較慢。)
页面名字空间 article_namespace 整数 (已弃用) 請使用page_namespace
页面名字空间 page_namespace 整数 參見名字空间索引
页面年龄(以秒为单位) page_age 整数 第一次编辑之后的秒数(新页面为0) 這是可靠的,但通常很慢;如果您不需要太高的精確度,請考慮使用page_id
页面标题(不含名字空间) article_text 字符串 (已弃用) 請使用page_title
页面标题(不含名字空间) page_title 字符串
完整页面标题 article_prefixedtext 字符串 (已弃用) 請使用page_prefixedtitle
完整页面标题 page_prefixedtitle 字符串
页面的编辑保护级别 article_restrictions_edit 字符串 (已弃用) 請使用page_restrictions_edit
页面的编辑保护级别 page_restrictions_edit 字串陣列
页面的移动保护级别 article_restrictions_move 字符串 (已弃用) 請使用page_restrictions_move
页面的移动保护级别 page_restrictions_move 字串陣列
上传文件的保护 article_restrictions_upload 字符串 (已弃用) 請使用page_restrictions_upload
上传文件的保护 page_restrictions_upload 字串陣列
创建页面的保护 article_restrictions_create 字符串 (已弃用) 請使用page_restrictions_create
创建页面的保护 page_restrictions_create 字串陣列
最后十位对该页面贡献的用户 article_recent_contributors array of strings (已弃用) 請使用page_recent_contributors
最后十位对该页面贡献的用户 page_recent_contributors 字串陣列 這通常很慢(參見#效能)。 嘗試在此之前使條件更可能被判斷為false,以避免不必要地執行此查詢。 若該頁面僅由一位用户貢獻則為空值(不確定),最多統計100個歷史版本
贡献页面的第一位用户 article_first_contributor 字符串 (已弃用) 請使用page_first_contributor
贡献页面的第一位用户 page_first_contributor 字符串 這通常很慢(參見#效能)。[4] 嘗試在此之前使條件更可能被判斷為false,以避免不必要地執行此查詢。
對部分動作可用的變數
描述 名称 資料型態 備註
编辑摘要/原因 summary 字符串 MediaWiki自動建立的摘要(「新章節」、「清空全部内容」等)是在過濾器檢查編輯後建立的,所以即使除錯工具顯示它們應被捕獲,但實際上不會被捕獲。[5]
编辑是否被标记为小编辑(不再使用) minor_edit 字符串 停用,且對於2016到2018年間的所有項目皆被設為false。[6]
旧页面的wiki文本,在编辑之前(不再继续使用) old_wikitext 字符串 這個變數可能非常大。 盡可能考慮使用removed_lines來提高性能。
编辑后的新页面,wiki代码格式 new_wikitext 字符串 這個變數可能非常大。 盡可能考慮使用added_lines來提高性能。
编辑产生的差异 edit_diff 字符串
统一所有由编辑、预保存转换更改的差异 edit_diff_pst 字符串 這通常很慢(參見#效能)。 檢查added_linesremoved_lines可能更有效率。[7]
新页面大小 new_size 整数
旧页面大小 old_size 整数
编辑前后的大小改变 edit_delta 整数
透過檢查action === 'edit'或其他限於編輯的變數,確保要過濾的操作是編輯。 否則,edit_delta將是null,因而被認為小於其他任何數字(參見#简单的比较
编辑中加入了行,并在保存前转换 added_lines_pst 字串陣列 盡可能使用added_lines,更有效率。
编辑增加的行 added_lines 字串陣列 最後差異中所有以+開頭的行
编辑移除的行 removed_lines 字串陣列
新内容中的所有外部链接 all_links array of strings
旧内容中的所有外部链接 old_links array of strings
新内容中新增的所有外部链接 added_links 字串陣列 這通常很慢(參見#效能)。 考慮首先檢查added_lines,再檢查added_links,以減少變慢的編輯。 這遵守MediaWiki的外部連結規則 。 添加到陣列中的連結都是唯一的。 更改連結將計為1個添加和1個移除連結。
新内容中移除的所有外部链接 removed_links 字串陣列 這通常很慢(參見#效能)。 考慮首先檢查removed_lines,再檢查removed_links,以減少變慢的編輯。 這遵守MediaWiki的外部連結規則 。 添加到陣列中的連結都是唯一的。 更改連結將計為1個添加和1個移除連結。
新页面维基语言,预保存转换 new_pst 字符串
编辑后的新页面,已解析为HTML源码 new_html 字符串 這個變數可能非常大。 盡可能考慮使用added_lines來提高性能。
编辑后的新页面,去除所有标记 new_text 字符串 這個變數可能非常大。 盡可能考慮使用added_lines來提高性能。
旧页面的wiki文本,解析为HTML(不再继续使用) old_html 字符串 因效能原因而被停用。
编辑前的旧页面,去除所有标记(不再使用) old_text 字符串 因效能原因而被停用。
Unix timestamp of change timestamp 字符串 使用 int(timestamp) 來取得整數以用來計算日期、時間、星期等等。
文件内容的SHA1值 file_sha1 字符串 [2]
文件大小,单位字节 file_size 整数 檔案大小,單位為位元組[2]
文件宽度(像素) file_width 整数 寬度,單位為像素[2]
文件高度(像素) file_height 整数 高度,單位為像素[2]
文件的位/颜色通道 file_bits_per_channel 整数 每個顏色通道的位元數[2]
移动目的页面的页面编号 moved_to_articleid 整数 (已弃用) 請使用moved_to_id
移动目的页面的页面编号 moved_to_id 整数
移动目的页面的标题 moved_to_text 字符串 (已弃用) 請使用moved_to_title
移动目的页面的标题 moved_to_title 字符串
移动目的页面的完整标题 moved_to_prefixedtext 字符串 (已弃用) 請使用moved_to_prefixedtitle
移动目的页面的完整标题 moved_to_prefixedtitle 字符串
移动目的页面的名字空间 moved_to_namespace 字符串
移动目标页面年龄(以秒为单位) moved_to_age 整数
移动源页面的名字空间 moved_from_namespace 字符串
移动源页面的标题 moved_from_text 字符串 (已弃用) 請使用moved_from_title
移动源页面的标题 moved_from_title 字符串
移动源页面的完整标题 moved_from_prefixedtext 字符串 (已弃用) 請使用moved_from_prefixedtitle
移动源页面的完整标题 moved_from_prefixedtitle 字符串
移动源页面的页面编号 moved_from_articleid 整数 (已弃用) 請使用moved_from_id
移动源页面的页面编号 moved_from_id 整数
移动来源页面年龄(以秒为单位) moved_from_age 整数
帐户(创建时)的名称 accountname 字符串
舊版本的內容模型 old_content_model 字符串 參見Help:更改内容模型 有關更改內容模型的資料
新版本的內容模型 new_content_model 字符串 參見Help:更改内容模型 有關更改內容模型的資料


來自其他扩展的變數

描述 名称 資料型態 數值 由誰加入
该用户的全域用户组 global_user_groups 数组 CentralAuth
结构式讨论版块的页面ID board_articleid 整数 (已弃用) 請使用board_id StructuredDiscussions
结构式讨论版块的页面ID board_id 整数 StructuredDiscussions
结构式讨论版块的名字空间 board_namespace 整数 參見名字空间索引 StructuredDiscussions
结构式讨论版块的标题(没有名字空间) board_text 字符串 (已弃用) 請使用board_title StructuredDiscussions
结构式讨论版块的标题(没有名字空间) board_title 字符串 StructuredDiscussions
结构式讨论版块的完整标题 board_prefixedtext 字符串 (已弃用) 請使用board_prefixedtitle StructuredDiscussions
结构式讨论版块的完整标题 board_prefixedtitle 字符串 StructuredDiscussions
翻译单元的原始文本 translate_source_text 字符串 扩展:翻译
修改是否经过Tor节点完成 tor_exit_node 布尔值 如果動作來自tor出口節點,則為true。 TorBlock
用户是否通过移动版界面编辑 user_mobile 布尔值 移动版用戶為true,否則為false。 扩展:移动前端
用户是否正使用移动应用进行编辑 user_app 布尔值 如果用户透過移动版应用程序進行編輯,則為true,否則為false。 扩展:MobileApp
用户是否正在通过维基百科零计划的免流量提供方编辑 user_wpzero 布尔值
此變數僅在過濾某動作時有效。 在檢查過去編輯或批次測試時,它將總是Null。
WikimediaEvents
⧼abusefilter-edit-builder-vars-page-views⧽ article_views 整数 (已弃用) 請使用page_views HitCounters
⧼abusefilter-edit-builder-vars-page-views⧽ page_views 整数 頁面瀏覽量 HitCounters
⧼abusefilter-edit-builder-vars-movedfrom-views⧽ moved_from_views 整数 來源頁面的頁面瀏覽量 HitCounters
⧼abusefilter-edit-builder-vars-movedto-views⧽ moved_to_views 整数 目標頁面的頁面瀏覽量 HitCounters
⧼abusefilter-edit-builder-vars-is-proxy⧽ is_proxy 整数 此操作是否通過代理服务器執行 AutoProxyBlock
⧼abusefilter-edit-builder-vars-sfs-blocked⧽ sfs_blocked 布尔值 IP地址是否使用stopforumspam.com列表來封鎖 StopForumSpam


注意事項

action='move',只有summaryactiontimestampuser_*變數可用。 page_*変量仍然可用,但其前綴已被取代為moved_from_moved_to_,以分別表示頁面的原本名稱和目標名稱的值。 例如moved_from_titlemoved_to_title,而不是page_title

自MediaWiki 1.28(https://gerrit.wikimedia.org/r/#/c/295254/)起,action='upload'僅用於發佈上载檔案時,不再用於上载至stash時。 新加入的action='stashupload'用於所有上载行為,包括上载至stash。 This behaves like action='upload' used to, and only provides file metadata variables (file_*). Variables related to the page edit, including summary, new_wikitext and several others, are now available for action='upload'. For every file upload, filters may be called with action='stashupload' (for uploads to stash), and are always called with action='upload'; they are not called with action='edit'.

Filter authors should use action='stashupload' | action='upload' in filter code when a file can be checked based only on the file contents – for example, to reject low-resolution files – and action='upload' only when the wikitext parts of the edit need to be examined too – for example, to reject files with no description. This will allow tools that separate uploading the file and publishing the file (e.g. UploadWizard or upload dialog) to inform the user of the failure before they spend the time filling in the upload details.

效能

如同前面的記載,某些変量可能使速度變得非常慢。 While writing filters, remember that the condition limit is not a good metric of how heavy filters are. For instance, variables like *_recent_contributors or *_links always need a DB query to be computed, while *_pst variables will have to perform parsing of the text, which again is a heavy operation; all these variables should be used very, very carefully. For instance, on Italian Wikipedia it's been observed that, with 135 active filters and an average of 450 used conditions, filters execution time was around 500ms, with peaks reaching 15 seconds. Removing the added_links variable from a single filter, and halving the cases when another filter would use added_lines_pst brought the average execution time to 50ms. 進一步來說:

  • Use _links variables when you need high accuracy and checking for "http://..." in other variables (for instance, added_lines) could lead to heavy malfunctioning;
  • Use _pst variables when you're really sure that non-PST variables aren't enough. You may also conditionally decide which one to check: if, for instance, you want to examine a signature, check first if added_lines contains ~~~;
  • In general, when dealing with these variables, it's always much better to consume further conditions but avoid computing heavy stuff. In order to achieve this, always put heavy variables as last conditions.

Last but not least, note that whenever a variable is computed for a given filter, it'll be saved and any other filter will immediately retrieve it. This means that one single filter computing this variable counts more or less as dozens of filters using it.

关键词

如果未明確指定,關鍵字會將其操作數轉換為字符串

常用功能中通常會包含以下特殊关键词:

  • like(或matches)— 如果左字符串能够匹配右字符串指定的通配符,则返回真值True。
  • in — 如果左字符串包含右字符串,则返回真值True。 注意: 空字符串不被包含在任何其他字符串,亦不包含任何其他字符串(甚至不包含空字符串本身)。
  • contains類似in,但左右操作符交換位置。 注意: 空字符串不被包含在任何其他字符串,亦不包含任何其他字符串(甚至不包含空字符串本身)。
  • rlike(或regex)和irlike — 如果左字符串能够匹配右字符串指定的正则表达式,则返回真值True(irlike區分大小寫)。

此系統使用PCRE。 只有PCRE_UTF8PHP修飾字u)選項被啟用。irlikePCRE_CASELESSPCRE_UTF8選項被啟用(修飾字iu)。

  • if ... then ... else ... end
  • ... ? ... : ...
  • true, false, null

示例

代码 结果 備註
"1234" like "12?4" True
"1234" like "12*" True
"foo" in "foobar" True
"foobar" contains "foo" True
"o" in ["foo", "bar"] True 由於(数组被)轉換為字符串
"foo" regex "\w+" True
"a\b" regex "a\\\\b" True 比對转义字符(半角反斜杠)本身時,你需要使用四個反斜杠或兩個\x5C。 (Either works fine.)
"a\b" regex "a\x5C\x5Cb" True

函数

为了简化一些常见的操作,防滥用过滤器提供了一系列内建的函数。 它们具有相同的格式functionName( arg1, arg2, arg3 ),并且可以放置在常量或変量的位置使用。 它的参数可以是常量,可以是変量,亦可以是别的函数。

函数名 描述
lcase 将第一个参数转换为小写字母并返回之。
ucase 将第一个参数转换为大写字母并返回之。
length 返回第一个字符串参数长度。 如果參數是陣列,將返回元素個數。
string 转换为字符串数据类型。 如果參數是陣列,使用換行字符來串接。
int 转换为整数数据类型。
float 转换为浮点数据类型。
bool 转换为布尔数据类型。
norm 等价于rmwhitespace(rmspecials(rmdoubles(ccnorm(arg1))))
ccnorm 规范化参数中的易混淆/相近字符,并以标准形式返回之。 字符與取代方式的清單可在git找到,例如ccnorm( "Eeèéëēĕėęě3ƐƷ" ) === "EEEEEEEEEEEEE"[8] 此函数 的輸出文字總是大寫。
ccnorm_contains_any 规范化所有参数中的易混淆/相近字符,並檢查第一個字符串的內容是否包含之後字符串的任何一個,若有包含則返回true(參數之數量沒有上限,使用OR邏輯判斷)。 字符與取代方式的清單可在git找到
ccnorm_contains_all 规范化所有参数中的易混淆/相近字符,並檢查第一個字符串的內容是否包含之後的全部字符串,若有包含則返回true(參數之數量沒有上限,使用AND邏輯判斷)。 字符與取代方式的清單可在git找到。
specialratio 返回参数中非字母字符數量除以所有字符數量的值。
rmspecials 移除参数中特殊字符,并返回结果。 (等价于s/[^\p{L}\p{N}]//gs/[^\p{L}\p{N}]//g。)
rmdoubles 移除参数中重复的字符,并返回结果。
rmwhitespace 移除空白(空格、制表符、換行字元)。
count 返回搜尋項目(第一个字符串)在第二个字符串中出现的次数。 如果只给出一个参数,则使用半角逗号分割,并返回分割后片段的个数。
rcount count类似,但搜尋項目改用正则表达式。 可在正则表达式中以(?i)為開頭來取消區別大小寫。 請注意,使用此函数搜尋單純字串時的速度大約只有count的十分之一,因此請盡可能使用count
get_matches MW 1.31+ Looks for matches of the regex needle (first string) in the haystack (second string). Returns an array where the 0 element is the whole match and every [n] element is the match of the n'th capturing group of the needle. Can be made case-insensitive by letting the regular expression start with "(?i)". If a capturing group didn't match, that array position will take value of false.
ip_in_range 若用户IP(第一个字符串)与指定IP段(第二个字符串,使用CIDR塊表示)匹配,则返回true。 Only works for anonymous users. 支持IPv4和IPv6位址。
contains_any 若第一个字符串包含任一個之后参数内的字符串(参数数量無上限,使用邏輯OR模式),则返回true。 如果第一個參數是一個数组,它將被轉換為字符串。
contains_all Returns true if the first string contains every strings from the following arguments (unlimited number of arguments in logic AND mode). 如果第一個參數是一個数组,它將被轉換為字符串。
equals_to_any Returns true if the first argument is identical (===) to any of the following ones (unlimited number of arguments). Basically, equals_to_any(a, b, c) is the same as a===b | a===c, but more compact and saves conditions.
substr Returns the portion of the first string, by offset from the second argument (starts at 0) and maximum length from the third argument (optional).
strlen length相同。
strpos 返回第一次匹配(第二个字符串)位于栈(第一个字符串)的位置,以第三個參數的值起算(可選,預設值為0)。 当匹配發生在栈的开头时,该函数会返回0,所以可能被其他比較操作符判斷为false。 更好的方法是使用===!==以检测是否发现。
str_replace 用替换字符串取代所有匹配的搜索

字符串。 该函数 有3个参数,其依序为:进行搜索的文本,搜索文本,替换文本。

rescape Returns the argument with some characters preceded with the escape character "\", so that the string can be used in a regular expression without those characters having a special meaning.
set 设定一个変量(第一个字符串)為给定值(第二个字符串),以备过滤器进一步使用。 等价语法为:name := value
set_var set相同。

示例

代码 结果 備註
length( "Wikipedia" ) 9
lcase( "WikiPedia" ) wikipedia
ccnorm( "w1k1p3d14" ) WIKIPEDIA ccnorm輸出總是大寫
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移除空白字符、特殊字符與重複字符,然後使用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
ip_in_range( "127.0.10.0", "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']


运算的顺序

运算通常是按从左向右的顺序進行的,但各运算的优先级并不相同。 當過濾器判斷某條件不符合時,會停止檢查之後的條件(由於short-circuit evaluation)並移動至下一個過濾器(除了phab:T43693的狀況)。 運算顺序如下:

  1. 由半角圆括号(())括住的内容会被作为一个独立单元首先运算出。
  2. 将変量/常量转换为它们所代表的数据。(如page_namespace變成0)
  3. 调用函数 (normlcase等)
  4. 進行+-的一元運算(定義正值或負值,例:-1234+1234
  5. 关键词
  6. 布尔反向 (!x)
  7. 求幂 (2**3 → 8)
  8. 乘法相关(乘、除、模)
  9. 加减法 (3-2 → 1)
  10. 比较。 (<, >, ==)
  11. 布尔运算 (&, |, ^)

示例

  • A & B | C等同於(A & B) | C,不同於A & (B | C)。 需特別留意,false & true | truefalse & false | true的計算結果都是true
  • A | B & C等同於(A | B) & C,不同於A | (B & C)。 需特別留意,true | true & falsetrue | false & false的計算結果都是false

條件計數

The condition limit is (more or less) tracking the number of comparison operators + number of function calls entered.

Further explanation on how to reduce conditions used can be found at Extension:AbuseFilter/Conditions .

排除

儘管防濫用過濾器的檢查功能會將「回退(rollback)」操作標示為編輯,但防濫用過濾器不會檢查回退操作。 [9]

实用链接

註釋

  1. 將陣列和其他型態比較必定會返回false,除了以上的範例
  2. 2.0 2.1 2.2 2.3 2.4 2.5 檔案上傳(action='upload')的可用的變數只有user_*, page_*, file_sha1, file_size, file_mime, file_mediatype, file_width, file_height, file_bits_per_channel(最後五個變數在MediaWiki 1.27 gerrit:281503才被加入)。 所有的file_*變數對其他動作都不可用(包含action='edit')。
  3. 從MediaWiki 1.28 (https://gerrit.wikimedia.org/r/#/c/295254/)起
  4. 已經有多個使用此变量的過濾器(12)被顯示在AbuseFilterSlow Grafana dashboard當中(需要logstash權限才能查看)。 將此變數移動到過濾器的尾端似乎有所幫助。
  5. 参见phabricator:T191722
  6. 此commit起棄用,且自起停用。
  7. 已經有某些使用此变量的過濾器($1)被顯示在AbuseFilterSlow Grafana dashboard當中(;需要logstash權限才能查看)。 例如,不要使用"text" in edit_diff_pst(甚至是edit_diff),而是考慮使用"text" in added_lines & !("text" in removed_lines)
  8. 注意phab:T27619。 您可以使用Special:AbuseFilter/tools來評估ccnorm( "your string" )以查看轉換後的字符。
  9. T24713 - AF不匹配回退動作