Laravel Shieldv1.2.x
Keamanan
Shield layering meant to mengambil alih satu lapis pertahanan, bukan menggantikan keamanan aplikasi Anda. Halaman ini menjelaskan batasannya dengan jujur.
Apa yang tidak dilakukan Shield
Section titled “Apa yang tidak dilakukan Shield”Bukan pengganti validasi input
Section titled “Bukan pengganti validasi input”Shield melihat pola serangan yang dikenal. Kalau aplikasi Anda punya bug logika — atau field yang tidak divalidasi sama sekali — Shield tidak akan menyelamatkannya. Validasi input tetap tugas aplikasi.
Bukan pengganti CSP atau escaping
Section titled “Bukan pengganti CSP atau escaping”Shield memblokir <script pada body request kalau payload-nya terlihat seperti
serangan. Tapi HTML yang sah tetap perlu di-escape oleh Blade. {{ }} sudah
melakukan itu; {!! !!} tidak.
Bukan pengganti autentikasi dan otorisasi
Section titled “Bukan pengganti autentikasi dan otorisasi”Shield tidak tahu siapa pengguna Anda. Orang yang convincingly lolos
challenge belum tentu berhak mengakses /admin.
Bukan pengganti patch
Section titled “Bukan pengganti patch”Shield menahan skrip eksploitasi yang sudah menargetkan aplikasi Anda. Kalau ada CVE di dependency Anda, perbarui. Ban permanen bukan pengganti patch.
Bukan WAF di layer CDN
Section titled “Bukan WAF di layer CDN”Shield berjalan di PHP, jadi biayanya satu siklus CPU dan satu round-trip database per request mencurigakan. Untuk volum yang sangat besar, lakukan penyaringan kasar di CDN dulu, lalu Shield menangani yang lolos.
Batasan teknis yang perlu Anda tahu
Section titled “Batasan teknis yang perlu Anda tahu”Body dibatasi 64 KB
Section titled “Body dibatasi 64 KB”'inspection' => [ 'body' => [ 'max_bytes' => 65536, ],],Body yang lebih besar dipotong dan ditandai oversized. Payload di luar 64 KB
tidak akan dicocokkan. Naikkan hanya kalau memang perlu, karena menaikkan batas
ini menambah memori dan latensi per request.
Body multipart untuk upload file tidak pernah di-buffer sama sekali.
URI dipotong pada 2048 karakter
Section titled “URI dipotong pada 2048 karakter”URI yang lebih panjang dipotong sebelum dicocokkan ke rule. Ini mencegah request
raksasa memakai CPU hanya untuk diproses — tapi juga mengurangi deteksi payload
yang sengaja menyamar panjang. Kalau aplikasi Anda punya query string alami
yang panjang, seperti filter pencarian, sesuaikan performance.max_uri_length.
decode_depth maksimal 3
Section titled “decode_depth maksimal 3”Nilai bawaan 2 sudah menangkap payload ber-encode ganda. Di atas 3 tidak
diizinkan karena amplifier tidak lagi berarti.
Rate limit dihitung per IP
Section titled “Rate limit dihitung per IP”Semua counter perilaku di-key dengan IP. Dua akibatnya:
- ** orang yang berbagi IP bisa saling menyakiti.** Kantor, kampus, jaringan
seluler, dan sebagian besar VPN. Untuk kasus ini,
challengelebih baik daripadaban. - Penyerang dengan banyak IP lolos. Ini bukan kelemahan Shield, tapi batas nyata dari pendekatan berbasis IP. Untuk perlindungan yang lebih ketat, tambahkan throttle di layer lain.
Counter disimpan di cache dan di-namespace dengan app_id. Kalau dua aplikasi
berbagi Redis tanpa app_id yang berbeda, ban dan counter mereka akan saling
menimpa.
ReDoS dijaga, tapi tidak sempurna
Section titled “ReDoS dijaga, tapi tidak sempurna”Regex bawaan sudah ditulis pendek. Regex yang Anda tambahkan diperiksa saat boot
dengan batas waktu 50 milidetik, jadi pola berbahaya ditolak lebih awal. Tetap
saja, setiap rule regex menambah biaya per request.
Data yang disimpan
Section titled “Data yang disimpan”Shield menyimpan dua tabel.
security_ip_bans
Section titled “security_ip_bans”| Kolom | Isi |
|---|---|
ip_address |
IP yang diban. |
status |
active atau sudah dilepas. |
reason |
Alasan penolakan. |
last_rule_id |
Rule terakhir yang memicu. |
risk_score |
Skor terakhir. |
offense_count |
Jumlah pelanggaran, menentukan durasi ban berikutnya. |
banned_at, expires_at |
Rentang waktu ban. |
released_at, challenge_passed_at |
Jejak audit. |
metadata |
Data tambahan format JSON. |
security_events
Section titled “security_events”| Kolom | Isi |
|---|---|
ip_address, host |
Siapa dan dari mana. |
method, raw_uri, normalized_uri |
Request-nya seperti apa. |
rule_id, category, severity |
Rule mana yang cocok. |
score_delta |
Skor yang disumbangkan request ini. |
decision, intended_decision |
Keputusan akhir dan keputusan yang akan terjadi. |
user_agent, referer |
Header. |
rule_version |
Versi signature saat kejadian. |
Kolom intended_decision berguna untuk satu hal: saat mode masih observe,
Anda bisa melihat keputusan apa yang akan diambil kalau mode dinaikkan.
Privasi
Section titled “Privasi”Parameter yang disamarkan
Section titled “Parameter yang disamarkan”Nilai parameter query sensitif diganti *** sebelum disimpan:
?token=abc123 -> ?token=***?password=rahasia -> ?password=***Daftar bawaannya: token, password, passwd, key, secret, code,
auth. Pencocokan bersifat case-insensitive dan menangani kunci yang
di-percent-encode.
Parameter yang tidak terdaftar tersimpan apa adanya. Kalau aplikasi Anda punya
api_key atau jwt di query string, tambahkan ke
privacy.sensitive_query_parameters.
Data yang tetap terekam
Section titled “Data yang tetap terekam”ip_address dan user_agent disimpan apa adanya. Keduanya adalah data pribadi
di bawah GDPR dan UU PDP. Pertimbangkan:
logging.retention_daysyang lebih pendek kalau Anda tidak butuh riwayat panjang,- satu
app_idper lingkungan supaya data staging tidak tercampur dengan produksi.
Shield tidak mengirim data ke pihak ketiga mana pun. Verifikasi challenge meneruskan IP pengunjung ke Cloudflare atau Google — itu terjadi karena Anda mengaktifkan challenge, dan privasi ini penting untuk diketahui.
Batasan infrastruktur
Section titled “Batasan infrastruktur”Kalau database mati
Section titled “Kalau database mati”Default fail_mode adalah open: request diteruskan, kejadian tetap dicatat
sebagai infrastruktur yang terganggu. Penyerang bisa lolos selama server sedang
sakit.
closed memblokir semua request sampai pulih. Itu melindungi data, tetapi juga
memblokir semua pengunjung sah. Pilih berdasarkan apa yang lebih penting bagi
Anda. Yang penting: closed tidak pernah otomatis kembali ke open —
tidak ada yang ingat mencabutnya saat insiden selesai.
Kalau cache mati
Section titled “Kalau cache mati”Verifikasi crawler dan cache ban butuh cache. Tanpa cache, Shield melakukan query database setiap kali — lebih lambat, tapi tetap benar.
Kalau DNS mati
Section titled “Kalau DNS mati”Verifikasi crawler gagal, dan crawler yang gagal diverifikasi mendapat sinyal
unverified_crawler_claim. Selama bots.mode masih observe, dampaknya
hanya log. Inilah alasan observe adalah default yang aman untuk SEO.
Yang tetap menjadi tanggung jawab Anda
Section titled “Yang tetap menjadi tanggung jawab Anda”- Validasi input di setiap endpoint yang menerima data dari luar.
-
{{ }}di Blade, bukan{!! !!}, untuk output yang bukan HTML. - Dependency package diperbarui secara berkala.
- Password dan API key tidak pernah ada di URL.
- Backup berkala, dan log aplikasi Anda.
- HTTPS, selalu.
- Rate limit khusus untuk login, di luar Shield.
- Pantau penyimpangan pada event Shield, jangan hanya mengandalkan dashboard.
Powered by PT Ganadev Multi Solusi