> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# サインイン時のボット対策：スタッフィングと総当たり

> Diditは、ボット、クレデンシャルスタッフィング、総当たり攻撃、使い捨てメール、危険なネットワーク、インポッシブルトラベルからサインアップとサインインを保護します。攻撃モードも搭載しています。

> [!WARNING]
>
> 認証機能は新しく追加されたものです。保護機能は有効にするまでオフになっています。レート制限とコード入力の試行回数の上限は常に適用されます。

ボット対策は、すべてのサインアップ、サインイン、パスワードリセットで実行されます。試行を6つのポリシーと照らし合わせてチェックします。各ポリシーにはモードがあります。

| モード | 動作 |
| - | - |
| **オフ** | このポリシーはチェックされません。 |
| **記録** | 試行はそのまま続行されます。`risk_logged`イベントに一致が記録されます。 |
| **追加確認** | 試行を続行する前に、本人は追加の確認を完了する必要があります。 |
| **ブロック** | 試行は`403 {"error": "attempt_blocked"}`で失敗します。 |

## 保護機能の設定

設定の読み取りと変更は、アプリケーションのAuthentication管理APIの`protection/`に対する`GET`と`PATCH`、またはコンソールから行えます。

```json theme={null}
{
  "enabled": true,
  "breached_password_check": true,
  "policies": {
    "bots": "block",
    "stuffing": "block",
    "brute": "challenge",
    "disposable": "block",
    "vpn": "challenge",
    "travel": "block"
  }
}
```

`enabled`と`breached_password_check`はデフォルトで`false`です。保護機能を有効にすると、上記のモードがデフォルトで適用されます。

## ポリシー

| ポリシー | 一致する条件 |
| - | - |
| `bots` | クライアントが報告するボットスコアが0.8以上である場合、またはユーザーエージェントが既知のヘッドレスブラウザや自動化ブラウザである場合。 |
| `stuffing` | 1つのデバイスまたはIPが15分以内に10以上の異なるアカウントを試行した場合、またはパスワードが既知の漏洩パスワードである場合。 |
| `brute` | アカウントで失敗した試行が5回以上ある場合。誤ったパスワード、メール、電話、認証アプリの誤ったコードはすべてカウントされます。 |
| `disposable` | サインアップで使い捨てメールドメインが使われている場合。 |
| `vpn` | IPがVPN、Tor、またはデータセンターのネットワークである場合。 |
| `travel` | 24時間以内に、前回のサインインから500kmを超えて離れた場所で、時速1,000kmを超える移動を伴うサインインがあった場合。 |

`vpn`と`travel`のポリシーはDiditのIP分析を使用します。この照会が利用できない場合、試行は続行されます。これを理由にサインインが失敗することはありません。`travel`の位置情報は、サインインが完了した後にのみ更新されます。

### ブルートフォースとロックアウト

5回の失敗後の動作は`brute`のモードによって決まります。

* **Block**: 再びサインインするには、本人がパスワードをリセットする必要があります。
* **Challenge**: アカウントが15分間ロックされ、次の試行では追加の証明が必要になります。
* **Off**または**Log**: ロックされません。

ブルートフォースによるブロックの後もパスワードリセットは利用でき、リセットするとロックが解除されます。チームがコンソールからアカウントのロックを解除することもできます。

保護機能の設定を一度も保存していない場合は、よりシンプルなルールが適用されます。パスワードを5回間違えると、アカウントが15分間ロックされます。

### ボットスコアとデバイスシグナル

ランタイム呼び出しでは、以下のヘッダーでデバイスシグナルを送信します。ホスト型ページは自動で送信します。

| ヘッダー | 内容 |
| - | - |
| `X-Didit-PID` | 永続的なデバイスID。`A-Z a-z 0-9 . _ : -`からなる8〜128文字。 |
| `X-Didit-FP-Hash` | デバイスフィンガープリント。 |
| `X-Didit-FP-Bot-Score` | 0から1までのボットスコア。この範囲外の値は無視されます。 |

