MediaWikiにスパム対策をする

この記事には広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

MediaWikiをインストールした後にまずやることとしてスパム対策があります。

個人しか編集しないWikiならば不要ですが、本家Wikiのように色々な人に編集してもらうのであれば

スパム対策は必須です。

そうしないとゴミページが大量にできてしまいます。

MediaWikiの公式ヘルプに従ってスパム対策をしていきます。今回は全部で3つの対策を行います。

MediaWikiのバージョンは「1.38.2」を前提としています。

スパム対策をする理由

Wikiとは「不特定多数のユーザーが共同してウェブブラウザから直接コンテンツを編集するシステム」

この仕組みを利用して、悪意のあるユーザが意味不明なページを新規作成したり、ページ内容を改悪したりします。

それもbotと呼ばれるプログラムで実施します。

他の人のブログをみると、スパマーに狙われてロシア語とか中国語のページを大量に作成されてしまったようです。

こうなると真の利用者にとっては害でしかありません。

しかも、自分の構築したWikiにセキュリティ的な穴があるとスパマーにバレると攻撃対象リストに記録されて対策後も攻撃を受け続けるようです。

こうなる前にスパム対策を実施する必要があります。

スパマー IP をブロックStopForumSpam

既知のスパマー IP をブロックできます。ブラックリストってやつですね。

StopForumSpamをダウンロードします。

「StopForumSpam-REL1_38-8894415.tar.gz」こんなgzファイルでダウンロードされるので解凍します。

解凍して作成された「StopForumSpam」フォルダをサーバの「extensions」フォルダにFTPでアップロードします。

以下のコードを LocalSettings.php の末尾に追加します

LocalSettings.php
# StopForumSpam拡張機能を有効化
wfLoadExtension( 'StopForumSpam' );

公式サイトの「IP 拒否リストを使用するには、ある種のオブジェクト キャッシングを使用する必要があります。$wgMainCacheTypeが CACHE_NONE に設定されている場合は機能しません。」という文言が気になります。

$wgMainCacheType = CACHE_DB;と設定しなさいとあります。ここらへんがよくわかっていません。MediaWikiのキャッシュについてはもう少し後でやりたいと思います。

CAPTCHAを設定するExtension:ConfirmEdit

Extension:ConfirmEditは最新のMediaWikiにはすでにインストールされていますので、有効化するだけです。

現時点で6種類のCAPTCHAを選択できるのですが、堅牢なのは「QuestyCaptcha」のようです。

googleのReCaptchaが個人的には良いのですが、スパマーによってクラッキングされていると公式ヘルプには書いてある。

ReCaptchaV3はまだ公式には未対応ということで、私も「QuestyCaptcha」を利用することにします。

質問を日本語にすれば国内ユーザに限定することが可能です(完全ではないが)。

LocalSettings.php
# スパム対策のConfirmEdit拡張機能を有効化
wfLoadExtension( 'ConfirmEdit' );
# CAPTCHAに「QuestyCaptcha」を利用する
wfLoadExtensions([ 'ConfirmEdit', 'ConfirmEdit/QuestyCaptcha' ]);

# 独自質問を配列で追加する。追加した質問はランダムで利用者へ質問する。
# スパマーにクラックされたら質問と回答を変える
$wgCaptchaQuestions = [
	'フランスの首都は' => 'パリ',
	'スペインの首都は何ですか' => 'マドリード', 
];
# それぞれのアクションとCAPTCHAの有効化の設定(trueで有効化)
# これは適宜変更する
$wgCaptchaTriggers [ 'edit' ]           =  true ; #ページの保存が試行されるたびにトリガーされます
$wgCaptchaTriggers [ 'create' ]         =  true ; #ページの作成時にトリガーされます
$wgCaptchaTriggers [ 'createtalk' ]     =  true ; #トークページ作成時にトリガーされます
$wgCaptchaTriggers [ 'addurl' ]         =  true ; #1 つ以上の URL をページに追加するページの保存時にトリガーされます
$wgCaptchaTriggers [ 'createaccount' ]  =  true ; #新しいアカウントの作成時にトリガーされます
$wgCaptchaTriggers [ 'badlogin' ]       =  true ; #失敗した後の次のログイン試行でトリガーされます。

# グループ毎のスキップ設定(trueでCAPTCHAを対象グループはスキップ)
$wgGroupPermissions['*'            ]['skipcaptcha'] = false;
$wgGroupPermissions['user'         ]['skipcaptcha'] = false;
$wgGroupPermissions['autoconfirmed']['skipcaptcha'] = false;
$wgGroupPermissions['bot'          ]['skipcaptcha'] = true; // 登録されたbot
$wgGroupPermissions['sysop'        ]['skipcaptcha'] = true;

# メール認証済みユーザーに対してキャプチャをスキップするには、以下2行をtrueにする。
$wgGroupPermissions['emailconfirmed']['skipcaptcha'] = true;
$ceAllowConfirmedEmail = true;

スパムドメインをブロック$wgDnsBlacklistUrlsを有効化

DNS blacklist つまりドメインのブラックリストを定義してブロックします。

定義するドメインは、スパムドメインをまとめたサイトがあるのでそれを参考にして配列に定義します。「https://www.dnsbl.info/dnsbl-list.php

LocalSettings.php
# スパム対策のwgDnsBlacklistUrlsを有効化
$wgEnableDnsBlacklist = true;
# ブロックするドメインを配列で定義する
$wgDnsBlacklistUrls = array( 'xbl.spamhaus.org.', 'dnsbl.tornevall.org.', 'spam.dnsbl.sorbs.net.', 'rbl.dnsbl.im.', 'noptr.spamrats.com.', 'all.s5h.net.', 'z.mailspike.net.' );
# デフォルトでは、$wgDnsBlacklistUrls はアカウント作成時にのみ適用されますが個別に設定できます。
$wgDnsBlacklistUrls['edit']          = true;
$wgDnsBlacklistUrls['create']        = true;
$wgDnsBlacklistUrls['createtalk']    = true;
$wgDnsBlacklistUrls['addurl']        = true;
$wgDnsBlacklistUrls['createaccount'] = true;

配列に定義するドメインは文字列の最後に”.”ドットを付与しなければいけません。

まとめ

この3施策で最低限のスパム対策が出来ると思います。

日々進化するスパマーに対しては完全な対策はありません。

つねに監視と対策を怠らぬようにしていきましょう。

スパマーは、バングラデシュ、中国、インド、および他の多くの発展途上国で 人間を雇って、CAPTCHAの解除を1000件解決するごとに約 0.80 ドルから 1.20 ドルを支払っているそうです。

スパマーとの戦いは続きます。