[Mediawiki] スパムによる大量更新 (3) 思案中


前回の続き。

MediawikiでUserMergeという拡張機能を使えば、非常に時間はかかりますが2つのスパム利用者アカウントを1つに統合し、最終的にはスパムアカウントを1つにできる、ということがわかりました。

ただし3万件近く登録されてしまったスパム利用者をいちいちUserMergeで1アカウントずつ統合していくような余裕は到底ない・・・。
そこでググりまくったところ、海外サイトで解決策になるかもしれない方法が紹介されているらしい、との情報を得ました。

とりあえずその記事を翻訳してみたところ、PythonとFirefoxアドオンを使ってネックである「1アカウントずつ統合」というめんどくさい作業を自動化する方法のようです。

が。

Pythonがわからないのでどうしようもない。
これを機にPythonを勉強すればいいじゃないか!とも思ったのですが、いかんせんそんな時間の余裕はなく。
今でも1日に10件程度はスパムによる更新が行われてる状態なのでね・・・
とりあえずPythonをインストールして書いてあるコードを実行するまではわからないなりにやってみたけど、エラー出たので泣く泣く諦めました(メンタル弱い)。

しかしよくよくこの一連の方法を見てみると、Pythonでやることは「スパム利用者のアカウントをAnonymousという名前のユーザーに統合して、Anonymousでない方のアカウントを消す」という作業をさせるリンクURLをだーっと並べたHTMLを自動生成する部分なんですよね。

print "<a href=\""+"http://www.xxx.xx/index.php?title=Special:UserMerge&olduser="+line+"&newuser=Anonymous&deleteuser=1"+"&token=123456789123456789""+">User URL Link</a>"

↑Pythonスクリプトの中にこういう部分があるので、ここの「+line+」の部分にアカウント名を入れて、トークンを該当箇所に入れればそれでUserMergeが動くURLができるんじゃないの?と思ったわけですが・・・

上手く行かなかった。「トークンが不正です」って出ちゃった。

もし+line+とトークンの部分を変えるだけでいいんなら、わざわざPython使わなくてもテキストエディタの置換機能とか使えばサクサクっとHTMLは作成できるんじゃないか?と思ったんですがね・・・甘かったですね・・・

でもここに何かヒントがあると思うので、もうちょっと試行錯誤してみようと思います。

[Mediawiki] Mediawikiでスパム利用者の大量のリストを消す方法・和訳


http://simplecloudworks.com/2013/04/how-to-delete-a-long-list-of-spam-users-in-mediawiki/の翻訳。

「Mediawikiでスパム利用者の大量のリストを消す方法」

運営するMediawikiサイトが大量の自動アカウント作成によってスパム攻撃を受けている場合(キャプチャがスパマーへの抑止力にならないことは以前から既に知られています)、一つの予防策としては拡張機能「ConfirmAccount」を使用することが挙げられます。この拡張機能を使えばアカウント作成に管理者の許可が必要となる為、直接アカウントを作成することはできなくなります。

しかし、既に作られている大量のスパム利用者のアカウントはどうやって消せばよいのでしょうか?

「User Merge And Delete」という拡張機能が手助けとなってくれます。一度インストールすればスパムアカウントを他のアカウントに統合でき、データベースから削除することができるのです。ただし、ひとつひとつ。

大量のスパム利用者のアカウントを削除するには、拡張機能User Mergeを自動的化するViswaprabha氏の(未完成ではありますが)独創的な手法を参考にできます。

(1)
・拡張機能UserMergeをインストール
・ブラウザのFirefoxにWeb Developerアドオンをインストールする
・Pythonインタープリタ
・FirefoxにDownThemAll!アドオンをインストールする

Firefoxの拡張機能Web DeveloperでUserMergeのフォームから情報を取り出すことができるのがミソです。
この情報をスパムアカウントのリストと連結し、シンプルなウェブページを作ることができます。
作成されたhtmlページでFirefoxアドオンのDownThemAll!を使うことでUserMergeにスパムユーザーを削除するよう指示ができるのです。

(2)
・Mediawikiの特別ページにある「利用者一覧」からスパム利用者のアカウント名を取得しリストを作成します。表計算ソフトなどにコピー&ペーストやフィルタリングをすることでリストを作成することができます。この時スパムでないアカウントをリストに入れてしまわないようご注意を!

(3)
Firefoxを起動して自分のMediawikiに管理者としてログインし、特別ページ内の利用者の統合と削除ページへ移動します。このページを開いたらWeb Developerツールバーのフォームボタンをクリックし
「form要素のmethod属性値を変更する」>「GETをPOSTに変換」
を選択します。そうするとブラウジングセッションに必要な固有のトークン(例:2c05d520d9b202235c03e8fe8ll8khBなど)が表示されます。

(4)
ここでPythonスクリプトを使って、(2)で作成したリスト(以降「userslist.txt」と表記)を(3)で取得したトークンと紐付けし、htmlファイルを出力します。下記にサンプルスクリプトを記述します。使用の際にはスクリプト内の該当箇所を自分のWikiサイトのドメインとトークンに置き換えて下さい。

#!/usr/bin/python
# Concatenate a list of users to produce URLs which delete them using UserMerge Extension for MediaWiki
# Usage:  python concatenate_UserMerge_MediaWiki.py userslist.txt > userURLlist.html  

