こんにちは、ソーイ株式会社の高崎です。
弊社では、会員制Webシステムの決済機能にStripeを利用しています。
不正決済対策としてStripe Radarの導入を検討し、カードテスティング対策としてレート制限のルールを設定しました。
結論として、以下のRadarルールを設定することで短時間の決済試行をブロックできました。
Block if :total_charges_per_card_number_hourly: >= 5
本記事では、Stripe Radarを利用して決済レート制限を実装した方法を紹介します。
また、本記事は、Stripe決済の基本的な実装が完了している開発者を対象としています。
目次
- はじめに
- Stripe Radarとは
- レート制限が必要な理由
- 実際に設定したRadarルール
- Radarルールの設定方法
- 実際に設定したルール
- ブロックルールのテスト
- Radarアシスタントについて
- まとめ
はじめに
クレジットカード決済を提供するサービスでは、カードテスティングのように短時間で大量の決済試行が行われる不正行為への対策が重要です。
本記事では、Stripe Radar のカスタムルールを利用して、同一カードによる短時間の決済試行を制限した方法を紹介します。
Stripe Radarとは
Stripe Radar は、Stripe が提供している不正決済対策機能です。
機械学習とルールベースの判定を組み合わせることで、不審なクレジットカード決済を検知・防止することができます。
Stripe Radar では、Stripe が持つ膨大な決済データをもとに、不正利用の可能性がある決済を自動的に分析し、リスクの高い決済をブロックしたりレビュー対象にすることが可能です。
また、Radar では カスタムルールを設定でき、特定の条件に一致する決済をブロックしたり追加の確認を求めたりすることができます。
例えば、以下のような条件でルールを設定できます。
- 特定の IP アドレスからの決済をブロック
- 同一カードによる短時間での複数決済を制限
- 特定の国からの決済をブロック
- 不審なリスクスコアの決済をブロック
このように、Stripe Radar を利用することで、アプリケーション側で複雑な不正検知ロジックを実装することなく、Stripe の管理画面から柔軟に不正利用対策を行うことができます。
レート制限が必要な理由
クレジットカード決済を提供するサービスでは、カード情報を不正に利用する攻撃が発生する可能性があります。
代表的なものとして、カードテスティングやクレジットマスター攻撃があります。
カードテスティングとは、攻撃者が入手した大量のクレジットカード情報を利用し、少額決済などを繰り返すことで有効なカードかどうかを確認する行為です。
この攻撃では、短時間に大量の決済リクエストが送信されることが特徴です。
(参考:https://docs.stripe.com/disputes/prevention/card-testing?locale=ja-JP)
一方、クレジットマスター攻撃は、クレジットカード番号の規則性を利用し、カード番号を自動生成して決済を試行する攻撃です。
有効なカード番号が見つかるまで、プログラムによって大量の決済リクエストが送信されます。
(参考:https://stripe.com/jp/resources/more/credit-master-attack-japan)
これらの攻撃はいずれも、短時間に大量の決済試行が行われるという共通点があります。
そのため、一定時間内の決済試行回数を制限するレート制限を導入することで、不正利用のリスクを低減することが可能です。
Stripe Radar のカスタムルールを利用することで、決済試行回数に対する制限を設定することができます。
本記事では、この機能を利用してレート制限を設定した方法について紹介します。
実際に設定したRadarルール
ここでは、Stripe Radar のカスタムルールを利用して、クレジットカード決済のレート制限を設定した方法について紹介します。
※注意
本記事で紹介しているカスタムRadarルールの作成機能は「Radar for Fraud Teams」プランが必要になる場合があります。
導入前に利用プランを確認することをおすすめします。
Radarルールの設定方法
Stripe Radar のカスタムルールは、Stripe のダッシュボードから設定することができます。
設定手順は以下の通りです。
※画像はテスト環境の画面になります。
ルールでは、IPアドレス・カード情報・決済回数など様々な条件を組み合わせて、ブロックやレビューの設定を行うことができます。
実際に設定したRadarルール
今回のレート制限では、短時間に多数の決済が試行されることを防ぐため、以下のようなルールを設定しました。
Block if :total_charges_per_card_number_hourly: >= 5
このルールでは、同一カードから1時間以内に5回以上決済が試行された場合、その決済をブロックします。
今回の実装では、IPアドレスではなくカード番号ベースの制限を採用しました。
カードテスティングではIPアドレスを分散させるケースがあるため、IP単位の制限では検知できない可能性があります。
そのため、同一カードの短時間決済を検知できるカード番号ベースのルールを採用しました。
また、1時間以内に5回以上の決済試行をブロックする設定にしました。
通常の利用では、同一カードで短時間に複数回決済を行うケースは少ないため、
誤検知を避けつつカードテスティングを検知できる閾値として5回を採用しました。
また、そのほか検討したルールとして、次のものがありました。
Block if :total_charges_per_ip_address_hourly: >= 10
このルールは同一IPアドレスから1時間以内に10回以上の決済が試行された場合、その決済をブロックします。
このようなルールを設定することで、カードテスティングやクレジットマスター攻撃のように、短時間に大量の決済が行われる攻撃を防ぐことができます。
ブロックされた場合の挙動
Radarルールにより決済がブロックされた場合、
Stripe からは以下のようなエラーが返却されます。
例:Stripe API レスポンス
{
"error": {
"type": "card_error",
"code": "card_declined",
"decline_code": "fraudulent",
"message": "Your card was declined."
}
}
フロントエンドでは、このレスポンスを受け取り、対応したメッセージを表示しています。
アプリケーション側でエラーハンドリングを行うことで、
ユーザーに対して適切なフィードバックを返すことができます。
ブロックルールのテスト
Stripe Radarではルールの有効化前に正常に検知できるかテストすることができます。
今回は同一カードで連続して7回の決済を試行し、6、7回目の決済にてブロックすることを確認しました。

Radarアシスタントについて
Stripe Radar には Radarアシスタント という機能があり、ルール作成をサポートしてくれます。
Radarアシスタントでは、自然言語で条件を入力すると、それに対応した Radar ルールを自動生成してくれます。
例えば、
「同一IPから短時間に大量の決済が行われた場合にブロックしたい」
といった内容を入力すると、それに対応するルールの候補を提案してくれます。
この機能を利用することで、Radarルールの構文をすべて覚えていなくても、比較的簡単にルールを作成できます。
まとめ
Stripe Radar のカスタムルールを利用することで、アプリケーション側で複雑な不正検知ロジックを実装することなく、決済のレート制限を比較的簡単に導入することができました。
特にカードテスティングやクレジットマスター攻撃のように、短時間に大量の決済が行われる攻撃に対しては、Stripe 側でブロックルールを設定しておくことで有効な対策となります。
今回の実装では、まず Radar のルール構文を調べながら手動でルールを作成していましたが、後から Radarアシスタント の存在を知り、質問するだけでルールを作成できることが分かりました。
この機能を最初から活用していれば、ルール作成の検討や検証をよりスムーズに進められたかもしれません。
また、もう一点の学びとして、Radar のカスタムルール機能は Radar for Fraud Teams へのアップグレードが必要ということです。
開発段階では問題なく設定できていたため、そのまま本番導入を進めようとしたところ、Radar のプランが必要であることに気づき、導入前にプランの確認が必要だったと感じました。
これから Stripe Radar を利用して不正決済対策を行う場合は、
Radarアシスタントの活用と利用プランの確認をあらかじめ行っておくと、よりスムーズに導入できると思います。
本記事が、Stripe Radar を用いた決済セキュリティ対策を検討している方の参考になれば幸いです。
お知らせ
技術ブログを週1〜2本更新中、ソーイをフォローして最新記事をチェック!
https://qiita.com/organizations/sewii
参考
- Stripe Radar公式ガイド(https://stripe.com/jp/guides/radar-rules-101)
- Stripe Radar rules reference (https://docs.stripe.com/radar/rules/reference?locale=ja-JP)




