bot-protection について
スクレイピング、買い占め、認証情報の詰め込み攻撃への対策を計画するコマースチーム向けのスキルです。WAF ルールや CAPTCHA、レート制限、商品発売時の待機室など、多層防御を扱います。
主な機能
- 01プラットフォーム別の対策ガイド
- 02WAF とボットルールの設定
- 03高リスクフォームへの CAPTCHA
- 04レート制限と購入数制限
- 05商品発売時の待機室
活用シーン
- 01価格や在庫情報のスクレイピング抑制
- 02限定商品の発売を買い占めボットから保護
- 03ログインへの認証情報詰め込み攻撃を緩和
- 04不審なチェックアウトや API 通信の制御
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill bot-protectionインストール後、Claude Code で/bot-protectionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/edge-rate-limiting-middleware/criteria.jsontask.mdevals/honeypot-and-turnstile-captcha/criteria.jsontask.mdevals/scalper-detection-and-fair-queuing/criteria.jsontask.md詳細
ボット対策
概要
コマースストアは、競合他社のために価格や在庫データを収集するスクレイパー、在庫限定の商品を即座に購入する転売ボット、盗まれたユーザー名とパスワードを試すクレデンシャルスタッフィングボットという、3つの大きな脅威にさらされています。効果的なボット対策には、プラットフォームレベルの防御、WAF(Web Application Firewall)、リスクの高い操作に対する CAPTCHA、任意の行動分析を組み合わせます。ほとんどのマーチャントにとって、最も効果的で導入の負担が少ない保護を提供するのは Cloudflare です。プラットフォームを問わず、ストアの前段に配置できます。
このスキルを使用する場面
- 転売の標的になりやすい限定商品(スニーカー、コンサートチケット、ゲーム機)の販売を開始するとき
- 競合他社が商品の価格や在庫レベルを組織的にスクレイピングしているとき
- アカウントのログインページで、分散した IP からの失敗率が高いなど、クレデンシャルスタッフィングの兆候が見られるとき
- チェックアウトファネルの分析で、不自然に完了時間が短い(チェックアウトが5秒未満)ことが分かったとき
- カタログ API リソースを消費するボットトラフィックによってインフラが圧迫されているとき
基本手順
ステップ1:マーチャントのプラットフォームを確認し、適切なツールを選ぶ
| プラットフォーム | 組み込みのボット対策 | 推奨する追加レイヤー |
|---|---|---|
| Shopify | Shopify には基本的なボット検出機能とレート制限が含まれています | WAF ルールとボット管理を利用するため、Shopify ストアの前段で Cloudflare(無料プラン)を有効にします |
| WooCommerce | 組み込み機能はありません。ログインフォームとチェックアウトフォームが完全に公開されています | ログイン保護には Wordfence(無料)、WAF とレート制限には Cloudflare を使用します |
| BigCommerce | 基本的な DDoS 対策が含まれています | 高度なボット管理には Cloudflare を使用します。BigCommerce は CAPTCHA 用のカスタムスクリプトに対応しています |
| トラフィックの多いドロップ(プラットフォームを問わない) | ありません | Cloudflare Waiting Room(Business/Enterprise)または Queue-it で管理キューを利用します |
| カスタム/ヘッドレス | 独自に構築する必要があります | Cloudflare と、カスタムのレート制限、行動分析を組み合わせます |
ステップ2:基本的なボット対策を設定する
ステップ2a:Cloudflare を有効にする(すべてのプラットフォームで利用可能)
Cloudflare の無料プランは、アプリケーションコードに手を加えることなく、DNS レベルで強力なボット対策を提供します。
- cloudflare.com でドメインを Cloudflare に追加します(ほとんどのストアでは無料プランで十分です)
- ドメインのネームサーバーを、Cloudflare から指定されたネームサーバーに変更します
- Cloudflare ダッシュボードで次の設定を行います。
- SSL/TLS → Overview:「Full (Strict)」に設定します
- Security → WAF → Managed rules:「Cloudflare Managed Ruleset」(無料)と「OWASP Core Ruleset」を有効にします
- Security → Bots → Bot Fight Mode:有効にします(無料)。既知のボットのユーザーエージェントをブロックします
- 追加の保護として、カスタムの WAF Rules を作成します(Security → WAF → Custom Rules)。
# Block requests with no User-Agent header (not http.user_agent contains " " and not cf.client.bot) # Rate limit catalog API scraping # Under Security → WAF → Rate Limiting Rules: # Path: /products/* or /api/products/* # Rate: 100 requests per minute per IP # Action: Block for 1 hour
Cloudflare Bot Management(Business プラン、約200ドル/月): 深刻な転売やスクレイピングの問題を抱えるストア向けに、Cloudflare Bot Management は機械学習を使ってすべてのリクエストをスコアリングし、正規の購入者に影響を与えずに、不審なトラフィックにチャレンジを表示したりブロックしたりします。
ステップ 2b:リスクの高いフォームに CAPTCHA を追加する
ログインフォームとチェックアウトフォームには、Cloudflare Turnstile(無料で、プライバシーを保護し、まずは表示しない方式)を使用します。Turnstile は、目に見えるチャレンジを表示する前に受動的なシグナルを利用します。ほとんどの正規ユーザーには CAPTCHA が表示されません。
Shopify ストアに Turnstile を追加する方法:
- cloudflare.com/products/turnstile で Cloudflare Turnstile に無料登録します
- 新しいサイトを作成し、「Managed」モードを選択して、サイトキーとシークレットキーを控えます
- Shopify でテーマをカスタマイズし、ログインフォームとチェックアウトフォームに Turnstile ウィジェットを追加します:
- Shopify テーマアプリ拡張機能を使用するか、テーマを直接編集します
- ログインフォームに
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>と<div class="cf-turnstile" data-sitekey="YOUR_SITE_KEY">を追加します
- カスタムアプリでサーバー側のトークンを検証するか、Shopify Function を使用します
WooCommerce に Turnstile を追加する方法:
- Cloudflare Turnstile WordPress プラグインをインストールします(プラグインディレクトリで「Cloudflare Turnstile」を検索します)
- サイトキーとシークレットキーを入力します
- 保護するフォームを設定します:ログイン、登録、チェックアウト、コメントフォーム
サーバー側でのトークン検証:
async function verifyTurnstile(token: string, ip: string): Promise<boolean> {
const res = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
method: 'POST',
body: new URLSearchParams({
secret: process.env.TURNSTILE_SECRET_KEY!,
response: token,
remoteip: ip,
}),
});
const data = await res.json();
return data.success === true;
}
ステップ 2c:商品発売(需要の高いローンチ)に待合室を設定する
在庫が限られる発売で、アクセスの急増や転売目的の購入者が予想される場合:
Cloudflare Waiting Room(Business/Enterprise プラン):
- Cloudflare ダッシュボードで、Traffic → Waiting Room に移動します
- Create をクリックします
- 次の項目を設定します:
- Hostname:ストアのドメイン
- Path:商品 URL のパターン(例:
/products/limited-*または/collections/drop) - Total active users:通過を許可する同時接続ユーザーの最大数(例:500)
- New users per minute:ユーザーの受け入れ速度(例:毎分 100 人)
- ブランドに合わせて待合室のページをカスタマイズします
- Cloudflare は超過したアクセスを公平にキューイングします。キューに入る前に、Cloudflare のボット検出によってボットのトラフィックがフィルタリングされます
ステップ 2d:プラットフォーム固有の保護
Shopify — 顧客ごとの購入制限: Shopify には、在庫が限られる商品の顧客ごとの購入制限をネイティブに適用する機能はありません。選択肢:
- Shopify アプリの Locksmith や Order Limits by MLveda などを使用して、顧客ごとの購入数量を制限します
- Shopify Plus では、Shopify Functions を使用してチェックアウト時に制限を適用します
WooCommerce — ログインの総当たり攻撃対策:
- Wordfence Security(無料)をインストールします
- Wordfence → Login Security で総当たり攻撃対策を有効にします
- 管理者アカウントで二要素認証を有効にします
WooCommerce — チェックアウト時の CAPTCHA:
- Google Recaptcha for WooCommerce(無料)または Cloudflare Turnstile プラグインをインストールします
- 保護するフォームを設定します:ログイン、登録、チェックアウト、パスワード再設定
カスタム/ヘッドレス — アプリケーション層のレート制限
カスタムのストアフロントでは、ミドルウェア層またはエッジ層にレート制限を追加します:
// Next.js Edge Middleware — rate limiting per IP per route
import { NextRequest, NextResponse } from 'next/server';
import { Ratelimit } from '@upstash/ratelimit';
import { Redis } from '@upstash/redis';
const redis = Redis.fromEnv();
const limiters = {
checkout: new Ratelimit({ redis, limiter: Ratelimit.slidingWindow(10, '1 m'), prefix: 'rl_checkout' }),
catalog: new Ratelimit({ redis, limiter: Ratelimit.slidingWindow(100, '1 m'), prefix: 'rl_catalog' }),
};
export async function middleware(request: NextRequest) {
const ip = request.ip ?? request.headers.get('x-forwarded-for') ?? '127.0.0.1';
const pathname = request.nextUrl.pathname;
const limiter = pathname.startsWith('/checkout') ? limiters.checkout
: pathname.startsWith('/products') ? limiters.catalog
: null;
if (limiter) {
const { success } = await limiter.limit(ip);
if (!success) return new NextResponse('Too Many Requests', { status: 429 });
}
return NextResponse.next();
}
顧客ごとの購入制限(カスタム):
async function enforcePurchaseLimit(customerId: string, productId: string, limit = 1) {
const count = await db.orders.countByCustomerAndProduct(customerId, productId);
if (count >= limit) throw new Error(`Purchase limit of ${limit} per customer reached`);
// Atomic lock to prevent race conditions at high concurrency
const lockKey = `purchase_lock:${customerId}:${productId}`;
const acquired = await redis.set(lockKey, '1', 'EX', 30, 'NX');
if (!acquired) throw new Error('Purchase already in progress');
}
ベストプラクティス
- 防御を多層化する — 単一の手法ですべてのボットを阻止することはできません。Cloudflare WAF、Turnstile CAPTCHA、アプリケーションレベルのレート制限を組み合わせてください
- まずは非表示の CAPTCHA を使う — Cloudflare Turnstile と hCaptcha のパッシブモードは、不審なリクエストにのみチャレンジを表示します。すべての購入手続きで表示される CAPTCHA はコンバージョンを低下させます
- IP アドレスだけでなく、セッションのフィンガープリントを取得する — ボットはレジデンシャルプロキシ経由で IP アドレスを切り替えます。IP ベースのルールに、行動シグナルやセッション特性を加えてください
- データベースレベルで商品ごとの購入数上限を適用する — クライアント側の制限は簡単に回避されます。サーバー側のチェックまたはデータベース制約で適用してください
- ボットと人間の比率を監視する — Cloudflare Analytics または Datadog のダッシュボードを設定し、ブロックされたリクエスト数と総リクエスト数の比率を追跡してください。急増は新たなボットキャンペーンの兆候です
- 需要の高い商品の販売開始を事前告知し、ウェイティングリストを用意する — 事前にメールアドレスを収集しておけば、ウェイティングリストの登録者に優先アクセスを提供できるため、キューがより公平になり、販売開始時の需要も抑えられます
よくある落とし穴
| 問題 | 解決策 |
|---|---|
| フラッシュセールの正当なトラフィックがレート制限でブロックされる | 購入履歴のある認証済み顧客にはより高いレート制限を設定し、未認証のリクエストにのみ厳しい制限を適用します |
| Turnstile CAPTCHA によって購入手続きが機能しなくなる | セットアップ中は Turnstile を「常に通過」モードでテストし、本番環境で有効にする前にサーバー側の検証エンドポイントが動作していることを確認します |
| 商品の販売開始時にウェイティングルームが有効にならない | 販売開始の 24 時間前に Cloudflare Waiting Room を設定し、ステージング URL でテストします。パスパターンが商品 URL と一致していることを確認します |
| 複数アカウントによる購入数上限の回避 | 需要の高い商品の購入には電話番号認証を必須にします。購入数の上限はアカウントだけでなく、認証済みの電話番号または本人確認情報に紐づけます |
| Wordfence が正当な WooCommerce の顧客をブロックする | Wordfence のブロック済み IP ログを確認し、正当な顧客を許可リストに追加して、感度設定を調整します |
関連スキル
- @fraud-detection
- @account-security
- @secure-checkout
- @flash-sale-engine
- @monitoring-alerting-commerce