> ## 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.

# Proteksi Bot saat Sign-In: Stuffing, Brute Force

> Didit melindungi sign-up dan sign-in dari bot, credential stuffing, brute force, email sekali pakai, dan jaringan berisiko.

> [!WARNING]
>
> Autentikasi masih baru. Perlindungan nonaktif sampai Anda mengaktifkannya. Batas laju dan batas percobaan kode selalu berlaku.

Perlindungan bot berjalan pada setiap pendaftaran, masuk, dan atur ulang kata sandi. Setiap percobaan diperiksa terhadap enam kebijakan. Setiap kebijakan memiliki mode:

| Mode | Yang terjadi |
| - | - |
| **Nonaktif** | Kebijakan tidak diperiksa. |
| **Catat** | Percobaan dilanjutkan. Event `risk_logged` mencatat kecocokan tersebut. |
| **Tantang** | Pengguna harus lolos bukti tambahan sebelum percobaan dilanjutkan. |
| **Blokir** | Percobaan gagal dengan `403 {"error": "attempt_blocked"}`. |

## Konfigurasi perlindungan

Baca dan ubah pengaturan dengan `GET` dan `PATCH` pada `protection/` di API manajemen Autentikasi aplikasi Anda, atau dari konsol.

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

`enabled` dan `breached_password_check` bernilai `false` secara default. Mode di atas menjadi nilai default setelah Anda mengaktifkan perlindungan.

## Kebijakan

| Kebijakan | Cocok saat |
| - | - |
| `bots` | Klien melaporkan skor bot 0,8 atau lebih, atau user agent adalah browser headless atau otomatis yang dikenal. |
| `stuffing` | Satu perangkat atau IP mencoba 10 akun berbeda atau lebih dalam 15 menit, atau kata sandi adalah kata sandi yang bocor dan dikenal. |
| `brute` | Akun memiliki 5 percobaan gagal atau lebih. Kata sandi salah serta kode email, telepon, dan autentikator yang salah dihitung semuanya. |
| `disposable` | Pendaftaran menggunakan domain email sekali pakai. |
| `vpn` | IP berasal dari jaringan VPN, Tor, atau pusat data. |
| `travel` | Proses masuk dilakukan lebih dari 500 km dari proses masuk sebelumnya, dengan kecepatan lebih dari 1.000 km/jam, dalam 24 jam. |

Kebijakan `vpn` dan `travel` menggunakan analisis IP Didit. Jika pencarian tersebut tidak tersedia, percobaan dilanjutkan; masuk tidak pernah gagal karena hal ini. Lokasi untuk `travel` hanya diperbarui setelah masuk berhasil diselesaikan.

### Brute force dan penguncian

Mode `brute` menentukan apa yang terjadi setelah 5 kegagalan:

* **Blokir**: pengguna harus mengatur ulang kata sandinya sebelum dapat masuk lagi.
* **Tantang**: akun dikunci selama 15 menit, dan percobaan berikutnya memerlukan bukti tambahan.
* **Nonaktif** atau **Catat**: tidak ada penguncian.

Pengaturan ulang kata sandi tetap tersedia setelah pemblokiran brute force, dan pengaturan ulang membuka kunci akun. Tim Anda juga dapat membuka kunci akun dari konsol.

Jika Anda belum pernah menyimpan pengaturan perlindungan, berlaku aturan yang lebih sederhana: 5 upaya dengan kata sandi yang salah mengunci akun selama 15 menit.

### Skor bot dan sinyal perangkat

Kirim sinyal perangkat pada panggilan saat runtime dengan header berikut. Halaman yang di-hosting mengirimkannya untuk Anda.

| Header | Konten |
| - | - |
| `X-Didit-PID` | ID perangkat yang persisten, 8 hingga 128 karakter dari `A-Z a-z 0-9 . _ : -`. |
| `X-Didit-FP-Hash` | Sidik jari perangkat. |
| `X-Didit-FP-Bot-Score` | Skor bot dari 0 hingga 1. Nilai di luar rentang tersebut diabaikan. |

