From ee2294ee0d89abeb1c2e8572d5e32550eaf4162f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=AE=E3=81=B6?= Date: Sat, 17 Jan 2026 20:07:33 +0900 Subject: [PATCH 01/32] =?UTF-8?q?Issue=20#1301:=20=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=82=A8=E3=83=A9=E3=83=BC=E8=A1=A8=E7=A4=BA?= =?UTF-8?q?=E6=94=B9=E5=96=84=20+=20=E3=83=96=E3=83=AB=E3=83=BC=E3=83=88?= =?UTF-8?q?=E3=83=95=E3=82=A9=E3=83=BC=E3=82=B9=E6=94=BB=E6=92=83=E5=AF=BE?= =?UTF-8?q?=E7=AD=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 概要 ログイン失敗時のエラーを別画面ではなくログインフォーム上に直接表示するよう改善し、 データベースベースのレート制限によるブルートフォース攻撃対策を追加しました。 ## 主な変更内容 ### 1. エラー表示の改善 - ログイン失敗時に別画面(LC_Page_Error)へ遷移していた仕様を変更 - エラーメッセージをログインフォーム上に直接表示 - UX(ユーザー体験)の向上 ### 2. ブルートフォース攻撃対策 - データベーステーブル `dtb_login_attempt` を新規作成し、ログイン試行を記録 - レート制限ヘルパークラス `SC_Helper_LoginRateLimit` を実装 - 制限ルール: - 同一メールアドレス: 1時間に5回まで失敗を許可 - 同一IPアドレス: 1時間に10回まで失敗を許可 - Issue #368のパスワードリセット機能と同様の実装パターンを採用 ### 3. セキュリティ強化 - アカウント列挙攻撃対策: エラーメッセージを統一 - XSS対策: テンプレートで |h|nl2br フィルタを適用 - SQLインジェクション対策: プリペアドステートメント使用 - ログイン試行の記録による監査証跡の確保 - 既存のSession Fixation対策・CSRF対策を維持 ### 4. デバイス別対応 - PC: ログインフォーム上にエラー表示 - スマートフォン: JSON形式でエラー返却 - モバイル: ログインフォーム上にエラー表示 ## 変更ファイル **追加:** - data/class/helper/SC_Helper_LoginRateLimit.php (新規) - data/class_extends/helper/SC_Helper_LoginRateLimit_Ex.php (新規) - tests/class/helper/SC_Helper_LoginRateLimit/SC_Helper_LoginRateLimitTest.php (新規) **修正:** - data/class/pages/frontparts/LC_Page_FrontParts_LoginCheck.php - data/class/pages/shopping/LC_Page_Shopping.php - data/Smarty/templates/default/mypage/login.tpl - data/Smarty/templates/default/shopping/index.tpl - data/Smarty/templates/mobile/mypage/login.tpl - data/Smarty/templates/mobile/shopping/index.tpl - html/install/sql/create_table_mysqli.sql - html/install/sql/create_table_pgsql.sql - eccube_install.sh - tests/require.php ## テスト - 全12テスト、33アサーションが成功 - レート制限の動作確認済み - XSS対策の検証済み ## セキュリティレビュー 包括的なセキュリティレビューを実施し、以下を確認: - ✅ SQLインジェクション対策 - ✅ XSS対策(エスケープ処理) - ✅ CSRF対策の維持 - ✅ Session Fixation対策の維持 - ✅ アカウント列挙攻撃への部分的対策 - ✅ レート制限によるブルートフォース攻撃対策 ## 統計 - 13ファイル変更 - 768行追加、119行削除 Co-Authored-By: Claude Opus 4.5 --- .../Smarty/templates/default/mypage/login.tpl | 3 + .../templates/default/shopping/index.tpl | 3 + data/Smarty/templates/mobile/mypage/login.tpl | 3 + .../templates/mobile/shopping/index.tpl | 3 + .../class/helper/SC_Helper_LoginRateLimit.php | 244 ++++++++++++++ .../LC_Page_FrontParts_LoginCheck.php | 143 ++++---- .../class/pages/shopping/LC_Page_Shopping.php | 124 ++++--- .../helper/SC_Helper_LoginRateLimit_Ex.php | 29 ++ eccube_install.sh | 1 + html/install/sql/create_table_mysqli.sql | 12 + html/install/sql/create_table_pgsql.sql | 12 + .../SC_Helper_LoginRateLimitTest.php | 309 ++++++++++++++++++ tests/require.php | 1 + 13 files changed, 768 insertions(+), 119 deletions(-) create mode 100644 data/class/helper/SC_Helper_LoginRateLimit.php create mode 100644 data/class_extends/helper/SC_Helper_LoginRateLimit_Ex.php create mode 100644 tests/class/helper/SC_Helper_LoginRateLimit/SC_Helper_LoginRateLimitTest.php diff --git a/data/Smarty/templates/default/mypage/login.tpl b/data/Smarty/templates/default/mypage/login.tpl index c68babc7b5..6f02777549 100644 --- a/data/Smarty/templates/default/mypage/login.tpl +++ b/data/Smarty/templates/default/mypage/login.tpl @@ -33,6 +33,9 @@