Jump to content

Extension:AbuseFilter/規則の書式

From mediawiki.org
This page is a translated version of the page Extension:AbuseFilter/Rules format and the translation is 87% complete.
Outdated translations are marked like this.

規則は 1 つのカスタム言語です。規則は C、Java、Perl のような言語の条件文と同様の書式です。

文字列

特定のリテラルの定義には、(文字列の場合) 半角欧文の単引用符または複引用符で挟むか、(数値は浮動小数点と整数の両方))見た目のまま入力します(訳注:「'」もしくは「"」)。 改行は \nタブ文字\t、引用符文字はバックスラッシュを付けて表記します。

1件の条件文に対して2点の文字列リテラルもしくはvars文字列結合するには、+ (加算) 符号を用います。

"これは文字列です"
'これも文字列です'
'引用符\'がありますが、この文字列も正しいです'
"この文字列は\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)
)

配列

AbuseFilter には非結合配列に対応し、以下の使い方ができます。

警告! 警告: page_namespace in [14, 15]のような式は期待どおりに機能しない可能性があります。 これは、page_namespace14、または5の場合もtrueと評価されます。 詳細および可能な回避策については、T181024を参照してください。
my_array := [ 5, 6, 7, 10 ];
my_array[0] == 5
length(my_array) == 4
int( my_array ) === 4 // 長さと同等
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 // 注記:配列を文字列にキャストする方法すなわち、改行による内包に依拠
1 in my_array == true // 注記:'in' が引数を文字列にキャストし、1が '10' に捕捉されて true を返すため発生。
my_array[] := 57; // これにより、配列の末尾に要素を追加
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

論理演算子

複数の条件のすべて、もしくはいずれか、またはたった1件の条件に限定して true である場合のみ一致します。

  • x | y — OR – 条件のいずれかが true の場合に true を返します。
  • x & y — AND – 条件の両方が true の場合に true を返します。
  • x ^ y — XOR – 条件の片方のみが true の場合に true を返します。
  • !x — NOT – 条件が true ではない場合に 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
!0 true

単純な比較

以下の統語論 (syntax) を用いると、varsを他の変数やリテラルと比較できます:

  • <、​> – 左辺の被害演算子が右辺のそれぞれよりも小さい/大きい 場合、true を返します。 ご注意: 被演算子は文字列にキャストされ、PHPで発生するように、null < 任意の数値 === true および null > 任意の数値 === false
  • <=、​>= – 左辺の被害演算子が右辺のそれぞれより小さいか等しい/より大きいか等しい 場合、true を返します。 ご注意: 被演算子は文字列にキャストされ、PHPで発生するように、null <= 任意の数値 === true および null >= 任意の数値 === false
  • == (または =) と != — 左辺の被害演算子が右辺のそれぞれと等しい/等しくない 場合、true を返します。
  • ===、​!== – 左辺が右辺のそれぞれと等しい/等しくない 場合で、しかも左辺のデータタイプが右辺のそれぞれと 等しい/等しくない 場合、true を返します。
結果
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]

組み込みの変数

不正利用フィルターでは、さまざまな変数をその変数名でパーサーに渡せます。 これらの変数へは、リテラルを使用できるような場所に入力することでアクセスできます。 不正利用記録内の各リクエストに関連付けられた変数を閲覧することもできます。

編集フィルタの変数

常に利用できる変数

