検索

Google
Web www.icefree.org

RSS of recent changes

 

Pukiwiki

2017-10-04 (水) 22:51:28 (2389d)

 このサイトはPukiwikiで動いています。

Pukiwiki Tips

コメントスパム対策(2006/07/26)

 昨日からコメントスパムがくるようになったので対策してみました。
 対策方法は、nucleusで効果のあったエンコーディングでの判別です。今回は条件をちょっと緩くして、URLが入っていなければ許容するようにしました。

comment.inc.phpに以下を追加。$var['msg']の空文字列判定のあとくらいに入れます。

if (mb_detect_encoding($vars['msg']) == "ASCII" &&
    stripos($vars['msg'], "http://") !== FALSE) {
  return array('msg'=>'', 'body'=>'');
}

(2006/08/13)修正

http://が文字列の最初にあると0を返して!=だとFALSEと適合してしまう不具合がありました。
型情報を含む比較(PHP4から導入)!==が正しいです。

(2006/10/20)修正

Http://と書いてくる人(マシン?)がいるので、strposをstriposに変えました。

(2006/11/05)修正

http://が含まれていなくてもエンコーディングがASCIIなだけでspamと判定されるようにしました。
spam判定されたものは、spamページに書き込まれるようにしました。
今のソースは、こんな感じです。
その場でdigestを計算してるので、衝突判定は完全ではありません。

$notimestamp = FALSE;
if (mb_detect_encoding($vars['msg']) == "ASCII")
{
 $vars['refer'] = 'spam';
 $vars['digest'] = md5(@join('',get_source($vars['refer'])));
 $notimestamp = TRUE;
}

後ろの方のpage_writeを

page_write($vars['refer'], $postdata, $notimestamp);

(2006/11/08)修正

予想外にspamが多く、spamページの負荷が尋常でないので、spam扱いになった場合は従来どおり何もしないようにしました。

(2007/03/08)修正

ASCII以外のspamも少数ながら毎日のように来るので、エンコードを調べました。ロシア語らしいのですが、mb_encodingではEUC-JPで判定されるようです。
今回は、エンコード判定ではなく、httpの出現回数で弾くようにしました。出現回数が1コメントで10個を超えた場合はspamとみなすことにしました。
リンクが多いほど文字数も多く、手動で消す手間もかかるので、この対策も結構有効だと予想しています。

if (mb_detect_encoding($vars['msg']) == "ASCII")

if (mb_detect_encoding($vars['msg']) == "ASCII"
    || mb_preg_match("/http/i", $vars['msg']) > 10)

にしました。

ちなみに、過去50日分のログを見てみると、POSTメソッドの呼び出しが約1万件あります。1日あたり200件です。その大部分はコメントスパムです。
ASCIIを不可にすると99%は弾けます。漏れるのは1日あたり1件程度です。おそらく、2,3程度のごく限られたスパマーだけがすり抜けているのでしょう。

(2008-11-14 (金) 22:07:21)
httpの許容数を2にしました。

(2009-04-10)
http.*bizがある場合にspam扱いするようにしました。

(2013-08-30)
最近スパムが多いので、対策を強化しました。
URLがあった場合、自動でNGワードに追加されます。
問題のないURLは手動で除外します。性悪説での対処です。

(2013-09-09)
スパム判定に引っかかったIPは、コメントをかけないようにしました。

(2013-09-10)
大部分は除外できるようになりましたが、そもそも無駄なアクセスが多すぎるので、中国からのアクセスは禁止しました。
あまりそういう弾き方は好きではありませんが、一日あたり1万件もスパムのアクセスがあると流石に許容できません。


グーグル向け対応

 Googleなどのサーチエンジン向けには、?や&の付かないページを提供したほうが上手く拾ってくれます。
 そこで、pgidプラグインとApacheのRewriteで書き換えました。

 PukiWiki静的URL改造を参考にしました。

.htaccessには、以下の行を追加

DirectoryIndex index.php
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9]*)\.html(#.*)?$ /pukiwiki.php?plugin=pgid&id=$1$2

 あと、&pgidなどを書くのが面倒だったので、lib/make_link.phpを変更しました。本来は、Pukiwiki本体に手を付けないためのpgidプラグインなのですが、やっぱり楽なほうがいいのです。

 だいぶ汚い改造ですが、添付ファイルからダウンロードできます。
差分ではなくmake_link.phpが丸ごと入っています。

 この改造では、recentとかtopicpathは変換されません。今回の目的は、全てのURIを静的にすることではなく、サーチエンジンに引っかかり易くするためのものなので、この辺で妥協しました。

コメントプラグインの変更

ユーザ名をWikiName?にされても、ユーザ名のページを作れないので、WikiName?にしないようにしました。

<define('COMMENT_NAME_FORMAT','[[$name]]');
>define('COMMENT_NAME_FORMAT','$name');