- 2009-04-16 木 00:19:33
- PHP
このブログ、12日の早朝よりスパム投稿の集中砲火をあびとります。
今朝出勤ししてから仕事を終えて戻るまでに
コメントスパムとトラックバックスパム両方で300件強。
あーめんどくさい。
広く知られた WordPress だけにスパム業者も解析済みのようで
コメントスパムもフォームを拾いに来た形跡がありません。
TBに至ってはフォームそのものが無関係なので
今回は Javascriptでスパム投稿対策 とはいかんようです。
スパム業者には早々退散願いたいところですが
WordPress に手を加えるのもなんだと思ったので
auto_prepend_file
を使ってみました。
auto_prepend_file は、
リクエストされたPHPスクリプトの実行前に
自動で実行するスクリプトを指定するPHPの設定です。
自動 require みたいな事ができます。
コア php.ini ディレクティブに関する説明
auto_prepend_file
これが指定できるのは .htaccess
です。
自動実行させたいスクリプトのパスが
‘/home/userdir/spamFilter.php’ だとすると
該当ディレクトリの .htaccess に次の1行を書き加えます。
.htaccess
php_value auto_prepend_file "/home/userdir/spamFilter.php"
これによりPHPスクリプトがリクエストされると
その実行前に必ず spamFilter.php が実行されます。
自動実行される spamFilter.php は、
普通のPHPスクリプトと変わりなくなんでも出来ます。
ただし、対象のディレクトリ以下全てのPHPスクリプトの実行前に
必ず実行されることになるので使いどころ注意です。
今回はスパム投稿をハネて余分なサーバーの負荷を
減らせれば良いので、POSTメソッド以外はサッサとスルーさせ
残りをブラックリストでフィルタリングです。
引っかかったやつには、
「404 Not Found + 本文無し」 のレスポンスです。
spamFilter.php
<?php if ('POST' === $_SERVER['REQUEST_METHOD']): $__isSPAM = false; /** * このへんは、UAやHost、Proxyっぽいものなど * 適当にブラックリストでフィルタリング。 * 該当する場合は $__isSPAM = true; にする。 */ if (true === $__isSPAM) { header('HTTP/1.0 404 Not Found'); exit(); // SPAMに本文は不要! } endif; ?>
auto_prepend_file でこうした役割を持たせれば
アプリケーションに手を加えることもなく本来の役割に専念させられます。