Bot対策機能仕様書 (Cloudflare Turnstile導入 & レートリミット)

1. 概要

download.php からの直接ダウンロードに対して、Bot判定ロジックとCloudflare Turnstileを用いた認証を導入する。 正規ユーザーの利便性を損なわないよう、怪しい挙動(大量ダウンロード等)が検知された場合のみ認証を要求する(Adaptive Challenge)。

2. 目的

3. 実装詳細

3.1 処理フロー (src/download.php)

  1. セッション初期化と確認

    • init_session() 後、session_status() を確認し、必要であれば session_start() を実行。
    • $_SESSION['turnstile_verified_until'] を確認。
    • 現在時刻と比較し、有効期限内(1時間以内)であれば Bot判定をスキップ してダウンロード処理へ移行。
  2. Bot判定ロジック (Detection)

    • セッション認証がない場合、以下の順で判定を行う。
    • A. User-Agent判定
      • getServer('HTTP_USER_AGENT') を取得。
      • config.phpBOT_BLOCK_UA_LIST 配列をループし、部分一致 (stripos) でチェック。
      • 一致した場合 → **Bot認定 ($is_bot_behavior = true)**。
    • B. レートリミット判定 (Analytics Log)
      • config.phpUSE_ANALYTICS_LOGtrue の場合:
        • DBA_analytics クラスを使用し、IPアドレスを元にしたダウンロード回数をチェックする。
        • 短期間チェック: getDownloadCountByIp($ip, 600) > BOT_LIMIT_SHORT_TERM
        • 長期間チェック: getDownloadCountByIp($ip, 86400) > BOT_LIMIT_LONG_TERM
        • いずれかの閾値を超過した場合 → **Bot認定 ($is_bot_behavior = true)**。
      • config.phpUSE_ANALYTICS_LOGfalse の場合:
        • レートリミットによる判定が実行できないため、安全策として Bot認定 ($is_bot_behavior = true) とみなし、Turnstile認証を要求する。
  3. 認証プロセス (Challenge & Verification)

    • Bot認定 された場合、以下の処理を行う。
    • POSTリクエスト受信時 (検証):
      • $_POST['cf-turnstile-response'] の存在を確認。
      • Cloudflare API (https://challenges.cloudflare.com/turnstile/v0/siteverify) に secret, response, remoteip をPOST送信。
      • 検証成功 (success: true):
        • $_SESSION['turnstile_verified_until']time() + 3600 を設定。
        • header("Location: ...") で現在のURL(クエリパラメータ含む)へリダイレクト。
      • 検証失敗:
        • 認証画面表示へ進む。
    • 画面表示:
      • Smartyテンプレート turnstile.tpl を表示。
      • turnstile_site_key, action_url, turnstile_action ('download') をアサイン。
      • ダウンロード処理を **中断 (return)**。

3.2 データベース設計 (src/phplib/dba/DBA_analytics.php)

3.3 設定項目 (src/config.php)

以下の定数を追加する。

定数名 説明 デフォルト値
TURNSTILE_SITE_KEY Cloudflare Turnstile Site Key (空文字)
TURNSTILE_SECRET_KEY Cloudflare Turnstile Secret Key (空文字)
BOT_BLOCK_UA_LIST ブロック対象User-Agentリスト ['curl', 'wget', 'python', 'bot', 'crawler', 'spider']
BOT_LIMIT_SHORT_TERM 短期間(10分)の許容DL数 100
BOT_LIMIT_LONG_TERM 長期間(24時間)の許容DL数 1000

3.4 画面仕様 (src/templates/turnstile.tpl)

3.5 Cloudflare設定 (Dashboard)

Turnstileのウィジェット作成時に以下の設定を行うこと。

4. 補足事項