Conversation
|
🔄 AI PR Review sedang antri di server...
|
Code Review: Theme Upload Security Hardening (dev-1555 vs dev)OverviewBranch ini menambahkan security hardening pada upload tema: pembatasan route super-admin, scanning konten ZIP sebelum ekstraksi, validasi BUG —
|
| Komponen | Sebelum | Sesudah |
|---|---|---|
| ThemesController | 430 lines | ~80 lines |
| ThemeService | 0 | ~150 lines |
| ThemeHooksValidator | 0 | ~120 lines |
| CacheService (existing) | - | reuse |
Total pemisahan: ~350 baris keluar dari controller.
untuk memisahkan ke ThemeHooksValidator + ThemeService + menggunakan CacheService. Ini bersifat opsional dan bisa dikerjakan sebagai PR terpisah jika diperlukan atau jika ingin sekalian dikerjakan di PR ini? |
sekalian saja, agar controllernya tidak terlalu gemuk. Karena PR ini perubahan pada controller tersebut |
…yanan terpisah Commit ini memindahkan logika bisnis manajemen tema ke ThemeService, validasi keamanan ke ThemeHooksValidator, dan menggunakan CacheService untuk pengelolaan cache agar controller lebih bersih dan terstruktur.
sudah, silahkan di cek mas. |
|
OK |
issue #1555
📋 Ringkasan
Fitur upload tema memiliki celah keamanan kritis yang memungkinkan penyerang mengeksekusi kode PHP sewenang-wenang di server. Penyerang yang memiliki akses ke halaman upload tema dapat mengunggah file ZIP berisi
hooks.phpberbahaya yang otomatis dieksekusi melaluiinclude_oncesetelah ekstraksi.Attack Chain (Sebelum Fix)
🛡️ Remediasi — 4 Lapis Pertahanan
Phase 1: Hapus Auto-Eksekusi
loadThemeHooks()dariupload()File:
app/Http/Controllers/BackEnd/ThemesController.phpBaris
$this->loadThemeHooks($composerData['name'])dihapus dari methodupload(). Hooks hanya dimuat saat tema diaktifkan secara eksplisit melaluiactivate(), bukan otomatis saat upload.Phase 2: Pemindaian Konten ZIP Sebelum Ekstraksi
Method baru:
scanZipForPhp(\ZipArchive $zip): voidextractTo()dipanggilphp,phtml,php3,php4,php5,pht,inc,pharRuntimeExceptionjika file berbahaya terdeteksiLog::critical)Phase 3: Validasi Sumber
hooks.phpBerbasis TokenMethod baru:
validateHooksSource(string $source, string $themeName): arrayloadThemeHooks()kini memvalidasi isi filehooks.phpmenggunakantoken_get_all()sebeluminclude_once. Deteksi meliputi:system(),exec(),shell_exec(),passthru(),popen(),proc_open()eval(),assert(),create_function()file_put_contents(),file_get_contents(),fopen(),unlink(), dll.ini_set(),putenv(),header(),setcookie()base64_decode(),urldecode()T_EVALtoken langsung terdeteksiFungsi deklarasi (
function nama()) tetap diizinkan — hanya pemanggilan fungsi (nama(...)) yang diperiksa.Phase 4: Isolasi Route Upload ke
super-adminSajaFile:
routes/web.phpRoute
setting.themes.uploaddipisahkan dari grup tema umum dan diberi middlewarerole:super-admin:🧪 Test Coverage — 16/16 Passing
Unit Tests:
tests/Unit/ThemesControllerSecurityTest.php(11 tests)scanZipForPhp()— 3 tests:.php→RuntimeExceptiontheme.json+style.css) → lolosRuntimeExceptionvalidateHooksSource()— 8 tests:system(),exec(),eval(),file_put_contents(),shell_exec()Feature Tests:
tests/Feature/Security/ThemeUploadSecurityTest.php(5 tests)hooks.php→ error responsepassthru) → 500 error📊 Ringkasan Perubahan
app/Http/Controllers/BackEnd/ThemesController.phproutes/web.phprole:super-admintests/Unit/ThemesControllerSecurityTest.phpscanZipForPhp&validateHooksSourcetests/Feature/Security/ThemeUploadSecurityTest.php🚀 Cara Menjalankan Test
loadThemeHooks()tidak lagi dipanggil otomatis setelah upload — hanya saatactivate(). Ini perubahan perilaku yang disengaja.super-admin. Administrator-website tidak lagi dapat mengunggah tema.hooks.phpyang menggunakan fungsi apa pun dalam daftarDANGEROUS_FUNCTIONSakan ditolak saat aktivasi tema.