Lewati ke konten

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.

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.

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.

Shield tidak tahu siapa pengguna Anda. Orang yang convincingly lolos challenge belum tentu berhak mengakses /admin.

Shield menahan skrip eksploitasi yang sudah menargetkan aplikasi Anda. Kalau ada CVE di dependency Anda, perbarui. Ban permanen bukan pengganti patch.

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.

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

Nilai bawaan 2 sudah menangkap payload ber-encode ganda. Di atas 3 tidak diizinkan karena amplifier tidak lagi berarti.

Semua counter perilaku di-key dengan IP. Dua akibatnya:

  1. ** orang yang berbagi IP bisa saling menyakiti.** Kantor, kampus, jaringan seluler, dan sebagian besar VPN. Untuk kasus ini, challenge lebih baik daripada ban.
  2. 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.

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.

Shield menyimpan dua tabel.

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

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.

ip_address dan user_agent disimpan apa adanya. Keduanya adalah data pribadi di bawah GDPR dan UU PDP. Pertimbangkan:

  • logging.retention_days yang lebih pendek kalau Anda tidak butuh riwayat panjang,
  • satu app_id per 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.

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.

Verifikasi crawler dan cache ban butuh cache. Tanpa cache, Shield melakukan query database setiap kali — lebih lambat, tapi tetap benar.

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.

  • 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