Xoops2.1.6でのお話。
外国のIPをすべてシャットアウトするというのも整合性がない
外国からのユーザー登録スパムが凄まじく、一日に20件程度のよくわからないユーザーが登録されはじめた。
コメントスパムも心配だったのだが、ユーザー登録スパムもなかなか勢いがいいらしいことを知らなかった。
たいしたサイトでもないのに、「グローバルなサイトとして認められたのかなあ」などと悠長なことを考えていたらあっという間に200もの出所のわからないユーザーだらけになってしまった。
最初はIPで拒否しようと思っていたが、敵もさることながらさまざまなIPから登録を試みてくる。
外国のIPをシャットアウトする方法も考えたが、日本語で作られているからといって、外国のIPをすべてシャットアウトするというのも整合性がない。
日本語入力の判定をする
これらスパム(ボットでも人間でも)を拒否する簡単な方法作ってみた。
主に操作必須なのは以下の二つのファイルで、そのほかは環境に合わせて調整してみてほしい。
仕組みとしては、日本語入力の判定をする、だけのこと。
日本語を理解して日本語のエラーに対応できれば、どこにいようと、国籍がちがかろうととりあえずスパムとはしない、というだけのものです。
※_MD_USER_LANG…という記述が出てきますが、どっかの「language」フォルダの中で探すとmain.phpの中に見つかると思います。がんばってさがしてください。
/modules/user/forms/UserRegisterEditForm.class.php
<?php
function prepare()
{
parent::prepare();
//
// Set form properties
//
~~
//例として「user_interest」を使っています。
$this->mFormProperties['user_interest'] =& new XCube_StringProperty('user_interest');
~~
//
// Set field properties
//
~~
$this->mFieldProperties['user_interest'] =& new XCube_FieldProperty($this);
//↓入力必須、日本語のみ、二つの条件判定を設置
$this->mFieldProperties['user_interest']->setDependsByArray(array('required', 'japanese'));
//↓入力必須 こちらはXoopsのデフォルト
$this->mFieldProperties['user_interest']->addMessage('required', _MD_USER_ERROR_REQUIRED, _MD_USER_LANG_USER_INTREST);
//↓日本語のみ の条件ファンクションを読み込み
$this->mFieldProperties['user_interest']->addMessage('japanese', _MD_USER_LANG_USER_INTREST_JAP, _MD_USER_LANG_USER_INTREST);
$this->mFieldProperties['user_interest']->addVar('japanese', 0);
~~
}
?>
/core/XCube_Validator.class.php
<?php
~~
~~
以下を追加
class XCube_JapaneseValidator extends XCube_Validator
{
function isValid(&$form, $vars)
{
if ($form->isNull()) {
return true;
}
else {
$jap_string = $form->toString();
//↓日本語かどうかの判定(実際はマルチバイトが含まれているかどうかだけ)
if(strlen($jap_string) == mb_strlen($jap_string)) {
return false;
}else{
return true;
}
}
}
}
?>