Fix: Guard installer POST routes agar tidak bisa dijalankan saat aplikasi sudah terinstal - #1697
Conversation
|
🔄 AI PR Review sedang antri di server...
|
apidong
left a comment
There was a problem hiding this comment.
Review Keamanan — Guard Installer POST Routes
Terima kasih atas PR ini. Solusi middleware InstallerCheck yang diterapkan ke seluruh group route install sudah benar dan menyelesaikan akar masalah pada issue wiki-keamanan#50: route POST /install/environment/saveClassic dan /environment/saveWizard yang sebelumnya tanpa guard sudahInstal() kini diblokir setelah aplikasi terinstal.
✅ Yang sudah baik
- Guard dipindah dari 9 method controller ke satu middleware terpusat (DRY & konsisten untuk GET + POST).
- Bonus:
GET /install/environment/classicyang sebelumnya membocorkan isi.env(berisi secret) ikut tertutup. - Tidak ada konflik dengan middleware
installed(KDInstalled) — keduanya komplementer. - Package
rachidlaasri/laravel-installersudah tidak aktif, tidak ada rute installer lama yang lolos dari middleware.
🔴 Temuan HIGH — Test middleware flaky & bergantung environment
tests/Feature/Controllers/Installer/InstallerControllerTest.php:13-23 hanya benar jika file storage/installed ada di environment jalan test. Tidak ada beforeEach yang mengatur file tersebut:
- Pada fresh checkout tanpa
storage/installed,sudahInstal()=false, middleware memanggil$next($request)dan test gagal (mengharapkan 302). - Di CI test baru lolos karena workflow
test.ymlmenjalankantouch storage/installed.
Rekomendasi: buat/hapus file storage/installed di beforeEach, atau mock sudahInstal(), agar test deterministik di semua environment.
🟠 Temuan HIGH — Belum ada test integrasi untuk skenario exploit asli
Tidak ada test yang mensimulasikan eksploitasi sebenarnya: POST /install/environment/saveClassic saat aplikasi sudah terinstal harus menghasilkan redirect dan .env tidak berubah. Test saat ini hanya menguji middleware secara isolasi sehingga regresi di routes/web.php (mis. middleware terlepas dari group) tidak akan tertangkap.
Rekomendasi: tambahkan test seperti:
$this->post(route('installer.environmentSaveClassic'), ['envConfig' => '...'])
->assertRedirect('/');
// lalu pastikan isi .env tidak berubah🟡 Temuan MEDIUM — Scope creep pada migrasi & seeder
Perubahan Schema::drop() → dropIfExists() dan penghapusan kolom id eksplisit pada seeder tidak terkait langsung dengan fix keamanan ini. Perlu dipertimbangkan untuk dipisah ke PR terpisah agar review lebih fokus dan risiko konflik dengan instalasi existing lebih kecil.
Kesimpulan: Implementasi inti layak untuk merge, namun disarankan test diperbaiki/dilengkapi lebih dulu (2 temuan HIGH di atas). Terima kasih!
|
Sengaja dilakukan karena ketika testing gagal proses instalasi awal, jadi sekalian dilakukan perbaikan |
Pull Request: Fix: Guard installer POST routes agar tidak bisa dijalankan saat aplikasi sudah terinstal
Description
Pada installer OpenDK, route POST
/install/environment/saveWizard,/install/environment/saveClassic, dan/install/finalmasih bisa dijalankan meskipun aplikasi sudah terinstal, karena pengecekansudahInstal()tidak diterapkan secara konsisten. PR ini memindahkan guard installer ke middleware terpusat dan menambahkan FormRequest untuk validasi input.Changes
InstallerCheckuntuk memblokir seluruh installer route ketikasudahInstal()bernilai true.installer.checkpada grup route installer diroutes/web.php.sudahInstal()yang berulang di setiap methodInstallerController.EnvironmentWizardSaveRequest,EnvironmentClassicSaveRequest, danPerformInstallationRequest.Schema::drop()menjadiSchema::dropIfExists().Reason for change
.envdan menjalankan migrasi setelah aplikasi terinstal.sudahInstal()yang duplikat di 9 method controller dipindah ke satu middleware.Impact of change
✅ Keamanan: Installer POST route diblokir otomatis setelah instalasi selesai.
✅ Konsistensi: Semua route installer menggunakan guard yang sama.
✅ Kode lebih bersih: Controller fokus ke logic bisnis, bukan validasi dan guard berulang.
✅ Testability: Perilaku installer bisa diuji secara terpisah lewat middleware dan FormRequest.
Related Issue
Steps to Reproduce
Before fix (problem):
storage/installedterbuat./install/environment/saveClassicdengan payload.envbaru..envbisa ditimpa meskipun aplikasi sudah terinstal.After fix (solution):
storage/installedterbuat./install/environment/saveClassicdengan payload.envbaru./karena middlewareinstaller.checkmemblokir request.Testing on related features:
Checklist
Technical Details
Technical Explanation
Route installer sekarang diamankan oleh middleware
InstallerCheckyang dijalankan di grup route dan constructor controller. FormRequest mengambil alih validasi dari$request->validate()agar otomatis dijalankan sebelum method controller dieksekusi.Configuration changes
bootstrap/app.php— ditambahkan alias middleware:routes/web.php— route installer sekarang menggunakan middleware:Dependencies added
No new dependencies.
Testing
Manual Testing
/installsetelah instalasi selesai, harus redirect ke//install/environment/saveClassicsetelah instalasi selesai, harus redirect ke//install/environment/saveWizardsetelah instalasi selesai, harus redirect ke//install/finalsetelah instalasi selesai, harus redirect ke/Automated Testing
InstallerControllerTest— middleware + FormRequest coverageScreenshot / Video
simplescreenrecorder-2026-08-06_06.13.21.mp4
Breaking Changes
None
Migration Guide
Not required
References
Additional notes: Perubahan ini mencegah overwrite
.envdan migrasi ulang setelah aplikasi sudah terinstal. Route installer tetap bisa diakses selamastorage/installedbelum ada.