CodeIgniter 4 Shieldv1.2.x
Testing & CI
Aturan pertama: jangan uji di produksi
Section titled “Aturan pertama: jangan uji di produksi”Semua keputusan Shield diuji lewat dua jalur aman:
- Mode
observe— Shield mencatat apa yang akan dilakukannya, tanpa memblokir siapa pun. Pemasangan pertama sebaiknya selalu memakai mode ini. shield:replay— menjalankan korpus request lewat rule bawaan Shield, tanpa request sungguhan.
Uji manual dengan mode: observe
Section titled “Uji manual dengan mode: observe”Biarkan shield.mode = observe selama 1–3 hari, lalu jalankan:
php spark shield:reportPeriksa: apakah rule yang memicu masuk akal? Apakah ada IP asli yang tercatat
sekelas dengan penyerang? Kalau semua terlihat wajar, naikkan ke challenge,
lalu enforce. Nama env yang benar adalah shield.mode;
SHIELD_MODE tidak dibaca.
Demo app
Section titled “Demo app”Gunakan demo app yang ada di dalam package untuk mencoba Shield secara langsung:
cd vendor/ganadev/codeigniter4-shield/examples/codeigniter4-democomposer installphp spark migrate --allphp spark serveDemo app menyediakan beberapa route untuk diuji:
| Route | Fungsi |
|---|---|
GET / / GET /home |
Route normal. |
GET /login |
Path sensitif (memicu deteksi brute-force). |
POST /login |
Submit form. |
GET /api/users |
Endpoint API (respons blokir JSON). |
POST /api/login |
Login API. |
Uji terotomatisasi
Section titled “Uji terotomatisasi”Package ini diuji dengan Pest, PHPStan untuk static analysis, dan Pint untuk format kode. Dari folder package:
composer test # menjalankan seluruh suite Pestcomposer analyse # PHPStan level 0composer format-test # Pint: verifikasi formatCakupan test & coverage
Section titled “Cakupan test & coverage”Suite test mencakup unit (Shield Core), integrasi database, CLI, dan feature test (alur challenge, skip-path firewall, admin API, dan verifikasi crawler). Kelengkapan kode (coverage) diperiksa lewat Xdebug:
php -d xdebug.mode=coverage vendor/bin/pest --coverage --coverage-text=build/coverage-ci4.txtphp tools/check-coverage.php build/coverage-ci4.txt 50Ambang minimum paket ini adalah 50%; build CI terakhir mencatat line coverage 91,83%. Pipeline menolak hasil yang turun di bawah ambang.
Test yang serupa untuk aplikasi Anda
Section titled “Test yang serupa untuk aplikasi Anda”Kalau aplikasi Anda ingin memastikan Shield terpasang dengan benar, cukup beberapa pengujian kecil:
// Pastikan gate berjalan sebelum router dan tidak ada double inspection.public function testShieldGateIsRequiredBefore(): void{ $config = config('Filters');
expect($config->required['before'])->toContain('shield.gate'); expect($config->required['after'])->toContain('shield.gate'); expect(in_array('shield.firewall', $config->globals['before'], true))->toBeFalse();}Kalau aplikasi masih memakai registrasi default, jangan memakai test di atas.
Ganti dengan assertion bahwa shield.firewall ada di globals['before']. Yang
penting: jangan menguji keduanya sekaligus, karena itu berarti request diperiksa
dua kali. Pola setup-nya ada di
Registrasi & Urutan Filter.
Menguji rule dengan shield:replay
Section titled “Menguji rule dengan shield:replay”php spark shield:replay corpus.json --min-rate=0.98Format yang dibaca adalah top-level entries:
{ "entries": [ { "uri": "/home", "method": "GET", "expected": "allow", "category": "normal" }, { "uri": "/.env", "method": "GET", "expected": "block", "category": "probe" } ]}expected bernilai block atau allow. Deteksi dihitung dari entri block;
entri allow yang ikut diblokir dihitung sebagai false positive dan selalu
membuat exit code 1, meskipun --min-rate terpenuhi. Format export events
juga diterima, tetapi setiap event diperlakukan sebagai expected: allow, jadi
jangan pakai export event untuk mengukur detection rate.
Batasan yang perlu diketahui:
- Perintah ini memakai
DefaultRules(opsional--pack-wordpress), bukan config atau custom rule aplikasi. Pack injection tidak dimuat otomatis. - Hanya
uridanmethodyang dibaca; body, header, danhostdiabaikan. - Setiap entri memakai penghitung perilaku baru, jadi urutan request dalam satu skenario tidak direplay sebagai satu sesi.
- Fixture
fixtures/scanner-corpus.jsonmemakai skemascenarios, bukanentries; konversi dulu sebelum dipakai.
Pipeline CI sederhana:
php spark shield:replay corpus.json || exit 1Membaca hasil
Section titled “Membaca hasil”shield:health— komponen siap atau ada yang rewel (DB, cache, proxy, DNS).shield:report— ringkasan kejadian untuk menilai false positive.shield:rules:list— aturan yang benar-benar dimuat.
Memastikan konfigurasi Anda benar-benar terpakai
Section titled “Memastikan konfigurasi Anda benar-benar terpakai”Kesalahan paling umum: mengubah app/Config/Shield.php lalu kecewa karena
perilaku tidak berubah. Selalu buktikan dengan perintah yang membaca konfigurasi
terkini — shield:rules:list dan shield:health.
CI paket: GitHub Actions
Section titled “CI paket: GitHub Actions”Package ini menjalankan workflow di GitHub Actions pada PHP 8.2, 8.3, dan 8.4:
- secret scan (gitleaks) —
continue-on-error, jadi tidak memblokir pipeline, composer validate --strict --no-check-publish,- Pint (
format-test) dan PHPStan (analyse), - Pest dengan coverage, lalu memeriksa ambang minimumnya (
check-coverage), composer audit --lockeduntuk dependency audit.
Setiap PR ke repository Shield diharapkan lulus test, analyse, dan
format-test seperti di atas.
Powered by PT Ganadev Multi Solusi