Extension:AbuseFilter/Rules format/ja

From MediaWiki.org
Jump to: navigation, search

以下の記述形式は、C言語、Java、Perlなどの多くのプログラミング言語で条件文として用いられています。

リテラル[edit]

リテラル(非変数の文字列)は、直接もしくは"で囲って書くことができます。改行は\nタブ文字\t、'(クォート文字)は\'と表記します。

"This is a string"
'This is also a string'
'This string shouldn\'t fail'
"This string\nHas a linebreak"
1234
1.234
-123

コメントアウト[edit]

また、/**/タグを使いコメントアウトを書くこともできます。

/* This is a comment */

変数[edit]

不正利用フィルターでは、パーサーによってあらかじめ定義された様々な変数を使うことができます。これらの変数はその名前をリテラルと同じように入力する事によってアクセスすることができます。また、変数の中には不正利用ログ内のリクエストに連動したものもあります。

USER_EDITCOUNT
ARTICLE_RECENT_CONTRIBUTORS

変数にはアクションの'edit''move''createaccount''autocreateaccount''delete''upload'もあります。

他にも、変数の条件を:=;で挟むことで新たな変数を定義することができます。 以下が英語版Wikipediaの編集フィルター79号の例です。

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

Lists:

a_list := [ 5, 6, 7];

変数一覧[edit]

利用可能な変数
説明 変数名 データ型 返り値
行動種別 action string edit(編集), move(移動), createaccount(アカウントの新規作成), autocreateaccount(自動でのアカウント作成), delete(ページの削除), upload(ファイルのアップロード)[1], stashupload[2]
Edit count of the user user_editcount 文字列 匿名利用者は空の数値。
Name of the user account user_name 文字列
Time email address was confirmed user_emailconfirm 文字列 YYYYMMDDHHMMSS
Age of the user account user_age 秒数による。 匿名利用者は0を返す。
Whether the user is blocked user_blocked 論理型 ブロックされている利用者は1を返す。
Whether or not a user is editing through the mobile interface user_mobile 論理型 携帯機器を利用している利用者は1に返す。
Groups (including implicit) the user is in user_groups
Rights that the user has user_rights
ページ ID(HTMLソースより取得) article_articleid 整数型 新規のページ作成の場合は0を示しますが、この方法は不確実です。これを検出したい場合、代わりに old_size==0 を用いて下さい。
Page namespace article_namespace 整数型 名前空間インデックスを参照
Page title (without namespace) article_text 文字列
Full page title article_prefixedtext 文字列
Edit protection level of the page article_restrictions_edit
Move protection level of the page article_restrictions_move
Upload protection of the file article_restrictions_upload
Create protection of the page article_restrictions_create
Last ten users to contribute to the page article_recent_contributors ページの編集者が一人であるときは空(?)[ママ]。最新100版までを走査。
First user to contribute to the page article_first_contributor
行動種別によって利用可能な変数
説明 変数名 データ型 返り値
Edit summary/reason summary 文字列
Whether or not the edit is marked as minor minor_edit 文字列
Old page wikitext, before the edit old_wikitext
New page wikitext, after the edit new_wikitext
Unified diff of changes made by edit edit_diff
Unified diff of changes made by edit, pre-save transformed edit_diff_pst
New page size new_size 整数型
Old page size old_size 整数型
Size change in edit edit_delta
Lines added in edit, pre-save transformed added_lines_pst
Lines added in edit added_lines
Lines removed in edit removed_lines
All external links in the new text all_links
Links in the page, before the edit old_links
All external links added in the edit added_links
All external links removed in the edit removed_links
New page wikitext, pre-save transformed new_pst
新しい版のHTMLソース new_html
新しい版のテキスト(マークアップを除外したもの) new_text
使用不可 old_html
使用不可 old_text
Torを用いて編集されたかどうか tor_exit_node 論理型 0, 1 (TorBlockをインストールしている場合のみ有効)
UNIXタイムスタンプ timestamp 文字列 int(timestamp)は日時計算可能な形で返されます。
SHA1 hash of file contents file_sha1 [1]
Size of the file in bytes file_size 整数型 バイト数を示します[1]
Page ID of move destination page moved_to_articleid
Full title of move destination page moved_to_prefixedtext
Namespace of move destination page moved_to_namespace
Namespace of move source page moved_from_namespace
Full title of move source page moved_from_prefixedtext
Page ID of move source page moved_from_articleid
Account name (on account creation) accountname
古い版のコンテンツモデル old_content_model 文字列 コンテンツモデルの変更に関する詳細はHelp:ChangeContentModelをご覧下さい
新しい版のコンテンツモデル new_content_model 文字列 コンテンツモデルの変更に関する詳細はHelp:ChangeContentModelをご覧下さい

