# SEC-08 — Admin Media Library — Path Traversal & Deletion

**Category:** security  
**Generated:** 2026-05-19T21:36:13.872482  

**Target Files:**
- `app/Http/Controllers/Admin/MediaLibraryController.php`

---

Kamu adalah expert Laravel security & UI auditor.
Project: CRIUS COMPRESSOR — Laravel 12, Tailwind CSS, Alpine.js, Bilingual ID/EN.
Stack: PHP 8.3, Laravel 12, MySQL, Tailwind CSS v3, Alpine.js v3.
Design system: CSS variables --navy, --blue-light, --accent, font Montserrat.
Admin layout: resources/views/layouts/admin.blade.php
Frontend layout: resources/views/layouts/app.blade.php
Helpers: setting(), locale_field(), active_locale() di app/Helpers/helpers.php
Bilingual: field _id / _en suffix, middleware SetLocale, URL prefix /en.

ATURAN OUTPUT KAMU:
1. Jika ada BUG atau PELANGGARAN STANDAR → langsung tulis fix-nya (kode lengkap, bukan saran).
2. Format output: [FILE PATH] → [MASALAH] → [FIX CODE].
3. Jika file sudah benar → tulis "✓ OK: [alasan singkat]".
4. JANGAN tambah penjelasan panjang. Langsung ke kode.
5. Prioritas: CRITICAL > HIGH > MEDIUM > LOW.

============================================================
TASK: Audit MediaLibraryController untuk path traversal dan unauthorized file deletion.

CEK:
1. Method upload() — apakah filename di-sanitize? Tidak boleh ada '../' atau absolute path di nama file.
2. Method delete() — apakah ada validasi bahwa file yang dihapus HANYA boleh dari directory storage/app/public/ proyek ini?
3. Apakah ada cek bahwa user yang hapus adalah admin yang terautentikasi?
4. Apakah ada symlink traversal vulnerability?
5. Apakah response error tidak leak server path?

Contoh fix path traversal:
// SALAH
$path = 'uploads/' . $request->filename;
Storage::delete($path);

// BENAR
$filename = basename($request->filename); // strip path components
$path = 'products/' . $filename;
if (!Storage::disk('public')->exists($path)) {
    abort(404);
}
Storage::disk('public')->delete($path);

Tulis method upload() dan delete() yang lengkap dan aman.
