CodeIgniter 4 Shieldv1.2.x
Perilaku & Bot
Halaman ini membahas dua hal yang saling berkaitan: deteksi perilaku (pola lintas request dari satu IP) dan verifikasi bot (crawler mesin pencari yang belajar dari web).
Deteksi perilaku
Section titled “Deteksi perilaku”Shield tidak hanya mencocokkan satu request — ia juga menghitung perilaku sebuah IP dalam satu jendela waktu:
| Sinyal | Default | Arti |
|---|---|---|
uniqueUriLimit |
25 |
IP yang meminta ≥ 25 URL berbeda dalam 60 detik sedang menyelusuri situs. |
notFoundLimit |
20 |
IP yang menghasilkan ≥ 20 halaman 404 sedang mencari file yang tidak ada. |
pathRateLimit |
30 |
IP yang membanjiri satu path tertentu (≥ 30 request). |
sensitivePathRateLimit |
8 |
IP yang membanjiri path sensitif seperti /login (≥ 8 request). |
scannerUserAgents |
['sqlmap', 'nikto', ...] |
User-Agent alat pemindai; diberi skor scannerUaSignal. |
missingRefererSignal |
true |
Request tanpa Referer dapat sinyal tambahan. |
Semua penghitung ini disimpan di cache CodeIgniter. Ambangnya inklusif: request yang membuat hitungan mencapai nilai limit sudah memicu sinyal. Ikhtiar menuju satu aturannya sama: jangan tidak percaya seseorang karena satu request, tapi waspadai pola yang berulang.
Skor behavior terhadap rata-rata
Section titled “Skor behavior terhadap rata-rata”Shield menghitung skor request sebagai penjumlahan: skor dari rule (pencocokan pola) ditambah skor dari perilaku. Cuma karena satu IP membuka 30 URL berbeda tidak langsung diblokir — skornya masih di bawah ambang. Tapi IP yang membuka 30 URL berbeda dan mengaku Googlebot dan tidak membawa Referer: skornya naik, dan Shield mulai mencurigainya.
not_found dan batas 404
Section titled “not_found dan batas 404”Secara default, filter after Shield mencatat 404 hanya untuk request yang
berhasil masuk ke route. Request ke URL yang tidak punya route sama sekali —
seperti /.env — dilempar PageNotFoundException sebelum filter global
berjalan, jadi tidak terhitung sebagai 404.
Kalau Shield dipasang di required['before']/required['after'] lewat
ShieldGateFilter, request 404 sebelum router tetap diperiksa dan dihitung.
Instalasi default sudah memakai pola ini; detailnya ada di
Registrasi & Urutan Filter. Baca juga
Model Keamanan untuk batas lainnya.
Verifikasi bot
Section titled “Verifikasi bot”Browser bot bisa menulis User-Agent: Googlebot sendiri. Shield tidak percaya
begitu saja — ia memverifikasi bahwa IP yang mengaku bot benar-benar punya nama
host milik crawler itu.
Dua tingkat kepercayaan
Section titled “Dua tingkat kepercayaan”| Tingkat | Kondisi | Perlakuan |
|---|---|---|
| Terverifikasi | Reverse DNS IP cocok dengan crawlerHostnames, atau IP ada di crawlerIpRanges. |
Tidak kena sinyal unverifiedClaimSignal, dan boleh melewati challenge bot. |
| Tidak terverifikasi | Klaim bot, tapi reverse DNS / rentang IP tidak cocok. | Diberi skor unverifiedClaimSignal tambahan. |
Cara verifikasi
Section titled “Cara verifikasi”- Hostname (reverse DNS). Shield membalik-resolusi IP penuh, lalu
mencocokkan suffix dengan
crawlerHostnames:googlebot→.googlebot.com,.google.com. Verifikasi ini di-buffer selamacrawlerVerificationTtlHours(default 24 jam) dan disimpan di cache. - Rentang IP (opsional, tapi disarankan). Kalau Anda kenal rentang IP
crawler tertentu, masukkan langsung ke
crawlerIpRangessupaya tidak perlu menunggu DNS:
public array $crawlerIpRanges = [ 'googlebot' => [ '66.249.64.0/19', // contoh; cek daftar rentang resmi Google ],];Bentuknya map agent → daftar CIDR, bukan daftar CIDR datar. Agent harus
sama dengan nama di knownBotAgents dan crawlerHostnames.
Masa berlaku hasil verifikasi
Section titled “Masa berlaku hasil verifikasi”Hasil DNS diingat selama crawlerVerificationTtlHours (default 24 jam).
Setelah itu, IP dianggap tidak terverifikasi lagi sampai dicek ulang. Nilai
tersebut cukup besar supaya DNS tidak dihantam setiap request.
Mode bot
Section titled “Mode bot”| Mode | Perilaku |
|---|---|
observe |
Klaim bot tidak bisa memicu challenge/ban hanya dari perilaku. Signature rule dan ban aktif tetap berlaku. Crawler terverifikasi mendapat pengecualian perilaku. |
challenge |
Bot yang tidak terverifikasi diarahkan ke challenge kalau verdict belum terminal. Bot terverifikasi tidak di-challenge karena faktor bot, tetapi signature rule dan ban aktif tetap berlaku. |
off |
Cabang khusus observe/challenge dimatikan. Klasifikasi bot dan skor unverifiedClaimSignal tetap berjalan, jadi klaim bot palsu masih bisa menambah skor dan memicu keputusan normal. |
public string $botMode = 'observe';Mulai dari observe. Kalau trafik bot palsu mulai mengganggu, naikkan ke
challenge — bot terverifikasi (seperti Googlebot asli) tidak terpengaruh.
Daftar User-Agent yang dikenali
Section titled “Daftar User-Agent yang dikenali”knownBotAgents berisi 18 nama yang dikenali Shield sebagai bot:
googlebot, bingbot, yandexbot, baiduspider, duckduckbot,
ahrefsbot, semrushbot, mj12bot, dotbot, bytespider, ccbot,
gptbot, chatgpt-user, claudebot, anthropic, openai,
oai-searchbot, perplexitybot.
Dua hal yang perlu Anda tahu tentang daftar ini:
- Verifikasi tetap dijalankan. Masuk ke daftar tidak berarti lolos — itu hanya penanda “bot”. Verifikasi DNS tetap menentukan nasibnya.
- Crawler AI dihormati bahasanya sendiri. Saat ini Shield tidak memblokir
AI crawler oleh dirinya sendiri. Kalau Anda mau memblokir
gptbotatauclaudebot, tambahkan kesuspiciousUserAgentsatau blokir di level server (lihat FAQ).suspiciousUserAgentOverridesada di Config CI4 tetapi tidak dipetakan ke core, jadi tidak berpengaruh.
Mengubah skor klaim tak terverifikasi
Section titled “Mengubah skor klaim tak terverifikasi”public int $unverifiedClaimSignal = 4;Naikkan angka ini kalau bot palsu sering lewat, turunkan kalau terlalu banyak false positive pada IP bersama (misalnya ISP yang memakai NAT untuk bot asli dan manusia).
Kalau Googlebot Anda diblokir
Section titled “Kalau Googlebot Anda diblokir”- Pastikan
crawlerVerificationEnabledmasihtrue(default). - Jalankan
php spark shield:health— ia memeriksa resolusi DNS. - Pastikan server Anda bisa melakukan reverse DNS keluar (beberapa host membatasi port 53 untuk aplikasi).
- Teliti di
shield:reportapakahgooglebottercatat terverifikasi.
Kalau AI bot tidak boleh diakses
Section titled “Kalau AI bot tidak boleh diakses”Sementara Shield belum menawarkan toggle khusus untuk AI crawler, cara paling bersih adalah mencegatnya sebelum menyentuh PHP. Contoh di nginx:
# Blokir crawler AI umum sebelum sampai ke PHPmap $http_user_agent $blocked_ai_bot { default 0; ~*gptbot 1; ~*claudebot 1; ~*bytespider 1;}
server { if ($blocked_ai_bot) { return 403; } # ...}Dengan begini beban server tetap ringan — request tidak pernah masuk ke aplikasi Anda sama sekali.
Powered by PT Ganadev Multi Solusi