- お知らせ -
  • 当wikiのプログラムコードの表示を直してみました(ついでに長い行があると全体が下にぶっ飛ぶのも修正)。不具合があればBBSまでご連絡下さい。

はじめにと現状 Edit

Pukiwikiは誰でも書き込める反面、
掲示板と同様にスパムに悩まされます。
そこで、スパム(spam)を防止する方法を書いてみようという話です。

とくに、コメントスパムがひどい模様。
現在は、ページ新規作成スパムがヒドイ……。

spam_filter.php導入してみました。
今のところ、機械スパムは、ほとんど防げています。

spam_filter.php ver 0.75向けにページを書き直しました。

その他のスパムメモ→ ./スパマーメモ

spam_filter.php Edit

以下の「NGワード」、「Akismet」、「ファイル添付防止」は全て、
以下のサイトの spam_filter.php で対処できます。

美麻Wikiでシステム的に修正している点 - 美麻Wiki

導入方法は上記サイトに書いてあります。

導入後は、
pukiwiki.ini.phpに

例えば、

function isWindowsMachine()
{
  return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
}
function isLocalTestMachine()
{
  // windows machine is local test environment
  return $_SERVER['REMOTE_ADDR'] === '127.0.0.1';
}

define('SPAM_FILTER_AKISMET_API_KEY', '<akismet APIキー>');

$spamFilterCond = '#useragent() || #filename() || #formname() || (#onlyeng() && (#atag() || #urlnum())) || #urlbl() || #uaunknown()';

if (!isLocalTestMachine()) $spamFilterCond .= ' || #urlnsbl(SPAM_FILTER_URLNSBL_REG) || #urlnsbl(MY_SPAM_FILTER_URLNSBL_REG)';

define('SPAM_FILTER_COND', $spamFilterCond);

// my URLNSBL setting
define('MY_SPAM_FILTER_URLNSBL_REG', '/(\.theplanet\.com)/i');


$spamFilterCapchaCond = '#onlyeng() || #url(SPAM_FILTER_URL_REG,"comment,pcomment,article") || #atag() || #acceptlanguage()';

if (!isLocalTestMachine()) $spamFilterCapchaCond .= ' || #ipdnsbl()';

define('SPAM_FILTER_CAPTCHA_COND', $spamFilterCapchaCond);

define('SPAM_FILTER_RECAPTCHA_PUBLICKEY',  '<reCAPTCHAから取得した公開鍵>');
define('SPAM_FILTER_RECAPTCHA_PRIVATEKEY', '<reCAPTCHAから取得した秘密鍵>');

// 0.7.5の公式のものから、サービス停止しているlist.dsbl.org を除外
define('SPAM_FILTER_IPDNSBL_DNS', 'niku.2ch.net,bsb.spamlookup.net,bl.spamcop.net,all.rbl.jp'); 

// setting full-path of nslookup
if (PHP_OS == "FreeBSD") {
  define('SPAM_FILTER_NSLOOKUP_PATH', '/usr/sbin/nslookup');
} elseif (isWindowsMachine()) {
  define('SPAM_FILTER_NSLOOKUP_PATH', 'nslookup');
}

などと書いておけばよいです。

これで、99.9%のスパムは防げます。

やっていることは、
まずは、問答無用でスパムとする判断(SPAM_FILTER_COND)ですが、

  • 特定のUSER_AGENTを抑止 #useragent()
  • HTMLの添付ファイルの禁止 #filename()
  • 指定以外のフォーム名(メールなど)に入力がある場合に抑止 #formname()
  • 英字のみで、HTMLリンクタグか、URL数が多い場合を抑止 #onlyeng() && (#atag() || #urlnum()))
  • URLブラックリストで対処 #urlbl()
  • USER_AGENTが不明なのを抑止 #uaunknown()
  • ローカル環境でない場合
  • MY_SPAM_FILTER_URLNSBL_REGに拒否したいネームサーバーを正規表現で追加

次に、それをすり抜けた場合、
reCAPTCHA(歪み画像認識API)を通す判断(SPAM_FILTER_CAPTCHA_COND)ですが、

  • 英字のみの時 :D #onlyeng()
  • URLがcommentなどにある場合 #url(SPAM_FILTER_URL_REG,"comment,pcomment,article")
  • HTMLリンクタグがある場合 #atag()
  • IPが韓国や中国などの時 #ipcountry() かなり重いので外してあります
  • ブラウザの言語が中国のとき #acceptlanguage()
  • ローカル環境でない場合、IPがDNSBLに引っ掛かる時 #ipdnsbl()

以上のいずれかの状態のときに reCAPTCHA を通す。

ってな感じです。
一見、対処療法的ではありますが、それ以上の効果を発揮してくれています
spam_filter.phpの作者様には、マジで感謝です。
(つか、CAPTCHAまで対応してくださるとは思わなかった)
本家に取り込まれることを祈りたい。

2009/03/10前後にlist.dsbl.orgがサービス停止したため、#ipdnsblなどが極端に重くなっています。spam_filter.phpが対応されるまで、SPAM_FILTER_IPDNSBL_DNSから、list.dsbl.orgを除外しておきます

最後の指定部分は、ネームサーバーを引くための nslookup のパスの指定ですが、
今のバージョン(0.7.5)では指定しなくても、
php5の環境だろうし、またライブラリ(Net/DNS)でまかなえるので
なくても大丈夫だと思います。

spam_filter.phpをWindowsで動かす Edit

DNSの解決部分がローカルのWindowsで動かないので、パッチを作りました。
spam_filter.php本家に取り込まれました。

