要望や症状
不正なbot等によって、大量の会員登録リクエストが送信されるケースがあります。これらの不正登録では基本的に入力内容が毎回異なっているため、単純な重複チェックでは対応が困難となっています。
理由や原因
EC-CUBE標準の会員登録フォームには、自動化されたスパム攻撃を防ぐ仕組みが組み込まれていないため、ボットによる大量の自動登録が可能な状態となっています。
解決策
インフラレベルでの対策
WAFによるブロック設定
使用しているレンタルサーバーのWAF(Web Application Firewall)機能を有効化し、不審なアクセスパターンを自動的にブロックします。多くのレンタルサーバーでは管理画面から簡単に設定可能です。
IPアドレスによるアクセス制限
特定のIPアドレスからの大量アクセスを検出した場合、サーバー設定でアクセスを制限します。
# .htaccess での IP ブロック例
<RequireAll>
Require all granted
Require not ip 192.168.1.100
Require not ip 10.0.0.0/8
</RequireAll>
システムレベルでの対策
reCAPTCHA導入によるBot対策
GoogleのreCAPTCHA v3を会員登録フォームに実装し、Bot判定を行います。
EC-CUBE オーナーズストアでは以下のプラグインが提供されています。
- いつも reCAPTCHA [4.0系/4.1系]プラグイン
- reCAPTCHAプラグイン(会員登録・会員情報編集・お問い合わせ・注文手続き)プラグイン
同一情報による重複登録の制限
不正な会員登録の内容を分析し、合致する条件でリクエストを拒否します。
例えば、以下のような条件で判定できます:
- 名前や住所、会社名や誕生日が同じ
- メールアドレスのドメインが同じ一般的でないものが使用されている
- 短時間での連続登録
CustomizeディレクトリでEventSubscriberを作成することで、カスタムロジックによる制限が可能です。
ファイル配置先: app/Customize/EventSubscriber/CustomerRegistrationSubscriber.php
<?php
namespace Customize\EventSubscriber;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
class CustomerRegistrationSubscriber implements EventSubscriberInterface
{
/**
* 購読するイベントを定義
*/
public static function getSubscribedEvents()
{
return [
EccubeEvents::FRONT_ENTRY_INDEX_COMPLETE => 'onCustomerRegistration',
];
}
/**
* 会員登録時の制限処理
*/
public function onCustomerRegistration(EventArgs $event)
{
$Customer = $event->getArgument('Customer');
$email = $Customer->getEmail();
// ブロック対象ドメインリスト
$blockedDomains = [
'example.com',
'spam-domain.com',
'temporary-mail.com',
// 必要に応じてドメインを追加
];
// メールアドレスからドメインを抽出
$emailDomain = substr(strrchr($email, '@'), 1);
// ブロック対象ドメインをチェック
if (in_array($emailDomain, $blockedDomains, true)) {
throw new BadRequestHttpException('このメールアドレスのドメインは使用できません。');
}
// 短時間での連続登録チェック(セッションベース)
$session = $event->getRequest()->getSession();
$lastRegistration = $session->get('last_registration_time');
$currentTime = time();
if ($lastRegistration && ($currentTime - $lastRegistration) < 60) {
throw new BadRequestHttpException('短時間での連続登録は制限されています。しばらく時間を置いてから再度お試しください。');
}
// 登録時刻を記録
$session->set('last_registration_time', $currentTime);
}
}
EventSubscriberの追加設定
上記ファイルを作成後、以下のコマンドでキャッシュをクリアしてください。
php bin/console cache:clear --no-warmup
注意事項
- IPアドレスブロック:正当なユーザーもブロックする可能性があるため、慎重に設定してください
- reCAPTCHA導入:ユーザビリティの低下に注意し、v3(非表示型)の使用を推奨します
- カスタマイズ実装:必ず動作テストを行い、正常な会員登録が阻害されないことを確認してください
- ドメイン制限:正当なユーザーが使用している可能性のあるドメインは慎重に判断してブロックリストに追加してください