- 2010-04-14 水 01:52:55
- PHP
掲示板スパム対策の取り組みもこれでひと区切りとしたいと思います。
PHPスクリプトのダウンロードとドキュメントはこちらです。
spamp : 掲示板スパムバリデータ
spampは、マルチバイトを含まない投稿をはじく、
投稿出来るURL数を限定する、
プロキシっぽいクライアントを拒否する、
といったフィルタはまったく使っていません。
CAPTCHA(画像認証)やパスワードによる認証でもありません。
掲示板スパムボットのプロファイリングから生まれた
ロジックで判定をおこなっています。
人がやれば簡単に突破できる
極めて単純な仕組みですが自動投稿ロボットにはこれが難しいのです。
いつか新手のロボットが現れるまでの繋ぎとはわかってますが
その時はまたプロファイリングしてロジックを組み直したいと思います。
ロボットを手先に、楽して一発儲けようとしてる
スパム業者なんぞには負けません。
それにしてもここ1ヶ月くらいで
コメントスパムのリクエスト数が激減。多い日でも3件程度に減りました。
このフィルタリングの影響・・・とは考え難いので
他にそれっぽい記事を見ないので
Waledacボットネットの件が影響してたのかな・・・。
さて最後に、WordPressのコメント投稿に
組み込んだ方法を紹介しておきます。
とりあえず「最少限必要な設定」まではドキュメントに準じて準備します。
次、コメントフォームのテンプレートには</form>の下に
イメージタグを書き足しました。
comments.php
</form> <div><img src="http://yourhost/access.php" width="1" height="1" alt="accessLogging"></div>
http://yourhost/access.php のところは
実際に配置したaccess.phpのパスに書き換えてください。
直接WordPressのコードに施したのはこれだけです。
つづいて判定処理の方は
WordPressにはできるだけ手を加えたくないので
こんなPHPスクリプトを用意し
auto_prepend_fileで役割分担 の要領で処理することにしました。
spampFilter.php
<?php /** * Spamp filter for PHP4 */ function __loadSpamp() { // ココは実際にspamp.phpを配置したパスに書き換えてね。 require_once '/home/userdir/lib/spamp/spamp.php'; } /** * コメントフォームのリクエストには、あえてスパムクッキーを送信 */ if ( 'GET' === $_SERVER['REQUEST_METHOD'] && preg_match('~^/blog/archives/[0-9]+~', $_SERVER['REQUEST_URI']) ) { __loadSpamp(); $Spamp = new spamp(); $Spamp->sendCookie(true); $Spamp = null; return; } /** * POSTでない、コメント投稿のリクエストでもないなら、即リターン */ if ( 'POST' !== $_SERVER['REQUEST_METHOD'] || '/blog/wp-comments-post.php' !== $_SERVER['REQUEST_URI'] ) { return; } /** * 残るコメント投稿リクエストをSpampチェック */ __loadSpamp(); $Spamp = new spamp(); // スパムでなければセッションとインスタンスを破棄してリターン if (!$Spamp->isSpam()) { $Spamp->removeSession(); $Spamp = null; return; } /** * これはスパムだ!という場合、HTTP_REFERERがあれば戻る */ if ( isset($_SERVER['HTTP_REFERER']) && isset($_SERVER['HTTP_REFERER']{0}) && !preg_match('~[[:cntrl:]]~', $_SERVER['HTTP_REFERER']) ) { header('Location: '.$_SERVER['HTTP_REFERER']); exit(); } /** * HTTP_REFERERが無い場合このまま強制終了 */ header('HTTP/1.0 404 Not Found'); header('X-Powered-By: Spamp'); exit();
WordPressにはAkismetというとっても賢い
スパムフィルタがあるけど、Spampの働き具合を見るため
今はこれも外し、承認待ちも無い状態にしてます。
それから、グローバルスコープで return すると
読み込み元のスクリプトに処理が戻るというを
この改造ではじめて知りました。
これはなかなか使える裏技です。別に裏でもないか。
- 新しい: 攻撃的(?)なリクエストのサンプル
- 古い: 攻撃的?なリクエストをフィルタリングしてみる
コメント:0
トラックバック:0
- この記事のトラックバック URL
- http://beatnik.jp/blog/archives/418/trackback
- トラックバックの送信元リスト
- spamp:掲示板スパムバリデータ出来ました - PHPで翻訳三昧 より