恐らく SPAMロボットは、登録フォームの register.php を、検索して発見してユーザー登録を試みていると思われるので、このファイルを別名に置き換えて、bbPress へのロボットの登録を防ぐ事にしてみました。
SPAM投稿を防ぐのでは無く、それ以前にスパムユーザーの登録(もしくは登録ページの発見)を防ぐやり方になります。
1. まずは、念のため bbPress の導入ディレクトリをまるごとバックアップします。
2. 私のテスト環境は Windows なのでDevas と言う検索ソフトで、bbPress の導入ディレクトリを「register.php」というキーワードで検索してみます。
かなりたくさんのファイルに register.php がファイル内にハードコードされています。
テーマファイルやプラグインなどありますが、私の使っているスタンドアロン版の bbPress は、既に開発が止まっていて、アップデートもないので、思い切って変更します。
影響が出るとしたらプラグインを新たに追加する時になるでしょう・・・
3. Devas を使って「user_registration.php」に変更します。
名前は何でも良いと思いますが、SPAMロボットは register で正規表現のマッチングをかけているかもしれないので、できるだけ register という文字列は含まない、原型からは遠い名前が良いでしょう。
ここでは、”regist”では検索されますが、”register” では引っかからないという名前をチョイスしてみました。
恐らく古今東西の、いろいろな掲示板ソフトとの名前の標準の登録フォームのファイル名を検索していると思うので、できるだけ「登録フォーム」ぽくない遠い名前の方が良いでしょう。
「置換文字列」の所に、新しい名前を入れます。
ちょっと怖いですがバックアップを取ってあるので思い切って変更します。
4.user_registeration.php (新しい登録フォーム表示用の PHP ファイル名)を作成します。
私の環境では、自分のテンプレートと、bbPress の導入ディレクトリに 「register.php」がありました。
どちらが使われているのかよくわからなかったので、両方のディレクトリの「register.php」を、「user_registartoin.php」にリネームします。
※ (後述しますが、_ (アンダースコア) は PHP ファイル名に使用しない方が良いかもしれません。
5.実際にユーザー登録をして動作するか確認してみます。
一応、私の環境では、この変更をしても bbPress は問題無く動作しました。
追記:一部上手く動いてませんでした。
原因は、ファイル名に _(アンダースコア)を付けたファイル名を使った場合、bbPress の bb_find_filename という関数が上手く動かなくなるためでした。
この関数は、パスが混じったファイル名を含むストリングから .php ファイル名だけを抜き出すために使われますが、_ がついたファイル名だと、 .php という拡張子を付加して値を返すロジックに入ってしまうため、 user_registration.php だと user_registartion.php.php というファイル名を返していました。
これが原因で、ファイル名を元に動的にスタイルシートを変更するロジックが動かなくなったため、スタイルシートが読み込まれなくなったり、ファイル名に依存してロジックを変更しているプラグインが動かなくなったりしていました。
\bb-includes\functions.bb-core.php にある定義を修正しました。ただし、bbPress のPHPファイル名を眺めてみても、通常 _ (アンダースコア)は使われておらず、作法としてそもそもファイル名に _ を使わない事になっているのかもしれません。
function bb_find_filename( $text ) {
if ( preg_match('|.*?/([a-z\-_]+\.php)/?.*|', $text, $matches) )
/* preg_match は正規表現マッチング。一番はじめが検索パターン。$text=検索対象, $matches=検索結果 */
/* ファイル名が .php を含んでいる場合はここにひっかかる */
/* ([a-z\-]+\.php) を ([a-z\-_]+\.php) に修正した。*/
return $matches[1];
else {
$path = bb_get_option( 'path' );
$text = preg_replace("#^$path#", '', $text);
$text = preg_replace('#/.+$#', '', $text);
return $text . '.php'; // .php が無いので.php を最後に付ける。
}
return false;
}