レートリミット機能で不正アクセスから保護する方法
EC-CUBE 4には、様々な画面へのアクセスを制限するレートリミット機能が搭載されています。本番環境では、会員登録やパスワードリセット、お問い合わせなどの機能に対してデフォルトで有効になっており、不正な大量アクセスやボット攻撃から保護します。
設定ファイルの場所
環境ごとに異なる設定ファイルがあります:
- 開発環境:
app/config/eccube/packages/eccube_rate_limiter.yaml - 本番環境:
app/config/eccube/packages/prod/eccube_rate_limiter.yaml - テスト環境:
app/config/eccube/packages/test/eccube_rate_limiter.yaml
本番環境でデフォルト有効な機能
本番環境(prod/eccube_rate_limiter.yaml)では、以下の機能にレートリミットが適用されています:
- forgot: パスワードリセット(5回/30分)
- entry: 会員登録フォーム(25回/30分)
- entry_complete: 会員登録完了(5回/30分)
- contact: お問い合わせ(5回/30分)
- mypage_change: マイページ会員情報変更(10回/30分)
- mypage_delivery_*: 配送先住所の追加・編集・削除(10回/30分)
- shopping_shipping_*_edit: 注文画面の配送先編集(10回/30分)
- admin_two_factor_auth: 管理画面2段階認証(5回/30分)
デフォルトで無効な機能(注文確認・決済画面)
shopping_confirm_ip:
route: ~
limit: 25
interval: '30 minutes'
shopping_confirm_customer:
route: ~
limit: 10
interval: '30 minutes'
shopping_checkout_ip:
route: ~
limit: 25
interval: '30 minutes'
shopping_checkout_customer:
route: ~
limit: 10
interval: '30 minutes'
注文確認・決済画面のレートリミットはroute: ~(null)で無効化されています。
設定パラメータの説明
route: 適用するルート名(~はnullで無効)method: 対象のHTTPメソッド(['POST']、['GET', 'POST']など)type: 制限の単位(ipまたはuser/customer)limit: 許可する最大アクセス回数interval: 制限をカウントする期間params: 追加の条件(特定のパラメータ値でのみ適用)
type の種類
ip: IPアドレス単位で制限(ゲスト含む全ユーザー)user: 管理画面ユーザー単位で制限customer: 会員ユーザー単位で制限
注文確認・決済画面のレートリミットを有効化する
注文確認・決済画面を保護したい場合は、routeに具体的なルート名を指定します。
1. 基本的な有効化(prod/eccube_rate_limiter.yamlを編集)
shopping_confirm_ip:
route: 'shopping_confirm'
method: [ 'POST' ]
type: ip
limit: 100
interval: '30 minutes'
30分以内に同一IPから100回以上のPOSTアクセスを制限します。
2. 厳格な設定(不正対策重視)
shopping_checkout_ip:
route: 'shopping_checkout'
method: [ 'POST' ]
type: ip
limit: 10
interval: '10 minutes'
shopping_checkout_customer:
route: 'shopping_checkout'
method: [ 'POST' ]
type: customer
limit: 5
interval: '10 minutes'
決済画面への連続アクセスを厳しく制限。カード情報の総当たり攻撃を防止します。
3. パラメータ条件付きの制限
entry_complete:
route: entry
method: [ 'POST' ]
params:
mode: complete
type: ip
limit: 5
interval: '30 minutes'
mode=completeのときのみ適用。会員登録の最終完了処理を厳しく制限します。
ユースケース別の推奨設定
BtoC(一般消費者向け)
shopping_confirm_ip:
route: 'shopping_confirm'
limit: 200
interval: '30 minutes'
shopping_checkout_ip:
route: 'shopping_checkout'
limit: 20
interval: '15 minutes'
決済画面は厳しく、確認画面は緩やかに設定。
BtoB(法人向け)
shopping_confirm_customer:
route: 'shopping_confirm'
limit: 1000
interval: '60 minutes'
shopping_checkout_customer:
route: 'shopping_checkout'
limit: 100
interval: '30 minutes'
大量発注がある場合を考慮して高めに設定。
高セキュリティが必要な場合
shopping_checkout_ip:
route: 'shopping_checkout'
limit: 5
interval: '5 minutes'
shopping_checkout_customer:
route: 'shopping_checkout'
limit: 3
interval: '10 minutes'
クレジットカード決済がある場合など、不正利用対策を強化。
設定反映方法
# コマンドラインの場合
php bin/console cache:clear
# 管理画面の場合
コンテンツ管理 > キャッシュ管理 > キャッシュ削除
制限された場合のユーザー体験
レートリミットに達したユーザーには、HTTPステータス429(Too Many Requests)が返されます。適切なエラーページを用意することで、ユーザーに状況を説明できます。
IPアドレス vs 会員単位の使い分け
- IPアドレス単位: 同一ネットワークからの攻撃を防ぐ。ゲスト購入も制限可能。
- 会員単位: 正規会員の操作制限に有効。共有IPの影響を受けない。
両方を併用することで、より強固な防御が可能です。
注意点
- 限度値を低く設定しすぎると、正規ユーザーが注文できなくなる可能性があります
- プロキシやCDN経由のアクセスでは、IPアドレスが同一になる場合があります
- intervalを短くしすぎると、キャッシュへの負荷が増加します
routeの値はSymfonyのルート名と一致させる必要があります
関連機能
ログイン試行回数制限(login_throttling)と併用することで、サイト全体のセキュリティを強化できます。
まとめ
EC-CUBE 4のレートリミット機能は、本番環境では会員登録やパスワードリセットなど重要な機能に対してデフォルトで有効化されています。注文確認・決済画面は無効化されているため、必要に応じてprod/eccube_rate_limiter.yamlを編集して有効化してください。適切な制限値を設定することで、不正アクセスから保護しながら、正規ユーザーの利便性を維持できます。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。
EC-CUBEゴールドパートナー