CodeIgniter 4 Shieldv1.2.x
Masalah Umum
Perintah php spark shield:* tidak ditemukan
Section titled “Perintah php spark shield:* tidak ditemukan”Padahal paket sudah terpasang. Perintah shield:* ditemukan otomatis dari
namespace PSR-4 package; provider bukan yang mendaftarkannya. Biasanya
penyebabnya autoload Composer yang belum diperbarui atau perintah dijalankan
dari folder yang salah.
Perbaikan: jalankan composer dump-autoload, lalu cek dari root aplikasi:
php spark list | findstr shieldKalau masih kosong, pastikan vendor/ganadev/codeigniter4-shield benar-benar
ada. Provider bukan syarat untuk command; provider diperlukan untuk mendaftarkan
service, alias filter, dan filter default. Kalau aplikasi punya
app/Config/Commands.php, provider juga mendaftarkan command ke sana.
Filter firewall tidak terpasang
Section titled “Filter firewall tidak terpasang”Shield tidak memblokir apa pun padahal mode sudah enforce. Kemungkinan
terbesar: service provider belum dipanggil, sehingga filter default tidak
didaftarkan.
Perbaikan: tambahkan di app/Config/Events.php:
Events::on('pre_system', static function (): void { \Ganadev\Shield\Codeigniter\ShieldServiceProvider::register();});Kalau provider sudah dipanggil tetapi /.env tetap tidak terdeteksi, itu bukan
bug: filter default (globals['before']) berjalan setelah router, jadi path
tanpa route tidak pernah sampai ke filter. Instalasi default memasang
required['before'] + ShieldGateFilter untuk menutupinya — lihat
Registrasi & Urutan Filter.
Cek dengan route yang benar-benar ada (lihat php spark routes) dan
kirim payload yang memicu rule. /.env bukan route, jadi tidak bisa dipakai
sebagai uji filter default; request itu berhenti di PageNotFoundException
sebelum filter berjalan. Kalau Anda memakai setup required['before'], /.env
justru bisa dipakai sebagai uji.
ConfigException saat mengatur proxyIPs
Section titled “ConfigException saat mengatur proxyIPs”Gejala: ConfigException dengan pesan
You must set an array with Proxy IP address key and HTTP header name value in Config\App::$proxyIPs.
Penyebab: format array salah. CodeIgniter 4.3+ mengharuskan format
asosiatif (IP/CIDR → nama header), bukan array numerik.
Perbaikan:
public array $proxyIPs = [ '173.245.48.0/20' => 'CF-Connecting-IP', '103.21.244.0/22' => 'CF-Connecting-IP', // ...];Semua pengunjung terlihat dari satu IP
Section titled “Semua pengunjung terlihat dari satu IP”Gejala: challenge muncul untuk semua orang, atau ban menjangkiti semua pengguna sekaligus.
Penyebab: aplikasi di belakang proxy (Cloudflare, load balancer) tapi
proxyIPs di app/Config/App.php tidak diisi, sehingga IP proxy terbaca
sebagai IP klien.
Perbaikan: isi proxyIPs dengan rentang CIDR proxy Anda (lihat
Instalasi). Lakukan sebelum
menaikkan mode.
Mode observe tapi tidak memblokir
Section titled “Mode observe tapi tidak memblokir”Itu memang perilakunya. observe = mencatat, tidak menjalankan keputusan.
Naikkan ke challenge lebih dulu, lalu enforce setelah yakin tidak ada false
positive:
shield.mode = challengeGunakan shield.mode = enforce setelah masa observasi selesai. SHIELD_MODE
tidak dibaca karena nama properti config adalah mode.
Mengubah .env tidak berefek di php spark serve
Section titled “Mengubah .env tidak berefek di php spark serve”Server built-in CI4 adalah satu proses panjang; DotEnv memanggil putenv()
yang bertahan selama proses hidup. Perubahan .env tidak efek sampai proses
di-restart.
Perbaikan: restart server (Ctrl+C lalu php spark serve lagi) setiap
mengubah nilai config shield.*. Di Apache/Nginx dengan model per-request,
restart tidak diperlukan.
Widget reCAPTCHA tidak muncul di localhost
Section titled “Widget reCAPTCHA tidak muncul di localhost”- Driver memakai reCAPTCHA v2 checkbox. Pastikan
challengeDriverbernilairecaptchadanSHIELD_RECAPTCHA_SITE_KEYsudah diisi. - Daftarkan
localhostpada daftar domain key reCAPTCHA, lalu akses lewathttp://localhost:8080, bukan127.0.0.1. - Jika widget tetap kosong, periksa console browser: script
https://www.google.com/recaptcha/api.jsharus termuat.
Halaman admin tidak bisa dikunjungi (404 / tidak ada route)
Section titled “Halaman admin tidak bisa dikunjungi (404 / tidak ada route)”Route admin hanya didaftarkan kalau adminEnabled bernilai true. Defaultnya
false. Periksa app/Config/Shield.php:
public bool $adminEnabled = true;public string $adminAuthorize = 'admin.authorize';Jangan biarkan adminAuthorize kosong. Nilai kosong berarti siapa saja
boleh membuka panel admin; isi dengan filter otorisasi yang benar. Endpoint
GET /shield/health akan memberi peringatan bila nilainya kosong.
Permintaan ke URL tanpa route tidak terpantau
Section titled “Permintaan ke URL tanpa route tidak terpantau”Request seperti /.env tidak menyentuh filter globals['before'] karena
CodeIgniter melempar PageNotFoundException sebelum filter berjalan. Ini
perilaku default, bukan berarti Shield tidak bisa menanganinya.
Perbaikan: pasang ShieldGateFilter di required['before'] dan hapus
shield.firewall dari global filter — lihat
Registrasi & Urutan Filter. Instalasi
default sudah memakai pola ini. Dengan begitu, request 404/scanner diperiksa
sebelum router dan 404-nya tetap dihitung.
Kalau memilih registrasi default, andalkan WAF di depan server atau aturan
mod_rewrite untuk URL tersebut.
Semua orang kena challenge berulang
Section titled “Semua orang kena challenge berulang”- Trusted cookie tidak tersimpan. Pastikan HTTPS (atau
localhostdi development); request HTTP tidak mengirim cookieSecurekembali.trustedTtlMinutesmengatur masa berlakunya. trustedEnabledmati. Kalaufalse, tidak ada cookie sama sekali.thresholdChallengeterlalu kecil untuk traffic Anda. Cekshield:report.
Pengunjung asli masih diblokir
Section titled “Pengunjung asli masih diblokir”Ini hampir selalu masalah IP: semua pengguna “sama” karena proxyIPs kosong.
Baca baris “Semua pengunjung terlihat dari satu IP” di atas. Kalau bukan itu,
cari IP yang diblokir curiga di shield:report, lalu shield:release.
Blokir mengembalikan HTML, padahal kliennya API
Section titled “Blokir mengembalikan HTML, padahal kliennya API”Shield mendeteksi API lewat apiPaths dan apiDetectAccept. Pastikan path
API Anda masuk apiPaths:
public array $apiPaths = ['/api'];Atau pastikan klien mengirim Accept: application/json / X-Requested-With: XMLHttpRequest agar apiDetectAccept mengenalinya.
Ban tidak hilang setelah shield:release
Section titled “Ban tidak hilang setelah shield:release”shield:release memakai CachedBanRepository, jadi cache ikut dibersihkan.
Kalau IP masih terblokir:
- Pastikan IP yang dilepas benar — di belakang proxy, IP bisa berbeda.
- Cek apakah masih ada ban aktif lain, atau event baru yang membuat ban lagi.
- Perubahan langsung di database/SQL tidak membersihkan cache. Tunggu
banCacheTtlSeconds(default 30 detik) atau bersihkan cache aplikasi. - Release tidak mereset offense; bila IP menyerang lagi, ia bisa langsung ban lagi atau lebih lama.
shield:prune tidak berjalan otomatis
Section titled “shield:prune tidak berjalan otomatis”CodeIgniter tidak punya scheduler. Tambahkan cron:
* * * * * cd /path/ke/aplikasi && php spark shield:prune >> /dev/null 2>&1Tanpa itu, security_events tumbuh tanpa batas.
Googlebot tidak bisa mengindeks situs
Section titled “Googlebot tidak bisa mengindeks situs”- Pastikan
crawlerVerificationEnabledtrue. - Jalankan
shield:health— hostname terverifikasi atau tidak. - Pastikan server Anda bisa melakukan reverse DNS keluar (beberapa host memblokir port 53 dari aplikasi).
Apa selanjutnya kalau tidak ada yang cocok di sini
Section titled “Apa selanjutnya kalau tidak ada yang cocok di sini”Buka Pertanyaan Umum, atau lihat Shield :health untuk gejala teknis. Kalau tetap mentok, laporkan lewat Issues repository.
Powered by PT Ganadev Multi Solusi