Lewati ke konten

CodeIgniter 4 Shieldv1.2.x

Testing & CI

Semua keputusan Shield diuji lewat dua jalur aman:

  1. Mode observe — Shield mencatat apa yang akan dilakukannya, tanpa memblokir siapa pun. Pemasangan pertama sebaiknya selalu memakai mode ini.
  2. shield:replay — menjalankan korpus request lewat rule bawaan Shield, tanpa request sungguhan.

Biarkan shield.mode = observe selama 1–3 hari, lalu jalankan:

Terminal window
php spark shield:report

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

Gunakan demo app yang ada di dalam package untuk mencoba Shield secara langsung:

Terminal window
cd vendor/ganadev/codeigniter4-shield/examples/codeigniter4-demo
composer install
php spark migrate --all
php spark serve

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

Package ini diuji dengan Pest, PHPStan untuk static analysis, dan Pint untuk format kode. Dari folder package:

Terminal window
composer test # menjalankan seluruh suite Pest
composer analyse # PHPStan level 0
composer format-test # Pint: verifikasi format

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:

Terminal window
php -d xdebug.mode=coverage vendor/bin/pest --coverage --coverage-text=build/coverage-ci4.txt
php tools/check-coverage.php build/coverage-ci4.txt 50

Ambang minimum paket ini adalah 50%; build CI terakhir mencatat line coverage 91,83%. Pipeline menolak hasil yang turun di bawah ambang.

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.

Terminal window
php spark shield:replay corpus.json --min-rate=0.98

Format 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 uri dan method yang dibaca; body, header, dan host diabaikan.
  • Setiap entri memakai penghitung perilaku baru, jadi urutan request dalam satu skenario tidak direplay sebagai satu sesi.
  • Fixture fixtures/scanner-corpus.json memakai skema scenarios, bukan entries; konversi dulu sebelum dipakai.

Pipeline CI sederhana:

Terminal window
php spark shield:replay corpus.json || exit 1
  • 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.

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 --locked untuk dependency audit.

Setiap PR ke repository Shield diharapkan lulus test, analyse, dan format-test seperti di atas.

Powered by PT Ganadev Multi Solusi