CentralAuth拡張機能を導入すると、global_user_groups変数も導入されます。(user_groups変数に類似)。

アクションがmove(移動)の場合、actiontimestamp、名前がuser_で始まる変数のみが使用できます。名前がarticle_で始まる変数もありますが、この場合移動元のページ名を示す時はmoved_from_と、移動先のページ名はmoved_to_と置き換えられます。例えばarticle_textは、moved_from_textmoved_to_textとなります。

名前空間[edit]

Manual:Namespace/jaも参照。

英語版ウィキペディアの名前空間
通常名前空間 トークページ
0 Main Talk 1
2 User User talk 3
4 Wikipedia Wikipedia talk 5
6 File File talk 7
8 MediaWiki MediaWiki talk 9
10 Template Template talk 11
12 Help Help talk 13
14 Category Category talk 15
100 Portal Portal talk 101
108 Book Book talk 109
仮想的な名前空間
-1 Special
-2 Media

比較演算子[edit]

不正利用フィルターでは、以下の比較演算子を用い二つの変数やリテラルを比較する事ができます。

  • < — 左辺の値が右辺の値を未満の場合にTrueを返します。
  • > — 左辺の値が右辺の値を超える場合にTrueを返します。
  • <= — 左辺の値が右辺の値を以下の場合にTrueを返します。
  • >= — 左辺の値が右辺の値を以上の場合にTrueを返します。
  • ===も可) — 左辺の値と右辺の値が一致する場合にTrueを返します。
  • != — 左辺の値と右辺の値が一致しない場合にTrueを返します。
  • === — 左辺の値と右辺の値が一致しかつ同じデータ種類の場合にTrueを返します。
  • !== — 左辺の値と右辺の値が一致しないもしくは違うデータ種類の場合にTrueを返します。
結果
1 == 2 False
1 <= 2 True
1 >= 2 False
1 != 2 True
1 < 2 True
1 > 2 False
0 == False True
0 === False False

四則計算[edit]

また不正利用フィルターでは、以下の計算演算子を用い二つの変数やリテラルを比較する事もできます。

  • + — 足し算。加法。
  • - — 引き算。減法。
  • * — 掛け算。乗法。アスタリスクは「×」と同じ意味。
  • / — 割り算。除法。スラッシュは「÷」と同じ意味。
  • ** —(左の数)の(右の数)乗。累乗。
  • % — 左の数を右の数で割った時の余りの数。剰余。
結果
4 + 1 5
0 * 2 0
2 / 4 0.5
9 ** 2 81
8 % 3 2

文字列の連結[edit]

+(プラス)記号を使用して、2つのリテラル文字列または2つの文字列型の変数を連結することができます。

キーワード[edit]

頻繁に使用される機能を簡略化するため、不正利用フィルターでは以下の特別なキーワードが定義されています。キーワードは演算子と同じ要領で使用できます。

  • likematchesも可) — 左側の文字列と右側の文字列がグロブパターン(正規表現)で一致する場合にTrueを返します。
  • in — 右側の文字列に左側の文字列が含まれている場合はTrueを返します。
  • rlikeregexも可)、irlike — 左側の文字列と右側の文字列に正規表現パターンでの一致が(含まれている)場合をTrueを返します(irlikeは大文字小文字を区別しません)。このキーワードは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).
  • contains
  • if ... then ... else ... end
  • ... ? ... : ...
  • true, false and null


Code Result Comment
"1234" like "12?4" True
"1234" like "12*" True
"foo" in "foobar" True
"foo" regex "\w+" True
"a\b" regex "a\\\\b" True 正規表現ではバックスラッシュはエスケープ文字になるため、4つのバックスラッシュまたは、2つの「\x5C」を使用する必要があります。 (いずれかが正常に動作します。)
"a\b" regex "a\x5C\x5Cb" True