import sys

input = open(sys.argv[1])
count = input.readlines()
g = len(count)
input.close()

print ""

input = open(sys.argv[1])

for k in range(g):
        line = input.readline()
        print "User URL Link"

input.close()

print ""

このスクリプトを、例えば「concatenate_UserMerge_MediaWiki.py」と名前をつけた場合のUsageは

python concatenate_UserMerge_MediaWiki.py userslist.txt > userURLlist.html

です。

(5)
最後のステップとして、(4)で作成したhtmlページ(例えばuserURLlist.html)を使います。
このuserURLlist.htmlをFirefoxで開くとリンクで埋め尽くされたページが現れると思いますが、この1つ1つが拡張機能UserMergeへ自分のWikiサイトの中で1つのアカウントを消すという指示の実例ということになります。効率よくこのリンク全てを踏んでUserMergeを実行するために、userURLlist.htmlを開いた状態でFirefoxのアドオン「DownThemAll!」を使用します。この際、(3)でトークンを取得した時から同じセッションでログインしていることが重要です。

userURLlist.htmlのダウンロードが進むにつれ、スパムアカウントがUserMergeによって消されていきます。

[Mediawiki] スパムによる大量更新 (2) UserMerge


前回の続き。

手順(3)のUserMergeというextensionについて。

インストールすると特別ページに「利用者の統合と削除」という項目が追加され、利用者アカウントを別のアカウントに統合することのできる拡張機能です。
例えば利用者アカウントAをBに統合する際に、統合された側のAを削除することができる、というのがポイントな模様。
AをBに統合→CをBに統合→DをBに統合・・・と繰り返していけば、いつかはBの利用者アカウントのみが残る、ということですね。
現在まだ「利用者を削除する」という目的だけの機能はないようで、利用者を消したい時はこのUserMergeを使うのが唯一の策なのかも。

これはまだMediawikiには標準実装されていないようで、Mediawikiサイトからダウンロードが必要です。
Mediawiki – Extension:UserMerge
mws2
↑ここからダウンロード。

ダウンロードしたtar.gzをSSHでサーバ上の「extension」ディレクトリに解凍するか、ローカルで解凍して「extension」ディレクトリにアップロードします。

その後LocalSettings.phpに、先ほどのMediawiki – Extension:UserMergeページに書いてあるコードをコピペし、
mws3
上書きアップロードすれば管理者としてログインした際、特別ページに「利用者の統合と削除」が表示されるようになります。
mws4

「利用者の統合と削除」のページはこんな感じ。
mws5
利用者Aを利用者Bに統合した上でAを削除する場合の記入例です。
「利用者の統合」ボタンをクリックすると、Aのユーザーアカウントが削除され、BにAの投稿履歴が統合されます。

ただ、これで1件1件消していくには3万件近く利用者が登録されてしまっているので、あまりにも遠い道のり・・・
いい策を探しているところです。

[Mediawiki] スパムによる大量更新 (1)


ある日突然、Google Webmaster Toolsから妙なメールが届きました。
wmt

内容としては「Googleはあなたのサイトでユーザーが作成したスパムを検出しました」っていうものなんですが、一応確認しておかねば!と久しぶり(3ヵ月ぐらいノーメンテでした…)にMediawikiで運営しているサイトを見てみたところ、トップページに英語の広告スパムが・・・!
mw-spam1
「最近の更新」を見てみてもこのありさま。ひどい。

特別ページの「統計」を見てみると、以前は150ページ程度しかなかった記事数がなんと70,000ページ近くに!!!(((゜Д゜;)))ヒエー
利用者も数人だったのが30,000人手前まで!!!
ものすごくニッチな対象のWikiなので、アカウントさえ作成すれば投稿・編集できるような設定にしていたんですが、これが大失敗だったようで。
「スパムならわざわざアカウント作成までして書き込みせえへんやろ~」とのんきに考えていたのが非常に甘かった。

スパム内容はTwitterでももはや有名になっているサングラス系から、Minecraftどうたらこうたらとか、「すぐに金を作る方法」とか、海外版出会い系サイトとか、そんな感じです。普通のスパムだ。面白くもなんともねえ。

記録を見ているとそのWikiでは4/1に最初にスパム利用者のアカウント登録が複数あり、4/4から怒涛の投稿と新規アカウント作成フェスティバルが始まったようです。くそー。

なんとかしなくては!と手順について考えてみましたが
(1)まず、一番スパムが目につくメインページを保護する
(2)スパム対策として、日本語での質問に回答しないと新規アカウントが作れないよう、拡張機能「ConfirmEdit」の「Questy Captcha」を有効にして、新規スパムアカウントが作れないようにする
(3)スパム利用者のアカウントをブロックしまくる
(4)スパムアカウントによる投稿を削除しまくる
この流れで行こうと。

(2)については
FREEWIKI – MediaWikiスパム対策
こちらを参考にしました。

(3)については、ブロックより利用者削除がいいと考えて拡張機能の「UserMerge」を使うことに。

(4)は同じくFREEWIKIさんを参考に、標準で付属している拡張機能「Nuke」を導入しました。

(2)に続きます!