Lewati ke konten

CodeIgniter 4 Shield

Firewall aplikasi untuk CodeIgniter 4. Dipasang sebagai filter, langsung bekerja sebelum request sampai ke controller.

CodeIgniter 4 Shield adalah firewall di dalam aplikasi CodeIgniter 4 Anda. Begitu sebuah request masuk, Shield menilainya sebelum controller sempat berjalan, lalu membuat salah satu keputusan:

Keputusan Arti
Izinkan Request normal, lanjut ke aplikasi.
Amati Mencurigakan, tapi dicatat dulu tanpa mengganggu pengguna.
Challenge Minta pengunjung membuktikan manusia dulu (Turnstile/reCAPTCHA).
Blokir Request berbahaya, ditolak.
Ban IP pelaku diblokir sementara; durasi mengikuti jumlah offense.

Bedanya dengan WAF di depan server: Shield punya memori. Ia tahu bahwa satu IP sudah mencoba 300 URL berbeda dalam 60 detik, atau sudah tiga kali mencoba login gagal. WAF biasa hanya melihat request yang sedang lewat.

Kebutuhan Keterangan
PHP ^8.2 Minimal.
CodeIgniter 4 ^4.3 Baseline dokumentasi 4.7.5; 4.3–4.7.4 legacy.
Database Untuk menyimpan ban dan catatan kejadian. MySQL, MariaDB, PostgreSQL, atau SQLite.
Akun Cloudflare atau Google Hanya kalau Anda memakai challenge.
Terminal window
composer require ganadev/codeigniter4-shield

Lalu daftarkan service provider di app/Config/Events.php:

Events::on('pre_system', static function (): void {
\Ganadev\Shield\Codeigniter\ShieldServiceProvider::register();
});

Untuk aplikasi publik, jangan berhenti di provider saja. Instalasi default memasang ShieldGateFilter di required['before'] agar request 404/scanner diperiksa sebelum router. Langkah lengkapnya ada di Instalasi.

Setelah gate terpasang, jalankan migrasi:

Terminal window
php spark migrate --all

Itu dia — dalam mode bawaan, Shield hanya mencatat dan belum memblokir apa pun. Aman untuk dipasang di aplikasi yang sedang berjalan.

Tanpa baris Events::on(...) di atas, Shield tetap bisa berjalan memakai fallback internal, tetapi service, alias filter, dan filter default tidak terpasang. Perintah php spark shield:* tetap ditemukan otomatis dari namespace PSR-4 package, jadi perintah tidak bergantung pada baris tersebut.

Provider menempatkan filter default di globals['before'], yang berjalan setelah router. Instalasi default memindahkannya ke required['before'] lewat ShieldGateFilter agar path tanpa route (seperti /.env) juga diperiksa. Detailnya ada di Registrasi & Urutan Filter.

File sensitif. Permintaan seperti /.env, /.git/config, /.aws/credentials, wp-config.php, file backup .php.bak, sampai file .php yang muncul di dalam folder upload dikenali. Pada mode challenge atau enforce, request-nya diblokir; pada observe hanya dicatat.

Pemeriksaan path yang tidak punya route seperti /.env memerlukan setup required['before'] + ShieldGateFilter. Pada registrasi default, request itu tidak sampai ke filter karena router sudah lebih dulu melempar 404 — lihat Registrasi & Urutan Filter.

Path traversal. Bukan hanya ../, tapi juga versi yang di-encode: %2e%2e, dan yang di-encode dua kali %252e%252e%252f. Targetnya /etc/passwd dan /proc/self/environ.

Serangan SQLi, XSS, dan command injection. Biasanya WAF hanya melihat URL. Shield juga membaca body request — termasuk application/json — lalu mencari union select, <script, php://input, eval(, dan sebagainya.

Penelahan (enumeration). Bot yang mencoba ratusan URL berbeda dalam 60 detik, atau yang membanjiri /login dengan ratusan percobaan. Deretan request yang berakhir 404 juga dihitung — termasuk 404 sebelum router jika Anda memakai setup required['before']. Tanpa setup itu, hanya 404 dari route yang berjalan yang tercatat.

Bot palsu. Siapa pun bisa mengirim User-Agent: Googlebot. Shield memverifikasi klaim crawler lewat reverse DNS/IP; pada mode challenge atau enforce, klaim palsu dapat di-challenge atau diblokir. Pada mode observe (default), Shield hanya mencatat agar Anda bisa menilai hasilnya dulu.

  1. Mulai dari mode observe. Shield secara bawaan hanya mencatat dan belum memblokir. Biarkan 1–3 hari, lalu baca shield:report untuk memastikan tidak ada yang salah sasaran.
  2. Atur proxyIPs kalau ada proxy. Kalau aplikasi di belakang Cloudflare atau load balancer tanpa pengaturan ini, semua pengguna terlihat berasal dari satu IP — dan Anda akan memblokir orang banyak sekaligus.
  3. Jalankan shield:prune via cron. Supaya tabel catatan kejadian tidak tumbuh tanpa batas.

Ketiganya dijelaskan di Instalasi.

Instalasi

Panduan langkah demi langkah, dari composer require sampai filter terpasang.

Masalah Umum

Gejala, penyebab, dan perbaikannya.

Registrasi & Filter

Urutan filter, setup sebelum router, dan counter halaman publik. Baca panduannya.

Konfigurasi

Semua kunci konfigurasi, lengkap dengan nilai default-nya.

Powered by PT Ganadev Multi Solusi