登録スパムを防ぐ

移行前のXOOPS2時代から、登録スパム(サイトやビジネスの宣伝だけを目的にしたユーザー登録)が継続的にあります。例によってソースコードに手を入れることなく CAPTCHA をかませる方法を考えました。

CAPTCHA機能は、xupdateからもインストール可能なCaptchaモジュールを使わせていただきます。通常はユーザー登録画面にCAPTCHAフィールドを埋め込むのですが、ファイルの追加だけでなんとかするために次のような方法を考えました。

  1. /register.php へのアクセスの際、CAPTCHAチェック済かどうかを判定
  2. チェック済でなければCAPTCHA画面を表示してチェック処理
  3. チェック済なら/register.phpを表示

以下順番に。

1. /register.php へのアクセスの際、CAPTCHAチェック済かどうかを判定

/register.phpが呼んでいるデリゲート'Legacypage.Register.Access'に、CAPTCHAによる認証が済んでいるかどうかをチェックする関数を追加します。具体的には「Canonical URLを設定する」で作成したArchitSitePreloadクラスに以下を加えます。


    
function preFilter(){
        
$this->mRoot->mDelegateManager->add('Legacypage.Register.Access', array(&$this'checkHumanAccess'), XCUBE_DELEGATE_PRIORITY_FIRST);
    }

    function 
checkHumanAccess(){
        if( !isset(
$_SESSION['isHumanAccess']) || true != $_SESSION['isHumanAccess'] ) {
            
header('Location: '.XOOPS_URL.'/modules/kdadmin/ruhuman.php?xoops_redirect=/register.php');
    }

'Legacypage.Register.Access'の本処理が呼び出される前にCAPTCHAチェックを行い、済んでいなければチェックページにリダイレクトしてしまいたいので、プライオリティを上げてみました。後述するチェックページでは、CAPTCHA認証がOKであればisHumanAccessというセッション変数にtrueをセットします。

2. チェック済でなければCAPTCHA画面を表示してチェック処理

上で'/modules/kdadmin/ruhuman.php?xoops_redirect=/register.php'として呼び出しているソースです。モジュールディレクトリに入れている意味は特にありません。管理用のスクリプトをまとめてこのモジュールディレクトリの下に置いておこうと思いまして。

<?php
require_once '../../mainfile.php';

$root =& XCube_Root::getSingleton();

// Can be removed
$root->mController->executeHeader();

// 直接呼ばれることはない
if( !$redirectTo $root->mContext->mRequest->getRequest('xoops_redirect') ) {
    die(
'Illegal call.');
}

// $captcha_api is defined here
include_once XOOPS_ROOT_PATH.'/modules/captcha/include/api.php';

if ( isset(
$_POST['submit']) ) {
    
// Human access
    
if ( $captcha_api->validate_post() ) {
        
// Checked in /preload/ArchitSitePreload.class.php
        
$_SESSION['isHumanAccess'] = true;
        
redirect_header($redirectTo);
        exit();
    }
}

include_once 
XOOPS_ROOT_PATH."/class/xoopsformloader.php";
$form = new XoopsThemeForm'あなたが人間であることの確認'"captcha_form"$_SERVER['REQUEST_URI']);
$form->addElement$captcha_api->make_xoops_form_label() );
$form->addElement(new XoopsFormButton('''submit'_SUBMIT'submit'));
$form->display();

$root->mController->executeView();
?>

3. チェック済なら/register.phpを表示

処理は1に戻ります。今度は$_SESSION['isHumanAccess']にtrueがセットされているので、'Legacypage.Register.Access'の本処理が呼び出されます。

フォーラムやコメント欄への投稿チェックも、ruhuman.phpを割り込ませることができれば、ruhuman.php自身を変更せずともできるはず。


友達に伝える
作成: 2013/10/14 by:koji
更新: 2013/10/15 by:koji


htmlヘッダを書き換える

Tech

テキスト解析WebAPI(Yahoo!)を使ったタグ付け・執筆支援

新規ユーザー登録(無料)

  • メールニュース[週刊起-動線]の購読
  • コメントなどの投稿
  • ココロミの利用
  • 一部コンテンツの購読

ログイン

コメント

タグ(キーワード)