2010年9月19日日曜日

AntiSpam.pmをPHPに移植

いやー久々にPHP触りました。予想を遥かに超えて詰んでしまった。疲れた・・・。

まず、そのままのコードだと PHP 5.3 以降でしか動きません(無名関数を使っているので)。
てか無名関数が最近導入されたってどういうことなの・・・。

Download AntiSpam.php

PHP 5.3以上でなくとも動くようにするには(PHP 5 以上)、"exe"メソッドを以下のように修正。

public function exe ($exec) {
    return is_file($exec) ? $exec : $this->find();
}

上記の方法だとHTMLエンティティ化はされません。ですが、対応版のコードは書く気力も無いし書く気もありません。
Version 1.1.0より可変関数によってエンティティ化されるため、そのままでもPHP5以降なら動きます。

そしてAntiSpam.phpの使い方。まず、データファイル(AntiSpam.cgi)を用意。
次に、以下のコードを書いた記録実行用ファイル(AntiSpamExe.php)を用意。

require('AntiSpam.php');
$antispam = new AntiSpam('AntiSpam.cgi');
$antispam->set();

次にご利用中のPHP掲示板の投稿フォーム出力スクリプトに以下を追加。

require('AntiSpam.php');
$antispam = new AntiSpam('AntiSpam.cgi');
echo '<img src="'.$antispam->exe('AntiSpamExe.php').'" width="0" height="0" alt="">';

最後に、ご利用中のPHP掲示板の投稿受理処理の前に以下を追加。

require('AntiSpam.php');
$antispam = new AntiSpam('AntiSpam.cgi');
$antispam->is() && exit(); // exitは別のものに置き換えてよし。isメソッドは場合によって戻り値が変わる。
  • データファイルにIPアドレスが存在しない:1
  • 最終記録時刻と現在時刻の差がminimum以下:2
  • 最終記録時間と現在時刻の差がmaximum以上:3
  • 連続チェック回数がcontinuance以上:4
  • その他(正常):0

是非使ってみてください。これを実装してしまえば今のところ99%以上スパムをブロックできます。
それにしてもPHPは遅い。クラス化したから更に遅いし、モジュール版で動かしたPHPでもPerl/CGIには速度で勝てないな。。。

0 件のコメント:

コメントを投稿