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.
Yang bukan pekerjaan Shield
Section titled “Yang bukan pekerjaan Shield”Bukan pengganti validasi input
Section titled “Bukan pengganti validasi input”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.
Bukan pengganti escaping output
Section titled “Bukan pengganti escaping output”Shield tidak menyentuh output. XSS yang lolos escaping bukan urusannya.
// Tetap wajib.{{ $userInput }} // Blade otomatis escape{!! $userInput !!} // tidak escape — jangan pakai untuk input penggunaBukan pengganti autentikasi dan otorisasi
Section titled “Bukan pengganti autentikasi dan otorisasi”Shield tidak tahu siapa pengguna Anda. Ia hanya tahu dari mana request datang dan apakah request itu looking seperti serangan.
Bukan pengganti patch
Section titled “Bukan pengganti patch”Kalau aplikasi Anda punya CVE yang belum dipatch, tidak ada konfigurasi Shield yang memperbaikinya. Ban hanya menahan payload, bukan kerentanan.
Bukan pengganti WAF
Section titled “Bukan pengganti WAF”Kalau Anda sudah punya WAF di CDN, Shield bukan penggantinya. Ia lapisan kedua yang punya memori.
Yang Shield janjikan
Section titled “Yang Shield janjikan”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.
Tidak ada rahasia di dalam log
Section titled “Tidak ada rahasia di dalam log”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 API tidak terbuka secara default
Section titled “Admin API tidak terbuka secara default”admin.authorize kosong secara default. Tanpa itu, panel admin tidak menambah
lapisan apa pun — tanggung jawab sepenuhnya ada di lapisan autentikasi Anda.
Yang harus Anda lakukan sendiri
Section titled “Yang harus Anda lakukan sendiri”Setel TrustProxies dengan benar
Section titled “Setel TrustProxies dengan benar”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 percayaRequest::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.
Naikkan mode secara bertahap
Section titled “Naikkan mode secara bertahap”observe → baca laporan → challenge → baca lagi → enforceMelompat langsung ke enforce tanpa membaca laporan berarti Anda tidak tahu
siapa yang sebenarnya tertangkap.
Pantau infrastructureDegraded
Section titled “Pantau infrastructureDegraded”Kalau nilai ini sering true, proteksi Anda berjalan setengah jalan tanpa Anda
sadar. Di adapter Laravel, php artisan shield:health akan menunjukkan ini.
Jadwalkan pemangkasan
Section titled “Jadwalkan pemangkasan”EventRepositoryInterface::pruneOlderThan() tidak akan pernah dipanggil
otomatis. Tanpa penjadwalan, tabel kejadian tumbuh tanpa batas.
Batasan yang perlu diketahui
Section titled “Batasan yang perlu diketahui”Satu IP untuk banyak orang
Section titled “Satu IP untuk banyak orang”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.
Rate limit tidak sempurna
Section titled “Rate limit tidak sempurna”Kalau banyak request paralel datang bersamaan, sebagian bisa lolos sebelum ban tercatat. Ini alasan cache 30 detik ada.
Header bisa dipalsukan
Section titled “Header bisa dipalsukan”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.
Body hanya dibaca sebagian
Section titled “Body hanya dibaca sebagian”inspection.body.max_bytes membatasi 65 536 byte. Payload yang lebih besar dari
itu tidak diperiksa isinya.
DNS bisa gagal
Section titled “DNS bisa gagal”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.
decoded_contains punya batas
Section titled “decoded_contains punya batas”decode_depth yang terlalu rendah akan membiarkan payload multi-layer lolos.
Terlalu tinggi membuat setiap request mahal. Dua adalah titik tengah yang
waras.
Prinsip yang dipegang
Section titled “Prinsip yang dipegang”Deterministik
Section titled “Deterministik”Tidak ada angka acak. Input sama menghasilkan keputusan sama, selalu. Ini memudahkan mereproduksi bug dan membandedkan log.
Gagal terbuka secara bawaan
Section titled “Gagal terbuka secara bawaan”Errornya mematikan seluruh situs lebih sulit diperbaiki daripada errornya
memblokir sebagian user. Karena itu open adalah default, dan closed harus
dipilih secara sadar.
Privasi sebagai default
Section titled “Privasi sebagai default”Body request tidak pernah masuk log. Parameter sensitif disamarkan. ID rule tidak ditampilkan ke pengguna di mode produksi.
Jelaskan setiap keputusan
Section titled “Jelaskan setiap keputusan”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.
Daftar periksa sebelum produksi
Section titled “Daftar periksa sebelum produksi”-
TrustProxiesmemakai CIDR, bukan'*'. -
modesudah naik kechallenge, dan laporan sudah dibaca. -
branding.show_rule_idbernilaifalse. -
logging.levelbukanall. - Cron
schedule:runaktif untuk pemangkasan. -
admin.authorizediisi, kalau panel admin diaktifkan. -
fail_modemasihopen. - Parameter
privacy.sensitive_query_parametersmencakup apa pun yang sensitif di aplikasi Anda. - Input divalidasi dan output di-escape. Tetap dilakukan.
Berikutnya
Section titled “Berikutnya”- Testing & CI — cara memverifikasi semua ini otomatis.
- Perilaku & Bot — panduan lengkap untuk sisi Laravel.
Powered by PT Ganadev Multi Solusi