filespam_filter_for_windows-0_7_5.patch

これを当てれば、Windowsでも動作します。
Windows XP SP2, Vista SP1で動作を確認しています。

Akismet導入する Edit

結論から言いますと、reCaptchaあればいりません

(たぶんベイズ推定な)スパムフィルターのAkismetについて。
詳しくは、以下を参考のこと。

PukiWiki/Akismetによるspam(スパム)防止機能 - ARK-Web SandBox Wiki

導入は、上のspam_filter.phpを導入することで可能です。
が、現状でspam_filter.phpのAkismetはうまく動いていない気がします。
とはいえ、reCaptchaでほとんど防げるので問題はないのですが。

NGワードで遮断 Edit

正規表現で、NGワードをして、URLっぽいのをはじく設定にする
spamにはほぼ意味ないです。

上記、spam_filter.php で遮断できます。

ファイル添付スパム Edit

ファイル添付を自由(管理者以外でも添付可)にしていると、
HTMLのファイル添付をされて、アタックされる。

メールで新着通知を設定していないと、気づかない間にいつのまにか、
設置されていて、((( ;゚Д゚)))ガクガクブルブル

上記、spam_filter.php でHTMLだけ遮断できます。

その他の方法考察 Edit

  • ACIIオンリーの書き込みをはじく
    これは、できればやりたくないけど、
    spam_filter.phpでも対応可能
  • URLリンクは駄目
    spam_filter.phpでも対応可能

過去にやった対策 Edit


Show recent 10 comments. Go to the comment page.

  • あ、たぶんgeoかなんかでパッチ当てた後のものを公開されてた方がいたので、それを勘違いしたんだと思います。すみません。
    本家ではeditに対してのスパムはしてないっぽいんですね。よくそれでやっていけてるなあ…
    DNSBL/URLBLはたぶん、主にメール用のデータになっていて、Wikiや掲示板にまいている連中はメールでのスパムはまいていないため、それで引っかかってこないんではと思います。なので、Wikiや掲示板専用のDNSBL/URLBLを作ってデータ集めれば、そこそこ良いのではと思うのですが、そういう用途のbulkfeedでも引っかからなかったりするんですよね。広く使ってもらわないと十分情報が集まらないので、大手ブログやレンタル掲示板も参加した共用のDNSBLが出来ると良いのでしょうが。 -- さとう? 2007-04-21 (土) 20:07:26
  • test -- 2007-06-02 (土) 11:34:07
  • バグ報告
    --- spam_filter.php.orig	2007-06-02 02:27:10.000000000 +0900
    +++ spam_filter.php	2008-03-29 18:38:45.781250000 +0900
    @@ -201,7 +201,7 @@
         {
             // edit で preview のときはチェック掛けない
             global $vars;
    -        if ($this->pluginname == 'edit' && isset($vars['preview'])) return FALSE;
    +        if ($this->plugin_name == 'edit' && isset($vars['preview'])) return FALSE;
             // フィルタ条件の指定がなければそのまま返る
             if (preg_match('/^\s*$/', $cond)) return FALSE;
    匿名? 2008-03-29 (土) 18:43
  • 配布物は最新の spam_filter.php (0.75) に対応していません。が一応、動作はしますので、対応までしばらくお待ちください。(ここで配布中なのは、1つ前?のDNS問い合わせをキャシュしないバージョンです。なのでちょっと動作が重いです) -- TOBY 2008-04-23 (Wed) 14:40:26
  • 当wikiのspam_filter.phpを最新(0.75)のものにしました。0.75はUnix環境ではほとんどそのままで動くと思います。Windows環境では動かないので、パッチを作って投げたいと思います。
    また、古いバージョンのアーカイブ一式のダウンロードリンクをはずしました。
    現在、このページの記事を0.75向けに書き直しています。 -- TOBY 2008-06-07 (Sat) 10:05:12
  • spam_filter.php 0.75向けに書き直しました。 -- TOBY 2008-06-26 (Thu) 19:42:35
  • 2009/03/10前後にlist.dsbl.orgがサービス停止したため、spam_filter.phpで#ipdnsblを使っていると編集が激重になっている可能性があります。spam_filter.phpが対応されるまで、SPAM_FILTER_IPDNSBL_DNSから、list.dsbl.orgを除外する設定を書いておきました。 -- TOBY 2009-03-29 (Sun) 09:48:05
  • どれが何の設定かを書きました。'MY_SPAM_FILTER_URLNSBL_REG'にてurlnsblを追加する設定を追加。#ipcountry()がかなり重いので一旦外すように。 -- TOBY 2009-05-18 (Mon) 07:34:42
  • スパム・プログラムには色々あるのだろうけど,mod_rewriteで404を返すようにしたら,それだけで終息した(数ヶ月にわたり世界中から来ていたのに)ものもある。ちょっと意外だった。 -- 6PB? 2010-09-23 (Thu) 10:09:53
  • 組み込むのがめんどくさいんだわ。特に設定が

そんなわけで、私の場合、忍者ツールズの忍者アナライズのスクリプトをスキンに組み込んでIPアドレス解析して、忍者バリアもスキンに組み込んでそのIP規制して、これで完成
プロキシさえも規制できるからこれが一番簡単なんだな

以上独り言でした。 -- 通りすがり? 2015-05-17 (Sun) 13:32:04

Name:

Front page   Edit Freeze Diff Backup Upload Copy Rename Reload   New Pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2013-10-11 Fri 04:22:09 JST (1503d)