Lewati ke konten

Shield Corev1.2.x

Model Keamanan

Dokumentasi keamanan yang tidak menjelaskan batasan sama saja tidak dibaca. Halaman ini menjelaskan apa yang tidak bisa dilakukan Shield.

Shield melihat request untuk mencari tanda serangan. Ia tidak memvalidasi data Anda.

// Tetap wajib, setiap kali, tanpa kecuali.
$request->validate([
'email' => 'required|email',
'qty' => 'required|integer|min:1',
]);

Kalau input Anda tidak divalidasi, request itu akan terlihat sah dan Shield akan membiarkannya masuk.

Shield tidak menyentuh output. XSS yang lolos escaping bukan urusannya.

// Tetap wajib.
{{ $userInput }} // Blade otomatis escape
{!! $userInput !!} // tidak escape — jangan pakai untuk input pengguna

Shield tidak tahu siapa pengguna Anda. Ia hanya tahu dari mana request datang dan apakah request itu looking seperti serangan.

Kalau aplikasi Anda punya CVE yang belum dipatch, tidak ada konfigurasi Shield yang memperbaikinya. Ban hanya menahan payload, bukan kerentanan.

Kalau Anda sudah punya WAF di CDN, Shield bukan penggantinya. Ia lapisan kedua yang punya memori.

Request terverifikasi tidak pernah ikut di-ban oleh perilaku saja

Section titled “Request terverifikasi tidak pernah ikut di-ban oleh perilaku saja”

Kalau matches kosong dan tidak ada ban aktif, verdict tidak akan pernah terminal. Ini dijamin oleh kode, bukan konvensi.

Satu-satunya pengecualian: rule critical tetap berlaku, dan ban yang sudah aktif juga tetap berlaku.

Kegagalan infrastruktur tidak menjatuhkan situs

Section titled “Kegagalan infrastruktur tidak menjatuhkan situs”

fail_mode bawaannya open. Kalau BanRepository melempar exception, request tetap diteruskan dan infrastructureDegraded diisi true.

Kalau Anda pilih closed, blokir happens dengan skor 99 dan alasan fail_closed. Itu pilihan Anda, tapi default-nya adalah yang aman untuk dipakai tanpa pemantauan.

Yang disimpan: URI, User-Agent, referrer, rule yang cocok, skor, keputusan.

Yang tidak pernah disimpan: isi body request.

Parameter query yang sensitif disamarkan sebelum ditulis:

'privacy' => [
'sensitive_query_parameters' => [
'token', 'password', 'passwd', 'key', 'secret', 'code', 'auth',
],
],

Jadi ?token=abc123 tersimpan sebagai ?token=***.

admin.authorize kosong secara default. Tanpa itu, panel admin tidak menambah lapisan apa pun — tanggung jawab sepenuhnya ada di lapisan autentikasi Anda.

Ini nomor satu. Aplikasi di belakang proxy tanpa konfigurasi yang benar berarti seluruh proteksi berbasis IP jadi tidak berguna.

// Jangan pernah:
Request::setTrustedProxies(['*'], ...);
// Yang benar: CIDR proxy yang Anda percaya
Request::setTrustedProxies(['173.245.48.0/20'], ...);

Kalau Anda salah mengonfigurasi, dua hal terjadi: semua orang terlihat dari (ban massal), dan penyerang cukup memalsukan X-Forwarded-For untuk menghilangkan jejaknya.

observe → baca laporan → challenge → baca lagi → enforce

Melompat langsung ke enforce tanpa membaca laporan berarti Anda tidak tahu siapa yang sebenarnya tertangkap.

Kalau nilai ini sering true, proteksi Anda berjalan setengah jalan tanpa Anda sadar. Di adapter Laravel, php artisan shield:health akan menunjukkan ini.

EventRepositoryInterface::pruneOlderThan() tidak akan pernah dipanggil otomatis. Tanpa penjadwalan, tabel kejadian tumbuh tanpa batas.

Semua counter perilaku di-key per IP. Ini berarti:

  • Kantor, kampus, dan jaringan seluler akan terlihat seperti satu pelaku.
  • pengguna VPN berbagi reputasi.

Untuk kasus seperti ini, challenge lebih tepat daripada ban.

Kalau banyak request paralel datang bersamaan, sebagian bisa lolos sebelum ban tercatat. Ini alasan cache 30 detik ada.

User-Agent, Referer, dan Accept adalah input tidak tepercaya. Shield menggunakannya sebagai sinyal lemah dengan bobot 2, bukan sebagai bukti. Kalau Anda membuat rule berdasarkan Accept,anyak penyerang yang akan meloloskannya.

inspection.body.max_bytes membatasi 65 536 byte. Payload yang lebih besar dari itu tidak diperiksa isinya.

Reverse-DNS tidak selalu menjawab. Kalau tidak, crawler tidak dapat diverifikasi dan mode challenge akan menagih challenge berulang. Untuk itu ada bots.verification.ip_ranges.

decode_depth yang terlalu rendah akan membiarkan payload multi-layer lolos. Terlalu tinggi membuat setiap request mahal. Dua adalah titik tengah yang waras.

Tidak ada angka acak. Input sama menghasilkan keputusan sama, selalu. Ini memudahkan mereproduksi bug dan membandedkan log.

Errornya mematikan seluruh situs lebih sulit diperbaiki daripada errornya memblokir sebagian user. Karena itu open adalah default, dan closed harus dipilih secara sadar.

Body request tidak pernah masuk log. Parameter sensitif disamarkan. ID rule tidak ditampilkan ke pengguna di mode produksi.

Setiap verdict membawa kode alasan yang bisa dibaca. Kalau Anda tidak bisa menjelaskan kenapa sebuah IP diblokir, periksa verdict->reason dulu sebelum mengubah apa pun.

  • TrustProxies memakai CIDR, bukan '*'.
  • mode sudah naik ke challenge, dan laporan sudah dibaca.
  • branding.show_rule_id bernilai false.
  • logging.level bukan all.
  • Cron schedule:run aktif untuk pemangkasan.
  • admin.authorize diisi, kalau panel admin diaktifkan.
  • fail_mode masih open.
  • Parameter privacy.sensitive_query_parameters mencakup apa pun yang sensitif di aplikasi Anda.
  • Input divalidasi dan output di-escape. Tetap dilakukan.

Powered by PT Ganadev Multi Solusi