Extension:AbuseFilter/規則の書式
規則は 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_namespace が1、4、または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"を返します。 |
説明 | 名前 | データ型 | 注記 |
---|---|---|---|
編集の要約や理由 ($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_lines と removed_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 の使用をご検討ください。
|
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.
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. |
他の拡張機能からの変数
説明 | 名前 | データ型 | 値 | 追加した拡張機能 |
---|---|---|---|---|
利用者の所属グローバルグループ ($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'
のとき、変数summary
、action
、timestamp
およびuser_*
のみ利用できます。
page_*
変数も利用可能ですが、接頭辞はmoved_from_
とmoved_to_
、すなわち元の記事名と変更後の値を反映するものに置換されます。
たとえば moved_from_title
か moved_to_title
を page_title
で代行。
MediaWiki 1.28 (gerrit:295254) 以降、action='upload'
はアップロードの公開に使われ、スタッシュへのアップロードは対象外です。
新規に導入された action='stashupload'
は、あらゆるアップロードに適用されスタッシュへのアップロードも対象です。
これは役割が過去の action='upload'
に似ており、ファイルのメタデータ変数 (file_*
) のみ返します。
ページ編集に関連する変数は summary
と new_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 ifadded_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.
キーワード
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).contains
はin
に似た役割をしますが、右辺と左辺が入れ替わります。 注: empty strings are not contained in, nor contain, any other string (not even the empty string itself).rlike
(またはregex
)、irlike
は、左辺が右辺の正規表現に一致する (含む) 場合に true を返します (irlike
は大文字を区別しません (insensitive))。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_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'] |
演算の順序
一般に、演算は左から右へ実行されますが、演算が解決される際の順序があります。 フィルターが条件のいずれかの処理に失敗すると、(短絡評価により) 残りの部分のチェックは停止され、次のフィルターに移ります。 評価順序は以下のようになります:
- 括弧 (
(
と)
) で囲まれている文字列は単一の単位として評価されます。 - 変数やリテラルをそれぞれのデータに変換。 (例:
page_namespace
を 0 に変換) - 関数呼び出し (
norm
、lcase
、など) - 単項演算子
+
、-
(正の数値・負の数値として-1234
、+1234
のような形で) - キーワード (
in
、rlike
など) - 論理値の反転 (
!x
) - べき乗 (
2**3 → 8
) - 乗算、除算、剰余
- 加算、減算 (
3-2 → 1
) - 比較。 (
<
,>
,==
) - 論理演算子。 (
&
,|
,^
) - Ternary operator (
... ? ... : ...
) - Assignments (
:=
)
例
A & B | C
は(A & B) | C
と等価ですが、A & (B | C)
とは等価ではありません。 具体的には、false & true | true
とfalse & false | true
はどちらもtrue
と等価です。A | B & C
は(A | B) & C
と等価ですが、A | (B & C)
とは等価ではありません。 具体的には、true | true & false
とtrue | false & false
はどちらもfalse
と等価です。added_lines rlike "foo" + "|bar"
is wrong, useadded_lines rlike ("foo" + "|bar")
instead.
条件のカウント
条件制限は (多かれ少なかれ) 比較演算子の数と入力された関数呼び出しの数を加算した件数分の追跡です。
使用する条件文を減らすことに関して、詳細はExtension:AbuseFilter/Conditions をご参照ください。
除外
編集フィルタ検証関数は「巻き戻し」行為を編集として検知しますが、このフィルタは巻き戻し行為を一致対象として評価はしません。[14]
有用なリンク
注記
- ↑ 上記は例外ですが、配列を別タイプと比較すると常に戻り値は false
- ↑ 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' を含む) では利用できません。
- ↑ MediaWiki 1.28 (gerrit:295254) 以降
- ↑ この変数を使用する複数のフィルタ (12) がAbuseFilterSlow Grafana ダッシュボードに提示されています (閲覧には logstash アクセスが必要)。 フィルタの末尾にこの変数を移すと効果があるようです。
- ↑ phabricator:T191722 を参照してください
- ↑ このコミット以降は非推奨、こちらで無効化。
- ↑ この変数を使用する複数のフィルタが AbuseFilterSlow Grafana ダッシュボードに提示されています (サンプルは閲覧に logstash アクセスが必要)。 たとえば
"text" in edit_diff_pst
(あるいはedit_diff
も), を使わず、"text" in added_lines & !("text" in removed_lines)
のようなものの使用をご検討ください - ↑ タイプの一覧はソースコードを参照してください。
- ↑ phab:T27619 に留意します。 Special:AbuseFilter/tools を使って
ccnorm( "your string" )
を評価すると、変換した文字を確認できます。 - ↑ 「haystack」は大きな文字列、概ね文章レベルの文字列を指す。(訳注:英語の諺“look for a needle in a haystack”(干し草の山から針を捜す)より。干し草の山(膨大なもの)の中から針(細かなもの)を探す様を大きな文字列から小さな文字列を探す様子に喩えている。
- ↑ 「needle」は小さな文字列、概ね文章レベルの文字列を指す。語源は上の注釈を参照。
- ↑ https://3v4l.org/S6IGP
- ↑ https://3v4l.org/S6IGP
- ↑ T24713 - 編集フィルタに一致しない巻き戻し