at posts/single.html

PukiWiki の荒らし対策

PukiWiki に限らず Wiki 全般に言えることだけど、「荒らすコスト」<「復旧するコスト」であれば荒らしは発生しにくいように思う。 このあたりの話は、 Wikiと荒らし - 羊堂本舗 ちょきただのにっき(2003-02-25) に詳しい。

「荒らすコスト」を増やすためには、ページに認証をかける *1 とか、編集時にチェックボックスをクリックさせる(SPAM対策でもよくある)とかが考えられるけど、フツーに使っている人の利便性も下がってしまうので、場合によってはあまり良い手段ではない。

  • アクセスログ(IPアドレス)を残しておくことで、荒らす側の心理的コストを上げる。
  • コメント SPAM 対策として、ブラックリストの IP アドレスを弾く。

といった対策は有効かもしれない。

逆に、「復旧するコスト」を下げるためのポイントは2つ。

  • 元に戻してくれる人を増やす
  • 元に戻すための手間を減らす

前者は、前述のただのにっきで書かれている「流行っているサイトほどNoiseが少ない」に繋がるものがある。

PukiWiki での復旧

で、本題の「元に戻すための手間を減らす」話。

PukiWiki では編集するごとにバックアップを取ることができる。 そのページが残っている時は、メニューの「バックアップ」から復旧できるけど、ページ自体を消されたときの復旧の手順が少し面倒だったりする。

  1. RecentDeleted にて削除されたページを見つけ、「?」をクリックして編集画面へ移る。
  2. 適当な内容を入力し、ページを復活させる
  3. メニューの「バックアップ」を選び、過去の履歴から編集したい版を表示させる。
  4. ソースをクリップボードにコピーする。
  5. 編集画面を開き、コピーした内容を貼り付けて保存。

と、これでは荒らす手間に比べて復旧の手間のほうがかかる。 同じ Wiki エンジンである BitChannel だと、戻す手間はこうなる。

  1. Recent か List から該当のページを見つける。
  2. メニューの History を選び、過去の履歴から編集したい版を表示させる。
  3. 「Revert to this revision」をクリックし、内容を確認して保存。

BitChannel には RecentDeleted の機能がないから完全には比較はできないけど、 PukiWiki でも 2 と 4 の手順は省略できるように思う。

ツッコミの通り、編集画面のメニューからバックアップを選べば手順2は不要だった。 なので、この下で書いている改造はそれほど意味が無かったみたい。

やってみた

RecentDeleted から一旦ページを作るのは無駄なので、 直接バックアップのページへ飛べるようにした。

● 2004-12-14 (火) 6:00 - SandBox?
● 2004-12-14 (火) 5:55 - PukiWiki?

と表示されていたのを、

● 2004-12-14 (火) 6:00 - SandBox? (backup)
● 2004-12-14 (火) 5:55 - PukiWiki? (backup)

と後ろに (backup) を付け、それをクリックするとバックアップの画面に飛ぶ。 本当は、アイコンを表示するようにしたほうがいいのかも。

ソースは、 lib/file.php を修正している(PukiWiki 1.4.4 ベース)。

@@ -170,14 +170,16 @@
        // Update RecentDeleted
        $lines = $matches = array();
        foreach (get_source($whatsdeleted) as $line) {
-               if (preg_match('/^-(.+) - (\[\[.+\]\])$/', $line, $matches))
+               if (preg_match('/^-(.+) - (\[\[.+\]\])/', $line, $matches))
                        $lines[$matches[2]] = $line;
        }

        $_page = "[[$page]]";
        if (isset($lines[$_page])) unset($lines[$_page]);

-       array_unshift($lines, '-' . format_date(UTIME) . " - $_page\n");
+       $r_page = rawurlencode($page);
+       $_backup = "[./?cmd=backup&page=$r_page backup]";
+       array_unshift($lines, '-' . format_date(UTIME) . " - $_page (" . $_backup . ") \n");
        $lines = array_splice($lines, 0, $maxshow_deleted);

        $fp = fopen(get_filename($whatsdeleted), 'w') or

$_backup への代入の行が、少しやっつけ。 InterWikiName に

-[./?cmd=backup&page= Backup]

と書いておいて

$_backup = "[[Backup:$page]";

としたほうがいいかもしれない。

これに加えて、バックアップから編集画面へ飛べるようになるといいんだけど、ちょっと難しそうだったので断念…。

追記

IPアドレスによるフィルタリングはWikiBlackListが参考になる。

さらに追記

TypeKey (参考)を使って認証する方法もあり。興味深い。

関連する日記