モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

PukiWiki Plus!用のスパムフィルタ spam_filter.php

自分が運用関わってる美麻Wiki(PukiWiki Plus!)に対するスパム対策をいろいろしていて、そのための改造を公開しています。
自分や、他の人のスパムの状況から、だいぶいろいろなフィルタがそろってきましたので、日記にエントリー上げてみます。

spam_filter.php - 美麻Wikiでシステム的に修正している点 - 美麻Wiki
http://miasa.info/index.php?%C8%FE%CB%E3Wiki%A4%C7%A5%B7%A5%B9%A5%C6%A5%E0%C5%AA%A4%CB%BD%A4%C0%B5%A4%B7%A4%C6%A4%A4%A4%EB%C5%C0#ofa18e88


(追記)

モーグルとカバとパウダーの日記 - PukiWikiでreCAPTCHAでのスパム対策

怪しい場合にはCAPTCHAでのチェックを掛ける、ということも出来るようになりました。


このスパムフィルタは、いろいろな種類のスパム対策フィルタを準備してあり、そのフィルタを複合条件を指定して掛けてやることで、サイトの条件にカスタマイズされたフィルタを利用出来る、ということが特徴です。
これにより、余計な負荷増や誤検出の可能性を極力減らすことが出来ます。


本家PukiWikiでは独自リストのURLによるフィルタ、Plus!ではIPとURLでのDNSBLを利用したフィルタ、が利用できるようになっていますが、たぶんこれだけだとすり抜けてくるものがあったり、また独自リストをこまめにアップデートしなければならないという手間があったりすると思います。


spam_filter.phpでは、いろいろな良くあるフィルタ、例えば「書き込み内容に日本語が含まれない」「URLが多数含まれる」といったものや、本家やPlus!と同じようなURLBLとDNSBL、またIPの国別フィルタや、URLのNSでのフィルタ、UserAgent情報でのフィルタなど、いろいろなフィルタが用意されています。
そして、それらをWiki管理者が自由に組み合わせて利用できるようになっています。
例えば、「書き込み内容に日本語が含まれない」でかつ「URLが3件以上含まれる」の「コメント」の場合は拒否とか、「中国韓国からの書き込み」でかつ「UserAgentの内容が特定のもの」を拒否、といった感じです。

サイトによっては英語のみでの書き込みは無い、と言えるところもあるでしょうし、海外からの書き込みも想定していないところもあるでしょう。
そういったサイトの状況に合わせてフィルタを設定できる、というわけです。


フィルタするためには、ある程度こういった情報を集めなければなりませんが、そういったスパムが書き込まれた際の情報を簡単に参照できるようにするためのパッチも準備してあります。

init.php/file.php
http://miasa.info/index.php?%C8%FE%CB%E3Wiki%A4%C7%A5%B7%A5%B9%A5%C6%A5%E0%C5%AA%A4%CB%BD%A4%C0%B5%A4%B7%A4%C6%A4%A4%A4%EB%C5%C0#offddcd4

現在用意されているフィルタ

現時点では、下記のようなフィルタが用意されており、これを組み合わせて利用することが出来ます。
それぞれのフィルタに対して、フィルタを掛けるプラグイン種やNGワードなどのパラメータなどを指定することが出来ます。

  • ngreg

正規表現NGワードで編集内容に対するフィルタ

  • url

内容にURLっぽいものが含まれているかチェック

  • atag

内容に</a>や[/url]のようなアンカータグが含まれているかチェック

  • onlyeng

内容が半角英数のみ(日本語が入っていない)かチェック

  • urlnum

内容に含まれているURLが何個以上かチェック
ipunknown - クライアントのIPが逆引きできるかチェック

  • ipunknown

クライアントのIPが逆引きできるかチェック

  • ipbl

クライアントのIPかホスト名がブラックリストに入っているか確認

  • ipdnsbl

クライアントのIPをDNSBLでチェック

  • ipcountry

クライアントのIPの国をチェック

  • uaunknown

HTTP_USER_AGENTが既知(pukiwiki.ini.phpで$agentsで指定)かチェック

  • useragent

