fraud-detection について
Shopify、WooCommerce、BigCommerce、自社構築ストアでの不正対策設定を扱う、EC 事業者向けのスキルです。多層的なリスク評価、認証、頻度ルール、手動審査を取り上げます。
主な機能
- 01プラットフォーム別の不正対策ツール選定
- 02リスク評価と審査フロー
- 033D Secure の設定案内
- 04頻度チェックとブロックルール
- 05チャージバックと誤検知の監視
活用シーン
- 01高額な疑わしい注文の審査
- 02カードテストと自動購入の抑制
- 03非対面決済のチェックアウト監査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ finsilabs/ awesome-ecommerce-skills --skill fraud-detectionインストール後、Claude Code で/fraud-detectionを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
tile.jsonevals/composite-fraud-scoring-and-3ds-enforcem/criteria.jsontask.mdevals/manual-review-queue-with-authorize-only-/criteria.jsontask.mdevals/redis-velocity-check-thresholds-and-ttl/criteria.jsontask.md詳細
不正検知
概要
決済不正により、チャージバック、商品の紛失、異議申し立て手数料を通じて、EC 事業者の売上の 2~3%が失われています。効果的な不正検知では、プラットフォーム標準のリスクスコアリング、3D セキュア認証、取引頻度チェック、不審な注文を対象とする手動審査キューを組み合わせます。適切な方法は利用するプラットフォームによって異なります。Shopify には不正分析ツールが組み込まれていますが、WooCommerce と BigCommerce では、専用の不正防止サービスまたは決済代行業者の不正対策ツールが必要です。
このスキルを使う場面
- チャージバック率が取引量の 0.5%を超えた場合(Visa が「過剰」とみなす異議申し立てのしきい値は 0.9%です)
- 不正の傾向が把握できていない新しい市場で販売を開始する場合
- 高額で転売しやすい商品(電子機器、ギフトカード、高級品)を販売する場合
- アカウント乗っ取り、カードテスティング、またはボットによる大量購入の傾向が見られる場合
- カード非対面取引を処理するチェックアウトフローを構築または監査する場合
基本手順
ステップ 1:事業者のプラットフォームを特定し、適切な不正対策ツールを選ぶ
| プラットフォーム | 標準の不正分析機能 | 推奨される不正対策サービス |
|---|---|---|
| Shopify | Shopify Fraud Analysis(無料で利用可能)。注文の基本的なリスクスコアリング | 高度な ML スコアリングには、Stripe Radar または Signifyd(Shopify App Store)を有効にします |
| WooCommerce | 標準機能なし | 決済代行業者として Stripe(Radar 付き)または Braintree を利用するか、Kount または NoFraud のプラグインをインストールします |
| BigCommerce | 決済代行業者の不正対策ツール(代行業者によって異なります) | Signifyd は BigCommerce とネイティブに連携します。NoFraud も BigCommerce に対応しています |
| すべてのプラットフォーム | — | Stripe Radar(Stripe を利用している場合)は、追加料金なしですべての請求に ML ベースの不正スコアリングを提供します |
ステップ 2:プラットフォーム標準の不正対策ツールを有効にして設定する
Shopify
Shopify には、IP アドレスと請求先住所の不一致、カード認証の失敗、既知の不正パターンなどのシグナルに基づいて、すべての注文に不正分析インジケーターが表示されます。
不正インジケーターの確認:
- Shopify 管理画面で任意の注文を開きます
- 注文詳細パネルで不正分析をクリックします
- Shopify は、具体的な理由(例:「カード認証値の確認に失敗しました」「IP アドレスと請求先住所の国が異なります」)とともにリスクレベル(高/中/低)を表示します
不正対応ルールの設定:
- 設定 → 決済 → 不正防止に移動します(Shopify Payments を利用している場合)
- 高リスクと判定された注文に対して自動審査を有効にします。Shopify が注文を保留し、メールで通知します
- Shopify が最も高リスクと判定した注文に対して自動キャンセルを設定します
Signifyd(Shopify App Store — 不正利用保証): Signifyd はチャージバック保証を提供します。Signifyd が承認した注文でチャージバックが発生した場合、損失が補償されます。これは Shopify 向けの最も包括的なソリューションです。
- Shopify App Store からSignifydをインストールします
- Signifyd が ML スコアリングを用いてすべての注文を自動審査します
- Signifyd がフラグを付けた注文は、Signifyd コンソールの審査キューに入ります
- Signifyd の Shopify 連携を設定し、高リスクの注文を自動的に保留またはキャンセルします
WooCommerce
WooCommerceには不正利用検知機能が含まれていません。不正利用対策ツールを内蔵した決済処理サービスを利用するか、専用プラグインが必要です。
オプションA:Stripe Radar(WooCommerceでStripeを利用している場合に推奨)
WooCommerce Stripe Payment Gatewayを利用している場合:
- Stripe Radarは自動的に有効になります。Stripeアカウントのすべての請求にスコアを付けます
- Stripeダッシュボードで、Radar → Rulesに移動して、カスタムのブロック/審査ルールを追加します:
# Block orders over $500 from high-fraud-rate IP countries Block if :order_amount: > 50000 and :ip_country: in ('NG', 'RO') # Review first-time customers placing large orders Review if :order_amount: > 20000 and :customer_account_age: < 7 # Block cards used more than 3 times in the last hour Block if :card_velocity_hour: > 3 - 審査対象としてフラグが付けられた注文は、Stripeダッシュボード → Radar → Reviewsに表示されます
オプションB:WooCommerce Anti-Fraudプラグイン(無料)
- プラグインディレクトリからWooCommerce Anti-Fraudをインストールします
- 以下に基づいてリスクスコアリングルールを設定します:
- 注文金額のしきい値
- 新規顧客と高額注文の組み合わせ
- プロキシ/VPNのIPアドレス検知
- 請求先と配送先の国の不一致
- リスクの高い注文は、手動審査のため「保留」ステータスになります
オプションC:KountまたはNoFraud(エンタープライズ向け) 取引量の多いWooCommerceストア向けに、エンタープライズ向けの不正利用防止プラットフォームは以下を提供します:
- Kount:MLスコアリング、手動審査ツール、チャージバック管理を備えた包括的な不正利用管理プラットフォーム
- NoFraud:Signifydと同様の不正利用補償を提供し、WooCommerceプラグインを通じて連携します
BigCommerce
BigCommerce向けSignifyd:
- BigCommerce App MarketplaceからSignifydアプリをインストールします
- リスクの高い注文を自動的に保留またはキャンセルするよう設定します
- Signifydの保証により、承認された注文のチャージバックが補償されます
決済処理サービスの不正利用対策ツール:
- Stripe(BigCommerce Stripe連携経由):Radarが含まれています。Stripeダッシュボードでルールを設定します
- PayPal:PayPalの不正利用管理フィルターは、PayPalビジネスアカウントの設定で利用できます
- Braintree:Kountによる高度な不正利用対策をアドオンとして利用できます
カスタム/ヘッドレス
Stripeを利用するカスタムストアフロントでは、MLスコアリングにStripe Radarを活用し、ビジネス固有のパターンに対応するアプリケーション層の頻度チェックを追加します。
決済試行後にStripeの不正利用スコアを取得する:
const paymentIntent = await stripe.paymentIntents.retrieve(paymentIntentId, {
expand: ['latest_charge'],
});
const riskScore = paymentIntent.latest_charge.outcome?.risk_score; // 0–100
const riskLevel = paymentIntent.latest_charge.outcome?.risk_level; // 'normal', 'elevated', 'highest'
リスクの高い取引で3D Secureを要求する(チャージバック責任をカード発行会社に移します):
const paymentIntent = await stripe.paymentIntents.create({
amount: order.totalCents,
currency: 'usd',
payment_method_options: {
card: {
// 'automatic' = Stripe decides; 'challenge' = always require 3DS for high-risk
request_three_d_secure: riskScore > 70 ? 'challenge' : 'automatic',
},
},
});
アプリケーション層の頻度チェック:
import Redis from 'ioredis';
const redis = new Redis(process.env.REDIS_URL!);
async function checkVelocity(params: { email: string; ip: string; cardFingerprint: string; amountCents: number }) {
const { email, ip, cardFingerprint, amountCents } = params;
// IP: max 10 orders per hour
const ipCount = await redis.incr(`vel:ip:${ip}`);
if (ipCount === 1) await redis.expire(`vel:ip:${ip}`, 3600);
if (ipCount > 10) return { allowed: false, reason: 'ip_velocity' };
// Email: max 5 orders per 24 hours
const emailCount = await redis.incr(`vel:email:${email.toLowerCase()}`);
if (emailCount === 1) await redis.expire(`vel:email:${email.toLowerCase()}`, 86400);
if (emailCount > 5) return { allowed: false, reason: 'email_velocity' };
// Card: max $500 per day
const spendKey = `vel:spend:${cardFingerprint}`;
const currentSpend = parseInt(await redis.get(spendKey) ?? '0');
if (currentSpend + amountCents > 50000) return { allowed: false, reason: 'daily_spend_limit' };
return { allowed: true };
}
手動審査キュー:
async function flagForManualReview(orderId: string, riskScore: number, signals: Record<string, unknown>) {
// Hold the order — do NOT fulfill; do NOT capture payment (authorize only)
await db.orders.update(orderId, {
status: 'pending_fraud_review',
fraud_risk_score: riskScore,
fraud_signals: signals,
review_requested_at: new Date(),
});
// Notify fraud review team
await sendSlackAlert('#fraud-review', {
text: `Order ${orderId} flagged for review. Risk score: ${riskScore}/100`,
actions: [
{ text: 'Approve', url: `${ADMIN_URL}/fraud-review/${orderId}/approve` },
{ text: Reject', url: `${ADMIN_URL}/fraud-review/${orderId}/reject` },
],
});
}
// Auto-cancel unreviewed orders after 48 hours
async function expireUnreviewedOrders() {
const expired = await db.orders.findExpiredReviews(48);
for (const order of expired) {
await stripe.paymentIntents.cancel(order.payment_intent_id);
await db.orders.update(order.id, { status: 'fraud_review_expired' });
await sendOrderCancellationEmail(order);
}
}
ベストプラクティス
- 複数の防御策を重ねる — 単一のシグナルだけですべての不正利用を確実に防ぐことはできません。Stripe Radar、頻度チェック、IPレピュテーション、デバイスフィンガープリンティングを組み合わせます
- リスクの高い注文にはオーソリ後に売上を確定する方式を使う — チェックアウト時にオーソリを取得して資金を確保し、不正利用の審査に通過した後にのみ売上を確定します。オーソリの取り消しは、返金よりもコストを抑えられます
- 誤検知率をKPIとして追跡する — 正当な注文の1%を超えてブロックまたは保留している場合、ルールが厳しすぎます。不正利用による損失と、誤検知による売上損失の両方を測定します
- 不正利用ルールを定期的に変更し、難読化する — 高度な不正利用者は、ルールのしきい値を探るためにチェックアウトの流れを調査します。APIエラーメッセージでブロック理由を明かさないでください
- 不正なメールアドレス、カード、デバイスの拒否リストを管理する — チャージバックによって不正利用が確認されたら、その識別情報をブロックリストに追加し、今後の注文を防ぎます
- チャージバック率を毎月確認する — Visa/Mastercardで0.5%を超えた場合は、不正利用ルールを見直します。0.9%を超えると、Visaの異議申し立て監視プログラムの対象になります
よくある問題
| 問題 | 解決策 |
|---|---|
| 3DS によってチェックアウトが放棄される | 3DS モードに automatic を使用します。Stripe がチャレンジが必要なタイミングを判断し、リスクの低い取引をスムーズに認証します |
| ベロシティルールによって正当な大量購入者がブロックされる | B2B 顧客または顧客セグメントの LTV が高い顧客をベロシティルールの対象外にします。アカウント履歴に基づく段階的な上限を使用します |
| 手動審査キューが際限なく増加する | SLA の目標(4 時間の審査期間)を設定し、48 時間以内に審査されなかった注文を自動キャンセルする仕組みを導入します |
| 3DS 認証済みでもチャージバックが申請される | 決済処理業者が 3DS 認証データ(eci、cavv、xid)を正しく送信していることを確認します。これらのフィールドがないと、責任の移転は適用されません |
| Redis のベロシティキーが期限切れにならない | 新しいキーを設定するときは、必ず EXPIRE を呼び出します。有効期限付きのアトミックな「存在しない場合にのみ設定」には SET key value EX seconds NX を使用します |
関連するスキル
- @secure-checkout
- @account-security
- @stripe-integration
- @bot-protection
- @gdpr-ecommerce