自分が運用関わってる美麻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
- 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()
で拒否します。
フィルタ設定例
美麻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目的らしい