PukiWiki の荒らし対策
PukiWiki に限らず Wiki 全般に言えることだけど、「荒らすコスト」<「復旧するコスト」であれば荒らしは発生しにくいように思う。 このあたりの話は、 Wikiと荒らし - 羊堂本舗 ちょき や ただのにっき(2003-02-25) に詳しい。
「荒らすコスト」を増やすためには、ページに認証をかける *1 とか、編集時にチェックボックスをクリックさせる(SPAM対策でもよくある)とかが考えられるけど、フツーに使っている人の利便性も下がってしまうので、場合によってはあまり良い手段ではない。
- アクセスログ(IPアドレス)を残しておくことで、荒らす側の心理的コストを上げる。
- コメント SPAM 対策として、ブラックリストの IP アドレスを弾く。
といった対策は有効かもしれない。
逆に、「復旧するコスト」を下げるためのポイントは2つ。
- 元に戻してくれる人を増やす
- 元に戻すための手間を減らす
前者は、前述のただのにっきで書かれている「流行っているサイトほどNoiseが少ない」に繋がるものがある。
PukiWiki での復旧
で、本題の「元に戻すための手間を減らす」話。
PukiWiki では編集するごとにバックアップを取ることができる。 そのページが残っている時は、メニューの「バックアップ」から復旧できるけど、ページ自体を消されたときの復旧の手順が少し面倒だったりする。
- RecentDeleted にて削除されたページを見つけ、「?」をクリックして編集画面へ移る。
適当な内容を入力し、ページを復活させる。- メニューの「バックアップ」を選び、過去の履歴から編集したい版を表示させる。
- ソースをクリップボードにコピーする。
- 編集画面を開き、コピーした内容を貼り付けて保存。
と、これでは荒らす手間に比べて復旧の手間のほうがかかる。 同じ Wiki エンジンである BitChannel だと、戻す手間はこうなる。
- Recent か List から該当のページを見つける。
- メニューの History を選び、過去の履歴から編集したい版を表示させる。
- 「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 (参考)を使って認証する方法もあり。興味深い。