正規表現によるHTTP_USER_AGENTでのフィルタ

  • filename

正規表現による添付ファイル名でのフィルタ

  • urlbl

URLがブラックリストに入っているか確認
ただ、ここで標準で入れているURLのブラックリストよりも、本家のスパムフィルタのURLリストのほうが非常によく網羅されているので、そちらのほうが強力です。

  • urldnsbl

URLがDNSBLに入っているか確認

  • urlnsbl

URLのNSがブラックリストに入っているか確認
NSでブラックリストにしてあるため、ブラックリスト入りしている同じ業者が新しいドメインを取得しても、NSを変更しない限り防げるため、本家のURLブラックリストを使っている場合でも有効です。

  • akismet

Akismetを利用したフィルタ

具体的なスパマーごとのフィルタ設定

コメントスパム

通常のブログや掲示板へのスパムです。

<a href=…>…</a> [url=…]…[/url]

といった内容のSEOのためにURLを羅列するスパムが大半です。
PukiWikiではアンカーを許可していないため、こういった記述は本来無意味です。そこで、

</a>
[/url]

があった場合には拒否する

#atag()

で拒否します。
また、日本語が含まれない投稿で、かつ複数(デフォルトで3以上)のURLが書き込まれた場合に拒否する、というフィルタも効果が高いと考えられます。これは

#onlyeng() && #urlnum()

で拒否することが出来ます。

添付スパム

トップページなどに、ランダムな文字列で付けられたファイル名のHTMLファイルを添付して、そこに多数のリンクが書いてあるというスパムです。
これもSEOを目的としています。そこで、

.html
.htm

の拡張子のファイル添付を拒否する

#filename()

で拒否します。

URL書き換えスパム

menuページなどにある飛び先URLを変更して、その先に置いてあるWebを見ただけで感染するタイプのトロイを仕掛けることを目的としているスパムです。
元のページを書き換えるため、onlyengなどで絞り込むことが出来ません。
これは、特定の何種かのドメインに絞られるためurlblで全ドメインを列挙することでも対処できますが、このスパムをしてくる業者が使っているNS(ネームサーバ)でフィルタすることで、新しく取られたドメインにも効果が出るため、こちらのほうがお勧めです。

#urlnsbl()

で拒否します。

URL無しランダム文字列スパム

コメントで、URLもなく、半角アルファベットで単語にすらなっていないランダムな文字列を書いてくるというスパムがあります。
これだとこれまで有効だったURLによるフィルタを利用することが出来ず、またbotからの書き込みのため、接続元で絞ることもできません。
ただ、ちょうど良いことに、UserAgentの情報まで全てランダムな文字列にしてあります。
そこでUserAgentが既知のものでない場合には拒否するuaunknownを利用します。

#onlyeng && #uaunknown()

これで、投稿に日本語が無く、既知のUAではない場合に拒否します。

フィルタ設定例

美麻Wikiでのスパムフィルタ設定
define('SPAM_FILTER_COND', '#useragent() || #filename() || #atag() || (#onlyeng() && (#urlnum() || #uaunknown())) || #urlbl() || #urlnsbl()');
define('SPAM_FILTER_URLNSBL_WHITEREG', '/(miasa\.info|【※中略 関連ドメイン】/i');
  • UserAgentからスクリプトからのコメントや編集と思われるものの拒否
  • 添付ファイル名からHTMLと思われる場合の拒否
  • コメントや編集内容にアンカータグ</a>などがある場合拒否
  • 日本語が含まれていない書き込みでURLが3件以上またはUserAgentが不明のものを拒否
  • これまでにURL列挙のスパムで使われたURLが書かれた場合の拒否
  • これまでURL列挙やURL書き換えスパムで使われたドメインのネームサーバでの拒否


(関連)

モーグルとカバとパウダーの日記 - 掲示板やWikiへのスパムの傾向と対策
モーグルとカバとパウダーの日記 - PukiWikiのURL書き換えスパマーは中国からのROのキャラ取得とRMT目的らしい