Sinyal ini adalah konteks untuk sebuah keputusan, bukan bukti identitas. Sinyal ini juga dikirim bersama [event masuk](https://docs.didit.me/id/authentication/events-and-webhooks.md), yang memungkinkan aturan membaca `event.device.bot_score`.

> [!NOTE]
>
> `AUTOMATION_FRAMEWORK_DETECTED` adalah pemeriksaan yang berbeda. Ini adalah [peringatan analisis IP dan perangkat](https://docs.didit.me/id/core-technology/ip-analysis/warnings-ip-analysis.md) pada **sesi verifikasi**, yang muncul ketika SDK verifikasi melaporkan framework otomatisasi browser. Pemeriksaan ini tidak berjalan saat masuk. Saat masuk, otomatisasi ditangkap oleh kebijakan `bots` di atas.

## Tantangan

Percobaan yang ditantang mengembalikan respons ini sebagai pengganti kode masuk:

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

Selesaikan dengan `POST protection/complete/`:

* `{"challenge", "method": "email_code", "code"}` dengan kode 6 digit yang dikirim ke email pengguna, atau
* `{"challenge", "method": "passkey", "response"}` dengan respons WebAuthn.

Anda mendapat 5 percobaan dalam 5 menit. Jika pengguna tidak memiliki bukti yang tersedia, panggilan mengembalikan `403 {"error": "protection_factor_unavailable"}`.

## Kata sandi yang bocor

Dengan `breached_password_check: true`, Didit memeriksa kata sandi baru dan kata sandi saat pengaturan ulang terhadap kata sandi yang diketahui pernah bocor. Kata sandinya sendiri tidak pernah dikirim ke mana pun. Kata sandi yang bocor ditolak dengan `password_breached`. Saat masuk, kata sandi yang bocor dihitung sebagai kecocokan `stuffing`. Jika pemeriksaan tidak tersedia, kata sandi diterima.

## Mode serangan

Aktifkan mode serangan saat serangan sedang berlangsung:

* `POST protection/attack-mode/` dengan `{"duration_hours": 1}` (atau `6` atau `24`) mengembalikan `201`.
* `DELETE protection/attack-mode/` mengakhirinya lebih awal. Mode ini juga berakhir dengan sendirinya setelah durasinya habis.

Saat mode serangan aktif:

* setiap pendaftaran dan masuk harus lolos tantangan **passkey**. Kode email tidak diterima. Pendaftaran baru dan pengguna tanpa passkey tidak dapat menyelesaikan proses sampai mode serangan berakhir.
* pendaftaran dari jaringan VPN, Tor, atau pusat data diblokir.

## Batas laju

Setiap rute runtime dibatasi per IP, per aplikasi:

| Rute | Per menit | Per jam |
| - | - | - |
| Discovery dan JWKS | 1.200 | 12.000 |
| API runtime dan halaman yang di-hosting | 30 | 300 |
| Kode email, kode telepon, dan callback penyedia | 5 | 20 |

Jika melewati batas, panggilan mengembalikan `429`. Patuhi header `Retry-After` jika dikirim. Percobaan masuk juga dibatasi per menit: 60 per IP, 15 per akun, 30 per perangkat, 3.000 per aplikasi, dan 20 permintaan kode SMS atau WhatsApp per awalan nomor telepon. Penyegaran token memiliki bucket aplikasi tersendiri, 6.000 per menit, sehingga penyegaran tidak pernah menghabiskan kuota masuk Anda.

## Event

Setiap keputusan dicatat sebagai [event autentikasi](https://docs.didit.me/id/authentication/events-and-webhooks.md): `risk_logged`, `attempt_challenged`, `attempt_blocked`, `challenge_passed`, `challenge_failed`, `attack_mode_started`, dan `attack_mode_ended`. Event menunjukkan kebijakan mana yang cocok.

## Uji coba

Di aplikasi sandbox, uji setiap mode yang Anda aktifkan: percobaan yang diblokir, tantangan yang berhasil dan gagal, penguncian beserta pengaturan ulangnya, serta mode serangan yang diaktifkan dan dinonaktifkan. Jaga agar pesan kesalahan di UI Anda tetap umum agar tidak mengungkap apakah suatu akun ada.


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