関数[edit]

不正利用フィルターには、頻出する重要な問題を容易にするために多くの関数が内蔵されています。これらはfunctionName( arg1, arg2, arg3 )のように一般的な形式が用いられています。関数はリテラル・変数を問わず全ての文字列で使うことができます。また、関数の内容はリテラルとしても、変数としても、他の関数としても渡すことができます。

関数名 説明
lcase 引数を小文字に変換して返します。
ucase 引数を大文字に変換して返します。
length 引数の文字数を返します。
string 引数を文字列型にキャスト(変換)します。
int 引数を整数型にキャスト(変換)します。
float 引数を浮動小数点数型にキャスト(変換)します。
bool 引数を論理型にキャスト(変換)します。
norm rmwhitespace(rmspecials(rmdoubles(ccnorm(arg1))))と同じ効果。
ccnorm 引数に含まれる似た字形の文字を一般的なものに変換した文字列を返します。例えば、ccnorm( "Eeèéëēĕėęě3ƐƷ" )"EEEEEEEEEEEEE"となります[3][4]

変換対象になる文字の一覧は、gitにて確認する事ができます。
※注:この関数を作動させるには、AntiSpoof拡張機能が必要になります。Without it the string will simply be left unchanged.

specialratio 引数のアルファベットでない文字列数で引数の全文字列数を割った値を返します。(以下の例参照)
rmspecials 引数から全ての特殊文字を削除します。(Equivalent to s/[^\p{L}\p{N}]//g.)
rmdoubles 引数から連続する文字を削除します。
rmwhitespace 引数から空白、タブ文字、改行を削除します。
count 文字列haystack[5](第2引数)の中で、needle[6](第1引数)が出現する回数を返します。引数が一つしか指定されていない場合は、カンマでそれを分割し、セグメントの数を返します。
rcount countとほぼ同じ関数ですが、こちらはneedle(第1引数)に正規表現を使用します。needle(第1引数)の最初に「(?i)」を書くことにより、大小文字を区別しないようにすることもできます。
ip_in_range 利用者のIPアドレス(第1引数)が指定したIP範囲(第2引数)に一致する場合にTrueを返します。この関数は匿名利用者が対象の場合のみ機能します。
contains_any 第1引数と、第2引数以降の文字列に一致するものがある場合にTrueを返します。引数の数に制限はありません。
substr 第1引数を対象に、第2引数で指定された位置から第3引数で指定された長さだけの文字列を返します。
strlen lengthと同じ効果。
strpos 文字列haystack[5](第1引数)の中で、needle[6](第2引数)が最初に現れる位置を数字で返します。この関数はhaystack(第1引数)の文頭にneedle(第2引数)があった場合、0の数値を返します。この場合、他の比較演算子が0False値を意味していると誤認する可能性があります。そのため、===!==を用いて誤認されているかどうか確認するといいでしょう。
str_replace 検索対象の文字列を全て置換文字列に置き換えます。この関数は検索範囲の文字列、検索対象の文字列、置換文字列の引数が使われます。
rescape 引数に含まれる特殊文字にエスケープ文字(バックスラッシュ)をつけて引数を返します。この関数を使用すると、特殊文字なしに正規表現で文字列を使用することができます。
set Sets a variable (first string) with a given value (second argument) for further use in the filter. name := valueと同じ効果を持ちます。
set_var setと同じ効果。

その他

  • convert 第2引数を第1引数で指定された言語に変換して返します。LanguageConverterのあるウィキにのみ適用されます。(新しい関数はrev:49399で導入されました。rev:49397のバージョンを経由する必要があります。)

length( "Wikipedia" ) 9
lcase( "Wikipedia" ) wikipedia
ccnorm( "ωɨƙɩᑭƐƉlα" ) W1K1PED1A
ccnorm( "ìíîïĩļǐīĭḷĿї!ľį₤ĺľḷĿΛЛљóòôöõǒōŏǫőόὸὀὁὄὂὅὃọ$śŝşšṣσ" ) ìíîïĩļǐīĭḷĿї!ľį₤ĺľḷĿΛЛљóòôöõǒōŏǫőόὸὀὁὄὂὅὃọ$śŝşšṣσ[4]
rmdoubles( "foobybboo" ) fobybo
specialratio( "Wikipedia!" ) 0.1
norm( "!!ω..ɨ..ƙ..ɩ..ᑭᑭ..Ɛ.Ɖ@@l%%α!!" ) W1K1PED1A
count( "赤", "赤赤青赤" ) 3
count( "foo,bar,baz" ) 3
rmspecials( "FOOBAR!!1" ) FOOBAR1
rescape( "abc* (def)" ) abc\* \(def\)

論理演算子[edit]

条件数の全てもしくは一つまたは、すべての条件のうちの唯一無二の1つがTrueである場合にのみマッチします。

  • x | y — OR – 二辺のどちらかTrueの場合Trueを返します。
  • x & y — AND – 二辺のどちらもTrueの場合Trueを返します。
  • x ^ y — XOR – 二辺のどちらかTrueの場合Trueを返します。但し、どちらもTrueである場合はFalseが返されます。
  • !x — NOT – 引数がFalseの場合Trueを返します。
結果
1 True
0 True
0 False
1 & 1 True
1 & 0 False
0 & 0 False
1 ^ 1 False
1 ^ 0 True
0 ^ 0 False
!1 False

演算の順序[edit]

一般的に、演算は左から右へ作用します。しかし、その順序は例外的になる場合もあります。フィルターが条件のいずれかの処理に失敗した時、短絡評価によりその残りの部分のチェックは停止され、次のフィルターに移ります(phab:T43693を除く)。評価順序は次の通りになります。

  1. 括弧で囲まれている文字列は単一の単位として評価されます。
  2. 変数やリテラルのデータへの変換(例: article_namespaceを0に変換)
  3. 関数の呼び出し(norm, lcase等)
  4. +及び-といった単項演算子(正の数・負の数として-1234, +1234のような形で)
  5. キーワード
  6. 論理値の反転(!x
  7. べき乗計算 (2**3 → 8)
  8. 掛け算・割り算・割り算の余り
  9. 足し算・割り算 (3-2 → 1)
  10. 比較演算子 (<, >, ==)
  11. 論理演算子 (&, |, ^, in)

[edit]

  • 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と評価されます。

条件のカウント[edit]

条件のカウント
Conditions used Notes
'foo' == 'bar' 1 A simple test counts as one condition
false & false & false & false & false 5[7]
( 'foo' == 'bar' ) 2 Evaluating parenthesis also counts as conditions
( 'foo' ) == ( 'bar' ) 3
(((( 'foo' == 'bar' )))) 5
false & ( false & false & false & false ) 2 But they can be used to force a short-circuit
false & ( true & true & true & true ) 2
true & ( false & false & false & false ) 6 Rearranging and grouping the conditions according to their likelihood of being true might represent a big difference in the total number of conditions used by a complex filter
true & ( false & ( false & false & false ) ) 4
str_replace( 'FooFoo', 'Foo', '' ) == 'bar' 5 Each function call and each parameter evaluation also counts as one condition
  str_replace( 'FooFoo', 'Foo', '' ) == 'bar'
| str_replace( 'FooFoo', 'Foo', '' ) == 'baz'
9 1 from str_replace + 3 from its parameters + 1 from the first == + 3 for the same parameters + 1 for the second ==
str_replace( 'FooFoo', 'Foo', '' ) 5 equivalent to "str_replace( 'FooFoo', 'Foo', '' ) = 1"

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

外部リンク[edit]

注釈[edit]

  1. 1.0 1.1 1.2 ファイルのアップロード(action='upload')に使える変数は、偏在、user_, article_で始まる変数と、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'を含む)。
  2. MediaWiki バージョン1.28から(https://gerrit.wikimedia.org/r/#/c/295254/)
  3. phab:T29987を参照。
  4. 4.0 4.1 phab:T27619を参照。
  5. 5.0 5.1 「haystack」は大きな文字列、概ね文章レベルの文字列を指す。英語の諺“look for a needle in a haystack”(干し草の山から針を捜す)より。干し草の山(膨大なもの)の中から針(細かなもの)を探す様を大きな文字列から小さな文字列を探す様子に喩えている。
  6. 6.0 6.1 「needle」は小さな文字列、概ね文章レベルの文字列を指す。語源は上の注釈を参照。
  7. The last 4 conditions are counted due to phab:T43693
言語:Project:Language policy English  • 日本語 • मराठी • русский