【Pukiwiki】荒らし対策

PukiWiki, Web 2010年2月21日,

DropWikiを運営していて最もうっとーしーのが荒らしですが、
機械的に爆撃してくるタイプやスパム書き込みしてくるタイプから
手動で一生懸命いじってくるのまでさまざまです。

ただ、こっちとしては対策なんてIPのアク禁しかできず、
コロコロとIP変えられると正直お手上げ状態なわけですが
これまで運営していて荒らしに対応しやすい体制というかWikiの改造等を紹介


PukiWiki もBBQなどのブラックリスト対応に

元ネタはこちら
なんか問題があるらしくこの方法ではじく為に対応しているプラグインが少ないらしい。
でもまぁ、編集とか新規作成、commentとpcommentさえ対応していれば問題ないので。
記事ではもうすでになくなってしまったlist.dsbl.orgが入ってたりするのでちょっと改造したソースを。

① // Check edit-permission と書かれた部分の前に以下を挿入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// { check for blacklist
// http://xoopscube.jp/modules/newbb/viewtopic.php?topic_id=10694&forum=14
function is_blacklisted($dnsbl_target) {
   $dnsbl_check=array("niku.2ch.net",
                      "http.dnsbl.sorbs.net",
                      "bbx.2ch.net",
                      "all.rbl.jp",
//                    "zen.spamhaus.org",
                      "b.barracudacentral.org"
                      );
   if ($dnsbl_target) {
       $quads=explode(".",$dnsbl_target);
       $rip=$quads[3].".".$quads[2].".".$quads[1].".".$quads[0];
       for ($i=0; $i<count($dnsbl_check); $i++) {
           if (checkdnsrr($rip.".".$dnsbl_check[$i] . '.',"A")) {
               $listed.=$dnsbl_check[$i]." ";
           }
     }
       if ($listed) { return $listed; } else { return FALSE; }
   }
}
// check for blacklist }

②そのちょい下らへんにglobal $script, $_title_cannotedit, $_msg_unfreeze;
という部分があるので以下を挿入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// { check for blacklist
$blacklisted = "Your host is blacklisted.";
if (is_blacklisted($_SERVER['REMOTE_ADDR'])) {
  // With exit
  $body = $title = str_replace('$1',
    htmlspecialchars(strip_bracket($page)), $_title_cannotedit);
  if (is_freeze($page))
    $body .= '( &lt;a href="' . $script . '?cmd=unfreeze&amp;page=' .
      rawurlencode($page) . '"&gt;' . $_msg_unfreeze . '&lt;/a&gt;)';
  $page = str_replace('$1', make_search($page), $blacklisted);
  catbody($title, $page, $body);
  exit;
}
// check for blacklist }

要は
niku.2ch.net (2ちゃんねるで悪用されたホストのBL)
http.dnsbl.sorbs.net (メールの不正中継したホストや、ウイルスメールを発信したホストのBL)
bbx.2ch.net(2ちゃんねるで広告爆撃したホストのBL)
all.rbl.jp (メールの不正中継したホストや、ウイルスメールを発信したホストのBL)
b.barracudacentral.org (スパムホストのBL)

のブラックリストに入ってたら弾く!という設定なわけだけど
zen.spamhaus.org
ここはかなり厳しい基準で取得していってていろいろ問題起こってるので乗せたソースではコメントアウトしてます。



英数字のみの書き込みを削除

URLだけの書き込みも巻き込まれるけど、
海外の野郎どもがイミフな文字列をコメントに残していくのは完全にはじけた。
中国韓国のSPAMには対応できていないのできたら対策しないといけない~。
これは、ひにゃのさんが改造してくれた。
多分ここをみてソースパクってきたに違いない。

①pukiwiki.ini.php
末尾に以下を追加。

1
2
3
4
5
6
//スパム対策用
function check_commentFilter($msg) {
  if(preg_match("/^[!-~\n ]+$/", $msg)) {
    die_message('日本語を含まないコメントは書き込みできません。');
  }
}

いや、末尾っていっても ?>の前にね。
2バイト文字にも対応するには preg_match(“/^[^ぁ-ヶ]+$/u”, $msg)  とかにする。
これに変更すると「ひらがな」「カタカナ」が含まれないと書き込みできなくなる。

②plugin/edit.inc.php
上の方のplugin_edit_action の関数の中で
check_editable($page, true, true);の下に以下を追記する。

1
check_commentFilter($vars['msg']);

③plugin/comment.inc.php
上の方のplugin_comment_actionの関数の中で
if (PKWK_READONLY) die_message(‘PKWK_READONLY prohibits editing’);
の下に以下を追記する。

1
2
check_blackList($vars['page']);
check_commentFilter($vars['msg']);

多分ブラックリスト機能?使ってなかったらcheck_blackList($vars[‘page’]);はいらないと思うんだけど
ひにゃのさんが載せてるみたいなのでそのまま。

④plugin/pcomment.inc.php
上の方のplugin_pcomment_actionの関数の中で
if (PKWK_READONLY) die_message(‘PKWK_READONLY prohibits editing’);
の下に以下を追記する。

1
check_commentFilter($vars['msg']);

.htaccessで制限


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SetEnvIf Accept-Language "^[^(ja)]+$" non_japanese
SetEnvIf Accept-Language "zh-(cn|tw)" env=non_japanese
SetEnvIf X-Forwarded-For "59\.(5[6-9]|6[0-1])\.[0-9]+\." cn_spam
SetEnvIf X-Forwarded-For "218\.6\.([0-9]|[0-9]{2}|1[0-1][0-9]|12[0-7])\." cn_spam
SetEnvIf X-Forwarded-For "220\.16[0-2]\.[0-9]+\." cn_spam
SetEnvIf X-Forwarded-For "222\.7[6-9]\.[0-9]+\." cn_spam
SetEnvIf Forwarded "59\.(5[6-9]|6[0-1])\.[0-9]+\." cn_spam
SetEnvIf Forwarded "218\.6\.([0-9]|[0-9]{2}|1[0-1][0-9]|12[0-7])\." cn_spam
SetEnvIf Forwarded "220\.16[0-2]\.[0-9]+\." cn_spam
SetEnvIf Forwarded "222\.7[6-9]\.[0-9]+\." cn_spam
SetEnvIf Expect "^.+$" spam_proxy
order allow,deny
allow from all
deny from env=non_japanese
deny from env=cn_spam
deny from env=spam_proxy

中国語やらのプロキシなどを弾くにはこんな感じ。

コメントどうぞ