PukiWiki/Akismetによるspam(スパム)防止機能 http://www.ark-web.jp/sandbox/wiki/190.html
PukiWiki/Akismetによるspam(スパム)防止機能
- 見習い中の小沼です。
- スパム防止用のPukiwikiライブラリを作成しましたので公開いたします。
- 2007/1/26のAkismet側のクラスの変更で動かなくなっていましたので、修正しました。
目次 †
spam(スパム)対策が必要になった契機 †
- 当ホームページの中にアークウェブ プロジェクト管理方法ご紹介というページがあります。
- そのページにPukiWikiのプラグインであるtrackerを置いているのですが、そこが今月(2006年12月)の頭ごろからスパムの標的になってしまいました。
- ひどいときは一日に20件近く投稿されていました。
- 会社のWebサイトがスパムだらけになってしまったら、まるでメンテナンスができていないような印象を与えてしまい、会社のイメージを大きく傷つけます。
- かといって、毎回手作業でスパム投稿を削除していたのでは大変ですので、今回PukiWikiのスパム防止機能を作成することになりました。
Akismetについて †
- Akismetというスパムチェック用のWebAPIがあります。
http://akismet.com/development/ - 今回のspam対策にこのAPIを利用させていただきました。
導入方法 †
- 今回作成した機能を利用される方は以下の手順をおこなってください。
事前準備 †
- webapi登録
- まずAkismetにユーザ登録をする必要があります。
- 以下のページからユーザ登録をおこない、APIキーを取得してください。(基本的に無料ですが、商用に利用する場合は有料となります。)
http://wordpress.com/api-keys/
- 以下のページからユーザ登録をおこない、APIキーを取得してください。(基本的に無料ですが、商用に利用する場合は有料となります。)
- まずAkismetにユーザ登録をする必要があります。
- Akismetクラスダウンロード
- 以下のページからPHP4用のAkismetクラスをダウンロードしてください。
http://miphp.net/blog/view/php4_akismet_class
- 以下のページからPHP4用のAkismetクラスをダウンロードしてください。
- ライブラリをダウンロード
- ここからダウンロードしてください。
- 最新のものです。2007/1/26以降のAkismetクラスを利用する場合はこちらを利用してください。(利用するときはファイル名 末尾の1.2は消してください。)
- 以前のものです。2007/1/26以前のAkismetクラスを利用する場合はこちらを利用してください。
- ここからダウンロードしてください。
ファイル書き換え †
いくつか書き換えが必要な箇所があります。
- akismet_filter
- 先ほどダウンロードしたakismet_filter.phpに以下のような記述があります。
/* * 使用時に以下の定数を書き換えてください。 */ //チェック対象とするプラグイン名。カンマ区切り define('PLUGIN_NAME_WITH_AKISMET_CHECK', 'comment,tracker,article'); //スパムチェック時には無視するPostデータ。カンマ区切り define('IGNORE_KEY_WITH_AKISMET_CHECK', 'digest'); //Akismetで取得する。APIキー define('API_KEY', '2e7eac269cf1');
- ここを適切な値で書き換えてください。
- IGNORE_KEY_WITH_AKISMET_CHECKは特に書き換える必要はありません。
- 先ほどダウンロードしたakismet_filter.phpに以下のような記述があります。
- plugin.php
- actionが呼ばれたときに、スパムチェック機能が呼び出されるように、plugin.phpを書き換える必要があります。
- plugin.phpの中にdo_plugin_action()という関数があります。その中にakismet_filter.phpを呼び出す記述をしてください。以下のようになると思います。
function do_plugin_action($name) { if (! exist_plugin_action($name)) return array(); if(do_plugin_init($name) === FALSE) die_message('Plugin init failed: ' . $name); //Akismet Spam Filter require_once(LIB_DIR . 'akismet_filter.php'); if ( is_spam_message($_POST, $name) == "1" ) die_message("Spam check failed. Plugin:$name"); $retvar = call_user_func('plugin_' . $name . '_action'); ...略
- plugin.phpの中にdo_plugin_action()という関数があります。その中にakismet_filter.phpを呼び出す記述をしてください。以下のようになると思います。
- actionが呼ばれたときに、スパムチェック機能が呼び出されるように、plugin.phpを書き換える必要があります。
ファイルのアップロード †
- ダウンロードしたakismet(Akismet.class.php )と、akismet_fileter.phpをpukiwikiのライブラリフォルダに配置してください。
pukiwiki/lib/Akismet.class.php pukiwiki/lib/akismet_fileter.php
- これで設定は全てです。
- 画面から操作し、正しく動くことを確認してください。
内部的なこと †
- このSpam対策の仕組みをご説明します。といっても大したことはしていません。
- まず作成したakismet_filter.phpは以下のようになっています。
<?php /** * * <b>Usage</b> * <code> * require_once(LIB_DIR . 'akismet_filter.php'); * if ( is_spam_message($_POST, $name) == "1" ) * die_message("Spam check faild. Plugin:$name"); * </code> * * @author Akio KONUMA konuma@ark-web.jp * @link http://www.ark-web.jp/sandbox/wiki/190.html * @version 1.2 */ require_once 'akismet.class.php'; /* * 使用時に以下の定数を書き換えてください。 */ //チェック対象とするプラグイン名。カンマ区切り define('PLUGIN_NAME_WITH_AKISMET_CHECK', 'comment,tracker,article'); //スパムチェック時には無視するPostデータ。カンマ区切り define('IGNORE_KEY_WITH_AKISMET_CHECK', 'digest'); //Akismetで取得する。APIキー define('API_KEY', ''); function is_spam_message($post_data, $plugin_name){ //PLUGIN_NAME_WITH_AKISMET_CHECKを配列に変換 $plugin_names = explode(",", PLUGIN_NAME_WITH_AKISMET_CHECK); //IGNORE_KEY_WITH_AKISMET_CHECKを配列に変換 $ignore_post_keys = explode(",", IGNORE_KEY_WITH_AKISMET_CHECK); if (in_array($plugin_name, $plugin_names)) { //チェック対象のプラグインの場合。 //Postデータを連結する。 foreach ($post_data as $key => $val) { //ignore_post_keysに設定されているPostデータはAkismetに送らない if (!in_array($key, $ignore_post_keys)) { $body = $body . $val; } } //Akismetに送信するデータを作成する。 $comment = array(); $comment['author'] = ''; $comment['email'] = ''; $comment['website'] = ''; $comment['permalink'] = ''; $comment['body'] = $body; $akismet = new Akismet(URL, API_KEY, $comment); return $akismet->isSpam(); } return false; } ?>
- is_spam_messageが呼ばれると、実行されるプラグインが処理対象とするもの、つまり定数PLUGIN_NAME_WITH_AKISMET_CHECKで指定されているもの(上記例の場合trackerとcommentとarticle)であるかの判定をおこないます。
- 処理対象のプラグインであった場合は、PostデータをもとにAkismetクラスに渡すデータを作成します。(IGNORE_KEY_WITH_AKISMET_CHECKで指定されたPostデータは除外する)
- 最後に、上で作成したデータをAkismetクラスに渡し、スパム投稿かどうかの判定を行っています。
- まず作成したakismet_filter.phpは以下のようになっています。
- 次にplugin.phpを以下のように書き換えることによって、アクションが実行された場合に、先ほどのis_spam_message関数が呼ばれるようにしています。
require_once(LIB_DIR . 'akismet_filter.php'); if ( is_spam_message($_POST, $name) == "1" ) die_message("Spam check faild. Plugin:$name");
以上です。
関連ページ †
- 上記導入方法でファイル名が「akismet_fileter.php」になっている箇所があったので、一応報告しておきます(正しくは「akismet_filter.php」) -- 2007-05-12 (土) 19:41:03
- こちらのスパムフィルタのライセンスについて質問させてください。
こちらのAkismetのスパムフィルタをベースにして、PukiWiki用のスパムフィルタを作っております。
http://www.miasa.info/index.php?%C8%FE%CB%E3Wiki%A4%C7%A5%B7%A5%B9%A5%C6%A5%E0%C5%AA%A4%CB%BD%A4%C0%B5%A4%B7%A4%C6%A4%A4%A4%EB%C5%C0#ofa18e88
このスパムフィルタの特徴は、一つの手法だけではなくて、簡単な良くあるフィルタ、例えば日本語が含まれない投稿だとか、NGワード/URLが含まれる投稿だとか、そういったことをサイトの状況に合わせて組み合わせ条件でフィルタに設定できる、というものです。
組み合わせ条件で利用することで、誤検出や負荷の低減が出来ます。
そのフィルタの一つとして、元々のAkismetのフィルタも利用できるようになっています。
今までは小さなパッチとフィルタだったため、あまりライセンスについて考えていなかったのですが、だんだんとフィルタが大きくなってきたため、PukiWikiのライセンスに合わせて、GPL2での公開、ということにしたいと考えております。
しかし、元々こちらのフィルタをベースにさせていただいており、Akismetの呼び出し部分はほぼそのままです。
そこで、こちらのスパムフィルタのライセンスはどう考えられていらっしゃるのか教えていただけませんでしょうか。
もしよろしければ、GPL2での公開としていただけるとありがたいのですが。
メールでご連絡したほうが良いかと思ったのですが、ご連絡先のメールアドレスもわかりませんでしたので、こちらに書かせていただきました。 -- さとう (satoh at hakuba dot jp) 2007-05-28 (月) 13:09:41 - 「akismet_fileter.php」について。連絡ありがとうございます。修正しました。 -- 小沼 2007-05-29 (火) 10:26:30
- さとうさん。 ご連絡ありがとうございます。こちらPukiwikiに倣いGPLで公開することにします。添付ファイルにもライセンス条項を記載しておきました。 -- 小沼 2007-05-29 (火) 10:28:45
- たいへんありがとうございました。今後もすばらしい情報を発信されることを期待しております。 -- さとう? 2007-05-29 (火) 14:57:51
- ありがとうございます(o^_^o) -- 小沼 2007-06-01 (金) 10:27:25
- http://3freesex.com x -- Zmajrjq? 2007-06-02 (土) 23:41:40
- http://3freesex.com x -- Zmajrjq? 2007-06-02 (土) 23:41:41
- -- Nbkvqid? 2007-06-03 (日) 10:13:50
- 対策を施してもすり抜けてくるやつはいます。。。 -- 小沼 2007-06-04 (月) 10:42:46
- c499t -- ma112zda? 2007-10-20 (土) 12:08:53