これらのシグナルは判定のためのコンテキストであり、本人であることの証明ではありません。各[サインインイベント](https://docs.didit.me/ja/authentication/events-and-webhooks.md)にも含まれ、ルールから`event.device.bot_score`として読み取れます。

> [!NOTE]
>
> `AUTOMATION_FRAMEWORK_DETECTED`は別のチェックです。これは**検証セッション**における[IP・デバイス分析の警告](https://docs.didit.me/ja/core-technology/ip-analysis/warnings-ip-analysis.md)で、検証SDKがブラウザ自動化フレームワークを報告したときに発生します。サインイン時には実行されません。サインイン時の自動化は、上記の`bots`ポリシーで検出されます。

## 追加確認

追加確認の対象となった試行は、サインインコードの代わりに次のレスポンスを返します。

```json theme={null}
{
  "protection_required": true,
  "challenge": "...",
  "methods": ["passkey", "email_code"],
  "options": { "...": "WebAuthn options when a passkey is offered" },
  "expires_in": 300
}
```

`POST protection/complete/`で完了させます。

* 本人のメールアドレスに送信された6桁のコードを使う場合は、`{"challenge", "method": "email_code", "code"}`
* WebAuthnのレスポンスを使う場合は、`{"challenge", "method": "passkey", "response"}`

5分以内に5回まで試行できます。本人が利用可能な認証手段がない場合、呼び出しは`403 {"error": "protection_factor_unavailable"}`を返します。

## 漏洩パスワード

`breached_password_check: true`を指定すると、Diditは新規パスワードとリセット後のパスワードを既知の漏洩パスワードと照合します。パスワード自体がどこかに送信されることはありません。漏洩パスワードは`password_breached`として拒否されます。サインイン時には、漏洩パスワードは`stuffing`の一致としてカウントされます。チェックが利用できない場合、パスワードは受け入れられます。

## 攻撃モード

攻撃を受けている最中は攻撃モードを有効にします。

* `{"duration_hours": 1}`(または`6`、`24`)を指定した`POST protection/attack-mode/`は`201`を返します。
* `DELETE protection/attack-mode/`で早期に終了できます。指定した期間が過ぎると自動的にも終了します。

攻撃モードが有効な間は、次のようになります。

* すべてのサインアップとサインインで**パスキー**チャレンジを通過する必要があります。メールコードは受け付けられません。新規サインアップや、パスキーを持たない人は、攻撃モードが終了するまで完了できません。
* VPN、Tor、またはデータセンターのネットワークからのサインアップはブロックされます。

## レート制限

すべてのランタイムルートは、アプリケーションごとにIP単位で制限されます。

| ルート | 1分あたり | 1時間あたり |
| - | - | - |
| DiscoveryとJWKS | 1,200 | 12,000 |
| ランタイムAPIとホスト型ページ | 30 | 300 |
| メールコード、電話コード、プロバイダーのコールバック | 5 | 20 |

制限を超えると、リクエストに対して`429`が返されます。`Retry-After`ヘッダーが送信された場合は、それに従ってください。サインインの試行も1分あたりで制限されます。IPごとに60回、アカウントごとに15回、デバイスごとに30回、アプリケーションごとに1,000回、電話番号のプレフィックスごとにSMSまたはWhatsAppのコードリクエストが20回です。

## イベント

各判定は[認証イベント](https://docs.didit.me/ja/authentication/events-and-webhooks.md)として記録されます。`risk_logged`、`attempt_challenged`、`attempt_blocked`、`challenge_passed`、`challenge_failed`、`attack_mode_started`、`attack_mode_ended`として記録されます。イベントには、どのポリシーに一致したかが表示されます。

## テストする

サンドボックスのアプリケーションで、有効にする各モードをテストしてください。ブロックされた試行、追加確認の成功と失敗、ロックアウトとそのリセット、攻撃モードの有効化と無効化です。UIのエラーは汎用的な内容にとどめ、アカウントの存在有無が分からないようにしてください。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.