警告! 警告: 利用者関連の変数は常に利用でき、例外は1つです:アカウント作成時に作成者がログインしていない状態。 user_ で始まる変数はすべて影響を受けます。
説明 名前 データ型 注記
操作 action 文字列 以下のいずれか1つ: edit, move, createaccount, autocreateaccount, delete, upload[2], stashupload[3]
変更のUnixタイムスタンプ timestamp 文字列 int(timestamp) によって日付、時刻、曜日その他の算出に使える数値を返します。
ウィキのデータベース名 ($1) wiki_name 文字列 たとえば、英語版ウィキペディアでは"enwiki"、イタリア語版ウィキクォートは"itwikiquote"です。
ウィキの言語コード ($1) wiki_language 文字列 たとえば、英語版ウィキペディアでは"en"、イタリア語版ウィキクォートでは"it"です。Commons、Meta、Wikidataなどの多言語Wikiも「en」として報告されます。
利用者の編集回数 ($1) user_editcount 整数/null 匿名利用者の場合のみ null。
利用者のアカウント名 ($1) (IP in case the user is not registered) user_name 文字列
操作の "createaccount" と "autocreateaccount" に関しては、作成されたアカウント名を調べるには accountname を使用します。
利用者アカウントの種類 ($1) user_type string The type of the user, which will be one of ip, temp (if the user is using a temporary account ), named, external, or unknown.
メールアドレスを確認した時刻 ($1) user_emailconfirm 文字列/null 以下の形式: YYYYMMDDHHMMSS メールアドレスが確認されていない場合は null です。
利用者アカウントの登録期間 ($1) user_age 整数 秒単位。 匿名利用者の場合は 0。
利用者がブロックされているかどうか ($1) user_blocked 真偽値 True は登録利用者でブロック中に相当。 該当者がブロックを受けていない登録利用者であっても、ブロック中の IP アドレスによる編集は true。 その他は False。
部分ブロックと完全ブロックは区別しません。
利用者が属するグループ (暗黙的なものも含む) ($1) user_groups 文字列の配列 Special:ListGroupRights を参照してください
利用者が持つ権限 ($1) user_rights 文字列の配列 Special:ListGroupRights を参照してください
ページ ID ($1) article_articleid 整数 (廃止予定) 代わりに page_id を使用してください。
ページ ID ($1) (サイドバーの「ページ情報」リンクから確認できます) page_id 整数 新規ページでは 0 になりますが、過去の一致を調べるときにこの値は信頼できません。 過去の一致を調べる際に厳密な結果が必要な場合は、新規ページ作成を識別するために「page_age == 0」を使用してください。 (ただし処理は遅くなる点にご留意ください。) This issue has been fixed in 9369d08, merged on September 11th 2023.
ページの名前空間 ($1) article_namespace 整数 (廃止予定) 代わりに page_namespace を使用してください。
ページの名前空間 ($1) page_namespace 整数 名前空間の添字 を参照します Check for namespace(s) using expressions like "page_namespace == 2" or "equals_to_any(page_namespace, 1, 3)"
ページ作成からの経過期間 (秒) ($1) page_age 整数 初版の編集からの経過秒数 (もしくは新規作成ページは 0)。 これは信頼できるデータですが逐次的ではありません。精度にこだわらない場合は page_id の利用をご検討ください。
ページ名 (名前空間を除く) ($1) article_text 文字列 (廃止予定) 代わりに page_title を使用してください。
ページ名 (名前空間を除く) ($1) page_title 文字列
完全なページ名 ($1) article_prefixedtext 文字列 (廃止予定) 代わりに page_prefixedtitle を使用してください。
完全なページ名 ($1) page_prefixedtitle 文字列
ページの編集保護レベル ($1) article_restrictions_edit 文字列 (廃止予定) 代わりに page_restrictions_edit を使用してください。
ページの編集保護レベル ($1) page_restrictions_edit 文字列の配列
ページの移動保護レベル ($1) article_restrictions_move 文字列 (廃止予定) 代わりに page_restrictions_move を使用してください。
ページの移動保護レベル ($1) page_restrictions_move 文字列の配列
ファイルのアップロード保護レベル ($1) article_restrictions_upload 文字列 (廃止予定) 代わりに page_restrictions_upload を使用してください。
ファイルのアップロード保護レベル ($1) page_restrictions_upload 文字列の配列
ページの作成保護レベル ($1) article_restrictions_create 文字列 (廃止予定) 代わりに page_restrictions_create を使用してください。
ページの作成保護レベル ($1) page_restrictions_create 文字列の配列
直前10人のページへの投稿者 ($1) article_recent_contributors array of strings (廃止予定) 代わりに page_recent_contributors を使用してください。
直前10人のページへの投稿者 ($1) page_recent_contributors 文字列の配列 これは遅くなる傾向があります (#パフォーマンス節を参照)。 これ以前の条件文が false になるようにして、不用なクエリ発動を予防してください。 当該利用者以外が特定ページ (?) の編集をしておらず、スキャン範囲を直近の100版にしぼった場合、この変数は空です。
ページの初版作成者 ($1) article_first_contributor 文字列 (廃止予定) 代わりに page_first_contributor を使用してください。
ページの初版作成者 ($1) page_first_contributor 文字列 これは遅くなる傾向があります (#パフォーマンス節を参照)。[4] これ以前の条件文が false になるようにして、不用なクエリ発動を予防してください。

一部の操作で利用できる変数

警告! 警告: 使用する変数が現在のactionで使用可能かどうか、常に確認してください。例えば、action変数を利用することで確認ができます。 編集操作の時にaccountnameが使用されていたり、削除操作の時にedit_deltaが使用されていたりする、誤ったコードは全て"false"を返します。
編集変数は、過去のアップロードを検証する際には使用できません。 (T345896)
説明 名前 データ型 注記
編集の要約や理由 ($1) summary 文字列 編集がフィルタによって検査された 、MediaWiki によって要約 (「新しい節」や「ページの白紙化」など) が自動生成される手順のため、デバッガには必須と書いてあるものの、実際に補足することはありません。 The variable contains whatever the user sees in the edit summary window, which may include MediaWiki preloaded section titles.[5]
その編集が細部の編集かどうか (廃止) minor_edit 文字列 無効化されており、2016年から2018年まですべての入力に対し false に設定。[6]
編集前の古いウィキテキスト ($1) old_wikitext 文字列 この変数は膨大な場合があります。 パフォーマンス向上のため、利用できる場合はremoved_lines の使用をご検討ください。
編集後の新しいウィキテキスト ($1) new_wikitext 文字列 この変数は膨大な場合があります。 パフォーマンス向上のため、利用できる場合はadded_lines の使用をご検討ください。
編集で変更された部分の Unified diff 形式差分 ($1) edit_diff 文字列
編集で変更された部分の Unified diff 形式差分 (pre-save変換前) ($1) edit_diff_pst 文字列 これは遅くなる傾向があります (#パフォーマンス節を参照)。 場合により added_linesremoved_lines の両方を調べると効果があります。[7]
新しいページのサイズ ($1) new_size 整数
古いページのサイズ ($1) old_size 整数
編集による変更サイズ ($1) edit_delta 整数
編集で追加された行 (pre-saveの変換前) ($1) added_lines_pst 文字列の配列 できれば、より効率的な added_lines をご使用ください。
編集で追加された行 ($1) added_lines 文字列の配列 + で始まる最終的な差分の全行を含みます
編集で削除された行 ($1) removed_lines 文字列の配列
新しい本文中のすべての外部リンク ($1) all_links 文字列の配列 This tends to be slow (see #Performance).
編集前のページに含まれていたリンク ($1) old_links 文字列の配列 This tends to be slow (see #Performance).
編集で追加されたすべての外部リンク ($1) added_links 文字列の配列 これは遅くなる傾向があります (#パフォーマンス節を参照)。 まず added_lines と照合、次に added_links と照合し、遅延する編集を減らします。 これはMediaWiki の外部リンクの規則に準拠 します。 一意のリンクのみ配列に追加します。 リンクを変更すると、1つの追加リンクと1つの削除リンクとしてカウントされます。
編集で除去されたすべての外部リンク ($1) removed_links 文字列の配列 これは遅くなる傾向があります (#パフォーマンス節を参照)。 まず removed_lines と照合、次に removed_links と照合し、遅延する編集を減らします。 これはMediaWiki の外部リンクの規則に準拠 します。 一意のリンクのみ配列に追加します。 リンクを変更すると、1つの追加リンクと1つの削除リンクとしてカウントされます。
保存前変換適用後の新しいウィキテキスト ($1) new_pst 文字列 This variable can be very large.
新しい版のパース済みHTMLソース ($1) new_html 文字列 この変数は膨大な場合があります。 パフォーマンス向上のため、利用できる場合はadded_lines の使用をご検討ください。
マークアップを除く新しい本文 ($1) new_text 文字列 この変数は膨大な場合があります。 パフォーマンス向上のため、利用できる場合はadded_lines の使用をご検討ください。
古いウィキテキストから生成されたHTML old_html 文字列 パフォーマンス上の理由で無効化。
マークアップを除いた、使用されていない古い本文 old_text 文字列 パフォーマンス上の理由で無効化。
最後のページ編集からの経過期間 (秒) ($1) page_last_edit_age integer or null null when the page does not exist
ファイルのSHA1ハッシュ ($1) file_sha1 文字列 [2]
ファイルサイズ (bytes) ($1) file_size 整数 バイト単位のファイル サイズ[2]
ファイルの幅 (px) ($1) file_width 整数 ピクセルでの幅[2]
ファイルの高さ (px) ($1) file_height 整数 ピクセルでの高さ[2]
ファイルのカラーチャネル毎のビット数 ($1) file_bits_per_channel 整数 カラーチャンネルあたりのbit数。[2]
ファイルのMIMEタイプ ($1) file_mime 文字列 ファイルのMIMEタイプ。[2]
ファイルのメディア種別 ($1) file_mediatype 文字列 ファイルのメディアタイプ[8][2]
移動先のページID ($1) moved_to_articleid 整数 (廃止予定) 代わりに moved_to_id を使用してください。
移動先のページID ($1) moved_to_id 整数
移動先のページ名 ($1) moved_to_text 文字列 (廃止予定) 代わりに moved_to_title を使用してください。
移動先のページ名 ($1) moved_to_title 文字列
移動先の完全なページ名 ($1) moved_to_prefixedtext 文字列 (廃止予定) 代わりに moved_to_prefixedtitle を使用してください。
移動先の完全なページ名 ($1) moved_to_prefixedtitle 文字列
移動先ページの名前空間 ($1) moved_to_namespace 整数
移動先ページの作成からの経過期間 (秒単位) ($1) moved_to_age 整数
最後の移動先ページの編集からの経過期間 (秒) ($1) moved_to_last_edit_age integer or null null when the target page does not exist
移動先ページの編集保護レベル ($1) moved_to_restrictions_edit 文字列の配列 page_restrictions_editと同じですが、移動のターゲット用です。
移動先ページの移動保護レベル ($1) moved_to_restrictions_move 文字列の配列 page_restrictions_moveと同じですが、移動のターゲット用です。
移動先ファイルのアップロード保護レベル ($1) moved_to_restrictions_upload 文字列の配列 page_restrictions_uploadと同じですが、移動のターゲット用です。
移動先ページの作成保護レベル ($1) moved_to_restrictions_create 文字列の配列 page_restrictions_createと同じですが、移動のターゲット用です。
移動先ページに貢献した最近の10人の利用者 ($1) moved_to_recent_contributors 文字列の配列 page_recent_contributorsと同じですが、移動のターゲット用です。
移動先ページの初版作成者 ($1) moved_to_first_contributor 文字列 page_first_contributorと同じですが、移動のターゲット用です。
移動元ページの名前空間 ($1) moved_from_namespace 整数
移動元のページ名 ($1) moved_from_text 文字列 (廃止予定) 代わりに moved_from_title を使用してください。
移動元のページ名 ($1) moved_from_title 文字列
移動元の完全なページ名 ($1) moved_from_prefixedtext 文字列 (廃止予定) 代わりに moved_from_prefixedtitle を使用してください。
移動元の完全なページ名 ($1) moved_from_prefixedtitle 文字列
移動元のページID ($1) moved_from_articleid 整数 (廃止予定) 代わりに moved_from_id を使用してください。
移動元のページID ($1) moved_from_id 整数
移動元ページの作成からの経過期間 (秒単位) ($1) moved_from_age 整数
最後の移動元ページの編集からの経過期間 (秒) ($1) moved_from_last_edit_age integer
移動元ページの編集保護レベル ($1) moved_from_restrictions_edit 文字列の配列 page_restrictions_editと同じですが、移動ページ用です。
移動元ページの移動保護レベル ($1) moved_from_restrictions_move 文字列の配列 page_restrictions_moveと同じですが、移動ページ用です。
移動元ファイルのアップロード保護レベル ($1) moved_from_restrictions_upload 文字列の配列 page_restrictions_uploadと同じですが、移動ページ用です。
移動元ページの作成保護レベル ($1) moved_from_restrictions_create 文字列の配列 page_restrictions_createと同じですが、移動ページ用です。
移動元ページに貢献した最近の10人の利用者 ($1) moved_from_recent_contributors 文字列の配列 page_recent_contributorsと同じですが、移動ページ用です。
移動元ページの初版作成者 ($1) moved_from_first_contributor 文字列 page_first_contributorと同じですが、移動ページ用です。
アカウント名 (アカウント作成時のみ) ($1) accountname 文字列
古い版のコンテンツ モデル old_content_model 文字列 コンテンツ モデルの変更についての情報は Help:ChangeContentModel を参照してください
新しい版のコンテンツ モデル new_content_model 文字列 コンテンツ モデルの変更についての情報は Help:ChangeContentModel を参照してください

Protected variables

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 Name Data type Notes
利用者アカウントの IP (匿名利用者と臨時アカウントのみ) ($1) user_unnamed_ip string User IP for anonymous users/temporary accounts
This returns null for registered users.


他の拡張機能からの変数

これらの変数のほとんどは、過去の編集を検証する際に常にfalseに設定されており、編集が行われた時点の実際の値を反映していない可能性があります。 T102944 を参照してください。
説明 名前 データ型 追加した拡張機能
利用者の所属グローバルグループ ($1) global_user_groups 配列 CentralAuth
利用者のグローバル編集回数 ($1) global_user_editcount 整数 CentralAuth
利用者が所属するグローバルグループ (アカウント作成時) ($1) global_account_groups array Available only when action is createaccount (then it is always empty) or autocreateaccount. CentralAuth
利用者のグローバル編集回数 (アカウント作成時) ($1) global_account_editcount integer Available only when action is createaccount (then it is always zero) or autocreateaccount. CentralAuth
この変更を実行するために使用された OAuth コンシューマー ($1) oauth_consumer 整数 OAuth
Wikiの構造化議論の掲示板のページID board_articleid 整数 (廃止予定) 代わりに board_id を使用してください。 StructuredDiscussions
Wikiの構造化議論の掲示板のページID board_id 整数 StructuredDiscussions
Namespace of Structured Discussions board ($1) board_namespace 整数 名前空間の添字 を参照します StructuredDiscussions
Title (without namespace) of Structured Discussions board ($1) board_text 文字列 (廃止予定) 代わりに board_title を使用してください。 StructuredDiscussions
Title (without namespace) of Structured Discussions board ($1) board_title 文字列 StructuredDiscussions
Full title of Structured Discussions board ($1) board_prefixedtext 文字列 (廃止予定) 代わりに board_prefixedtitle を使用してください。 StructuredDiscussions
Full title of Structured Discussions board ($1) board_prefixedtitle 文字列 StructuredDiscussions
翻訳単位の原文 translate_source_text 文字列 Translate
翻訳先言語 translate_target_language 文字列 This is the language code, like en for English. Translate
Tor 末端ノードを通じてなされた変更かどうか ($1) tor_exit_node 真偽値 true if the action comes from a tor exit node. TorBlock
利用者が携帯機器版インターフェイスで編集しているかどうか($1) user_mobile 真偽値 true for mobile users, false otherwise. MobileFrontend
利用者が携帯機器アプリから編集しているかどうか user_app 真偽値 true if the user is editing from the mobile app, false otherwise. MobileApp
ページ閲覧回数[1] article_views 整数 (廃止予定) 代わりに page_views を使用してください。 HitCounters
ページ閲覧回数[2] page_views 整数 the amount of page views HitCounters
Source page views[3] moved_from_views 整数 the amount of page views of the source page HitCounters
Target page views[4] moved_to_views 整数 the amount of page views of the target page HitCounters
Whether the IP address is blocked using the stopforumspam.com list[5] sfs_blocked 真偽値 Whether the IP address is blocked using the stopforumspam.com list StopForumSpam

注記

action='move' のとき、変数summaryactiontimestampおよびuser_*のみ利用できます。 page_* 変数も利用可能ですが、接頭辞はmoved_from_moved_to_、すなわち元の記事名と変更後の値を反映するものに置換されます。 たとえば moved_from_titlemoved_to_titlepage_title で代行。

MediaWiki 1.28 (gerrit:295254) 以降、action='upload' はアップロードの公開に使われ、スタッシュへのアップロードは対象外です。 新規に導入された action='stashupload' は、あらゆるアップロードに適用されスタッシュへのアップロードも対象です。 これは役割が過去の action='upload' に似ており、ファイルのメタデータ変数 (file_*) のみ返します。 ページ編集に関連する変数は summarynew_wikitext およびその他いくつかを含め、action='upload' で利用できるようになりました。 アップロード1件ごとにフィルター action='stashupload' が呼び込まれるときは常に action='upload' と一緒です (スタッシュへのアップロードの場合)。action='edit' では呼び込みません。

フィルタ執筆者はフィルタのコードで action='stashupload' | action='upload' を使用するべきで、ファイルの内容のみ対象にファイルを検査する場合がこれに該当し – たとえば低解像度ファイルの掲載を拒否する場合 – action='upload' が使えるのは編集におけるウィキ文の部分の検証も必要な場合に限ります – 一例として説明のないファイルを掲載拒否する場合。 これはファイルアップロード時にファイル本体のアップロードと公開を分離するツール (例えば アップロードウィザード または アップロード ダイアログ ) から利用者にすぐに通知し、無駄にアップロード詳細の記入をしなくて済むようにできます。

パフォーマンス

上記の表内で説明した通り、これらの中には非常に時間がかかる変数があります。 フィルタの記述において、条件文の制限はフィルタの重さを図るのに不適切である点にご留意ください。 一例として変数 *_recent_contributors*_links は常にDBクエリの演算を求めますが、変数 *_pst が求めるテキストの解析実行もまた、重い操作です。これらの変数すべての使用は、非常に慎重に扱う必要があります。 たとえばイタリア語ウィキペディアで測定したところ、有効なフィルタ135件に対して使用される条件文は平均450件で、フィルタ実行時間はおよそ500ミリ秒、最長で15秒に至ります。 単一のフィルタから added_links 変数を除去すると、別のフィルターで added_lines_pst を使用した場合より件数を半減させ、平均実行時間を50ミリ秒に縮めました。 詳細の説明:

  • 高精度を求める場合は _links 変数を使用、重く誤動作に結びつきがちな「http://...」を他の変数から検出 (例: added_lines)。
  • 非常 PST 変数だけでは不十分だと感じる場合は、_pst 変数を使います。 You may also conditionally decide which one to check: if, for instance, you want to examine a signature, check first if added_lines contains ~~~;
  • 一般論としてこれら変数の取り扱いには常に条件を増やすことはしても、重くしたものを計算処理にかけることは避けます。 これを実現するには、重い変数を条件文の末尾に置きます。

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.

キーワード

Where not specifically stated, keywords cast their operands to strings

The following special keywords are included for often-used functionality:

  • like (または matches) は、左辺が右辺のグロブパターンに一致する場合に true を返します。
  • in は、右辺 (文字列) が左辺を含む場合に true を返します。 注: empty strings are not contained in, nor contain, any other string (not even the empty string itself).
  • containsin に似た役割をしますが、右辺と左辺が入れ替わります。 注: empty strings are not contained in, nor contain, any other string (not even the empty string itself).
  • rlike (または regex)、irlike は、左辺が右辺の正規表現に一致する (含む) 場合に true を返します (irlike は大文字を区別しません (insensitive))。
    • このシステムは PCRE を使用します。
    • The only PCRE option enabled is PCRE_UTF8 (modifier u in PHP); for irlike both PCRE_CASELESS and PCRE_UTF8 are enabled (modifier iu).
  • if ... then ... end
  • 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 Due to the string cast
"foo" regex "\w+" True
"a\b" regex "a\\\\b" True 正規表現を使用してエスケープ文字であるバックスラッシュを検索するには、4つのバックスラッシュまたは、2つの\x5Cを使用する必要があります。 (いずれかが正常に動作します。)
"a\b" regex "a\x5C\x5Cb" True

関数

よくある問題への対応をを容易にするために多くの関数が内蔵されています。 これらは functionName( arg1, arg2, arg3 ) のような一般的な形式で実行できます。関数は、リテラル、変数の代わりに使用できます。 引数として、リテラル、変数を渡すことができ、さらに他の関数も渡せます。

名前 説明
lcase 引数を小文字に変換したものを返します。
ucase 引数を大文字に変換したものを返します。
length 引数として渡された文字列の長さを返します。 引数が配列の場合は、その要素数を返します。
string 文字列のデータ型にキャストします。 引数が配列の場合は、改行文字で連結 (implode) します。
int 整数のデータ型にキャストします。
float 浮動小数点数のデータ型にキャストします。
bool 真偽値のデータ型にキャストします。
norm rmwhitespace(rmspecials(rmdoubles(ccnorm(arg1)))) と同等です。
ccnorm 引数に含まれる紛らわしい/よく似た字形の文字を正規化した文字列を返します。 置換対象の文字の一覧は git にあります。例: ccnorm( "Eeèéëēĕėęě3ƐƷ" ) === "EEEEEEEEEEEEE"[9] この関数の出力は常に大文字。 While not expensive, this function isn't cheap either, and could slow a filter down if called many times.
ccnorm_contains_any 引数に含まれる紛らわしい/よく似た字形の文字を正規化した文字列を返し、第1引数が残りの引数のいずれかの文字列に一致する場合に true を返します。(論理 OR モードでは引数の数は無制限。)

ます。 置換対象の文字の一覧は git にあります。 Due to the usage of ccnorm, this function can be slow if passed too many arguments.

ccnorm_contains_all 引数に含まれる紛らわしい/よく似た字形の文字を正規化した文字列を返し、第1引数が残りの引数のすべての文字列に一致する場合に true を返します。(論理 AND モードでは引数の数は無制限。) 置換対象の文字の一覧は git にあります。 Due to the usage of ccnorm, this function can be slow if passed too many arguments.
specialratio 引数に含まれる英数字以外の文字数を全体の文字数で割ったものを返します。
rmspecials 引数からすべての特殊文字を除去し、その結果を返します。 Does not remove whitespace. (s/[^\p{L}\p{N}\s]//g と同等です。)
rmdoubles 引数から連続する文字を除去し、その結果を返します。
rmwhitespace 空白文字 (空白、タブ文字、改行) を除去します。
count 文字列haystack[10](第2引数)の中で、needle[11](第1引数)が出現する回数を返します。) 引数が1つしか指定されていない場合は、カンマでそれを分割し、セグメント数を返します。
rcount count と同様ですが、こちらは needle (第1引数) に正規表現を使用します。 正規表現の先頭に「(?i)」を付けることで、大文字小文字を区別しなくすることもできます。 プレーンな文字列の場合、この関数は count[12] と比較すると最大50倍遅い場合があるため、可能であれば count[13] を使用するようご留意ください。
get_matches MW 1.31+ haystack (2番目の文字列) 内で正規表現の needle (1番目の文字列) の一致を探します。 完全一致の要素が 0 件で、[n] のすべての要素が needle の n番目のキャプチャグループと一致する配列を返します。 正規表現の先頭に「$2」を付けることで、大文字小文字を区別しなくすることもできます。 If a capturing group didn't match, that array position will take value of false.
ip_in_range Returns true if user's IP (first string) matches the specified IP range (second string, can be in CIDR notation, explicit notation like "1.1.1.1-2.2.2.2", or a single IP). 匿名利用者に対してのみ動作します。 IPv4 ならびに IPv6 アドレスの両方に対応。
ip_in_ranges Returns true if user's IP (first string) matches any of the specified IP ranges (following strings in logic OR mode, can be in CIDR notation, explicit notation like "1.1.1.1-2.2.2.2", or a single IP). Only works for anonymous users. Supports both IPv4 and IPv6 addresses.
contains_any 第1引数が、残りの引数のいずれかの文字列に一致する場合に true を返します。(論理 OR モードでは引数の数に制限はありません。) 1番目の引数が配列の場合、文字列にキャストします。
contains_all 第1引数が、残りの引数のすべての文字列に一致する場合に true を返します。(論理 AND モードでは引数の数に制限はありません。) 1番目の引数が配列の場合、文字列にキャストします。
equals_to_any 1番目の引数が次のいずれかと一致 (===) する場合、true を返します (引数の数は無制限)。 基本的に equals_to_any(a, b, c)a===b | a===c と等価であっても、よりコンパクトで条件文は短くなります。
substr 第1引数を対象に、第2引数で指定された位置 (先頭は 0) から第3引数 (省略可能) で指定された長さだけの文字列を返します。
strlen length と同一です。
strpos haystack (最初の文字列) でneedle (2番目の文字列) が最初に現れる位置を、3番目の引数からオフセットして始まる数値として返します (オプション、既定値は 0) 。 この関数は haystack (第1引数) の文頭に needle (第2引数) があった場合に 0 を返すため、他の比較演算子が 0 を false と誤認するおそれがあります。 === または !== を使用して、存在するかどうか確認するといいでしょう。 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 出現する検索文字列をすべて置換文字列に置き換えます。 この関数が取る3つの因数の順序:検索実行の文、検索対象の文、置換文。
str_replace_regexp Replaces all occurrences of the search string with the replacement string using regular expressions. The function takes 3 arguments in the following order: text to perform the search on, regular expression to match, replacement expression.
rescape 引数として先頭にエスケープ文字 "\"を付けた複数の文字を返すため、文字列に特別な意味を持たせることなく正規表現で使用できます。
set 変数 (1番目の文字列) に与えられた値 (2番目の引数) を設定し、フィルターでさらに使用。 別の構文もあります: 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
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']

演算の順序

一般に、演算は左から右へ実行されますが、演算が解決される際の順序があります。 フィルターが条件のいずれかの処理に失敗すると、(短絡評価により) 残りの部分のチェックは停止され、次のフィルターに移ります。 評価順序は以下のようになります:

  1. 括弧 (()) で囲まれている文字列は単一の単位として評価されます。
  2. 変数やリテラルをそれぞれのデータに変換。 (例: page_namespace を 0 に変換)
  3. 関数呼び出し (normlcase、など)
  4. 単項演算子 +- (正の数値・負の数値として -1234+1234 のような形で)
  5. キーワード (inrlike など)
  6. 論理値の反転 (!x)
  7. べき乗 (2**3 → 8)
  8. 乗算、除算、剰余
  9. 加算、減算 (3-2 → 1)
  10. 比較。 (<, >, ==)
  11. 論理演算子。 (&, |, ^)
  12. Ternary operator (... ? ... : ...)
  13. Assignments (:=)

  • 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 と等価です。
  • added_lines rlike "foo" + "|bar" is wrong, use added_lines rlike ("foo" + "|bar") instead.

条件のカウント

条件制限は (多かれ少なかれ) 比較演算子の数と入力された関数呼び出しの数を加算した件数分の追跡です。

使用する条件文を減らすことに関して、詳細はExtension:AbuseFilter/Conditions をご参照ください。

除外

編集フィルタ検証関数は「巻き戻し」行為を編集として検知しますが、このフィルタは巻き戻し行為を一致対象として評価はしません。[14]

有用なリンク

注記

  1. 上記は例外ですが、配列を別タイプと比較すると常に戻り値は false
  2. 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 ファイル アップロード (action='upload') で現在利用できるのは以下の変数のみです: user_*, page_*, file_sha1, file_size, file_mime, file_mediatype, file_width, file_height, file_bits_per_channel (最後の5種類は MediaWiki 1.27 gerrit:281503 リリースで追加されました)。 file_* のすべての変数は、ファイル アップロード以外の操作 (action='edit' を含む) では利用できません。
  3. MediaWiki 1.28 (gerrit:295254) 以降
  4. この変数を使用する複数のフィルタ (12) がAbuseFilterSlow Grafana ダッシュボードに提示されています (閲覧には logstash アクセスが必要)。 フィルタの末尾にこの変数を移すと効果があるようです。
  5. phabricator:T191722 を参照してください
  6. このコミット以降は非推奨、こちらで無効化。
  7. この変数を使用する複数のフィルタが AbuseFilterSlow Grafana ダッシュボードに提示されています (サンプルは閲覧に logstash アクセスが必要)。 たとえば "text" in edit_diff_pst (あるいは edit_diff も), を使わず、"text" in added_lines & !("text" in removed_lines) のようなものの使用をご検討ください
  8. タイプの一覧はソースコードを参照してください。
  9. phab:T27619 に留意します。 Special:AbuseFilter/tools を使って ccnorm( "your string" ) を評価すると、変換した文字を確認できます。
  10. 「haystack」は大きな文字列、概ね文章レベルの文字列を指す。(訳注:英語の諺“look for a needle in a haystack”(干し草の山から針を捜す)より。干し草の山(膨大なもの)の中から針(細かなもの)を探す様を大きな文字列から小さな文字列を探す様子に喩えている。
  11. 「needle」は小さな文字列、概ね文章レベルの文字列を指す。語源は上の注釈を参照。
  12. https://3v4l.org/S6IGP
  13. https://3v4l.org/S6IGP
  14. T24713 - 編集フィルタに一致しない巻き戻し