PHPベースのオープンソースのウィキソフトウェア DokuWikiのスパム対策について解説します。
DokuWikiではブラックリスト、つまりNGワード集のようなものを使用して、ユーザーの入力内容をチェック・ブロックすることができます。
そのブラックリストを自動更新し、スパム対策を行う方法を紹介します。
なお、今回のバージョンは以下の通りです。
- DokuWiki 2018-04-22a “Greebo”
DokuWikiのブロック単語のブラックリスト
DokuWikiでは、ブロックする単語のブラックリストを保持し、ユーザーの入力内容をそのブラックリストと照合してスパム対策を行う仕組みになっています。
ブラックリストファイルは、
conf/wordblock.local.conf
です。
このファイルを作成し、設定項目のusewordblockを1(チェックオン:デフォルト)にすることで、スパム対策を行うことができます。
ブラックリストの自動更新
ブラックリストは、手動でメンテナンスを行っていくことは大変手間です。
そこで、ウィキメディアプロジェクトのSpam blacklistを使用し、Cronによる自動更新を行います。
Cronで実行するコマンドは以下です。
curl -sk https://meta.wikimedia.org/wiki/Spam_blacklist?action=raw | egrep -v '<?pre>' > conf/wordblock.local.conf
これは、curlコマンドによってHTTPリクエストを投げて、取得結果をブラックリストに反映させています。
ブロック結果をログ出力
ブラックリストによる攻撃のブロック結果をログ出力するには、DokuWiki本体を少しカスタマイズすることで可能です。
以下のコードは、
inc/common.php
内のcheckwordblock関数の一部ですが、3行目に1行処理を追加しています。
if(count($re) && preg_match('#('.join('|', $re).')#si', $text, $matches)) {
// prepare event data
io_saveFile($conf['metadir'].'/wordblock.log', strftime($conf['dformat'])."\t".$matches[0]."\t".$ID.$_SERVER['REMOTE_USER']."\t".$_SERVER['REMOTE_ADDR'].":".$_SERVER['SERVER_PORT']."\t".gethostbyaddr($_SERVER['REMOTE_ADDR'])."\t".$_SERVER['HTTP_USER_AGENT']."\n", true);
$data = array();
$data['matches'] = $matches;
$data['userinfo']['ip'] = $INPUT->server->str('REMOTE_ADDR');
これで、
data/meta/wordblock.log
へブロック結果をログ出力できます。
最後に
今回は、DokuWikiのスパム対策について解説しました。
ブロック単語のブラックリストを自動更新すれば、手間が少なくスパム対策できます。
DokuWikiの使い方については、こちらの記事にまとめています。
コメント