Lewati ke konten

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

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.

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.

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.

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.

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.
  1. Hostname (reverse DNS). Shield membalik-resolusi IP penuh, lalu mencocokkan suffix dengan crawlerHostnames: googlebot → .googlebot.com, .google.com. Verifikasi ini di-buffer selama crawlerVerificationTtlHours (default 24 jam) dan disimpan di cache.
  2. Rentang IP (opsional, tapi disarankan). Kalau Anda kenal rentang IP crawler tertentu, masukkan langsung ke crawlerIpRanges supaya 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.

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

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 gptbot atau claudebot, tambahkan ke suspiciousUserAgents atau blokir di level server (lihat FAQ). suspiciousUserAgentOverrides ada di Config CI4 tetapi tidak dipetakan ke core, jadi tidak berpengaruh.
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).

  1. Pastikan crawlerVerificationEnabled masih true (default).
  2. Jalankan php spark shield:health — ia memeriksa resolusi DNS.
  3. Pastikan server Anda bisa melakukan reverse DNS keluar (beberapa host membatasi port 53 untuk aplikasi).
  4. Teliti di shield:report apakah googlebot tercatat terverifikasi.

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 PHP
map $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