Lewati ke konten

Perilaku & Bot

Behavior engine menangani bot yang menghindari signature statis — memakai counter berbasis waktu.

Sinyal Kondisi Skor
unique_uri_burst ≥ unique_uri_limit URI dalam window +12
not_found_enumeration ≥ not_found_limit 404 dalam window +10
sensitive_path_burst ≥ sensitive_path_rate_limit request ke path auth +10
path_rate_burst ≥ path_rate_limit request ke path sama +8
method_anomaly PUT/DELETE/PATCH ke path publik +4
missing_headers tanpa User-Agent +2
scanner_tool_ua marker tool scanner (sqlmap/nikto/…) +4
suspicious_user_agent klien generic / Mozilla/5.0 polos +2
missing_referer POST tanpa Referer +2
oversized_request URI melebihi max_uri_length +2
known_crawler crawler dikenal —
verified_crawler crawler terverifikasi IP —
unverified_crawler_claim klaim crawler gagal verifikasi +4

Middleware menghitung request per path + IP dalam window. Endpoint auth (behavior.sensitive_paths) memakai ambang lebih rendah (sensitive_path_rate_limit, default 8).

Mode Perilaku
off Tidak ada efek — semua bot dianggap traffic biasa.
observe Crawler diverifikasi & sinyal tercatat, tidak diblok.
challenge (default) Crawler terverifikasi diizinkan; klaim tak terverifikasi di-challenge.

User-Agent bisa dipalsukan, jadi klaim User-Agent: Googlebot belum cukup. Crawler hanya dipercaya jika IP-nya terverifikasi (bots.verification):

  1. CIDR allowlist (bots.verification.ip_ranges) — cepat, tanpa DNS.
  2. Reverse-DNS + forward-confirm — gethostbyaddr(ip) harus menghasilkan hostname dengan suffix domain crawler (mis. *.googlebot.com), lalu hostname itu harus resolve balik ke IP yang sama.
  3. Hasil di-cache per IP selama bots.verification.ttl_hours (default 24 jam).

Suffix bawaan: googlebot (.googlebot.com, .google.com), bingbot (.search.msn.com), yandexbot (.yandex.ru, .yandex.net), baiduspider (.baidu.com, .baidu.jp), duckduckbot (.duckduckgo.com), ahrefsbot (.ahrefs.com), semrushbot (.semrush.com), dotbot (.moz.com), ccbot (.cc).

Crawler terverifikasi → behavior delta di-nol-kan: crawl deras Googlebot tidak pernah men-challenge/ban. Signature critical tetap selalu diblok.

SEO: dengan verifikasi aktif, Googlebot/Bing/Yandex/Baidu + crawler SEO utama dibiarkan lewat penuh. Path SEO (robots.txt, sitemap.xml, feed, konten) dijamin tak diblok (ada regresi fixtures/seo-corpus.json).

Dua tingkatan sinyal:

  • Tool scanner (behavior.scanner_user_agents: sqlmap, nikto, metasploit, wpscan, gobuster, dirbuster, masscan, nmap, nessus, acunetix, zgrab, httpx, …) → scanner_tool_ua +4.
  • Klien generic (curl/, wget, python-requests, node-fetch, axios, java/, powershell, …) + override behavior.suspicious_user_agents → suspicious_user_agent +2.

UA Mozilla/5.0 polos dianggap mencurigakan. Sinyal UA tidak pernah memblokir sendirian.

rules.packs.injection (default aktif) + inspection.body.enabled (default aktif) membuat body POST/JSON ikut diperiksa (maks 64KB, multipart/* di-skip, body tidak pernah di-log) — menutup celah single-shot probe & sqlmap. Sebagian besar rule injection ber-skor medium (band challenge) untuk menghindari FP.

Eskalasi offense tidak dipicu sinyal lemah (+2); butuh signature match atau sinyal perilaku ≥ 10 (RiskScorer::MIN_ESCALATION_BEHAVIOR_SCORE).

  1. Mulai observe, pantau shield:report.
  2. Naikkan threshold bila aplikasi memang menerima burst sah.
  3. Matikan missing_referer_signal bila POST tanpa Referer memang normal.
  4. Matikan rules.packs.injection / inspection.body.enabled bila aplikasi sah mengirim teks mirip payload.
  5. Pantau manual release & challenge pass rate sebagai sinyal FP.

Powered by PT Ganadev Multi Solusi