File & Directory Browser adalah script PHP tunggal (single-file PHP script) yang aman, responsif, dan sangat ringan untuk menampilkan daftar file serta direktori. Dilengkapi dengan fitur pengurutan instan, pencarian real-time tanpa reload halaman, verifikasi hash file (CRC32, MD5, SHA-1) menggunakan sistem cache lokal, perlindungan ketat dari eksploitasi path traversal, proteksi folder berbasis password dengan bcrypt hashing, serta antarmuka modern bertema glassmorphic berbasis Bootstrap 5 dan Font Awesome 6.
File & Directory Browser is a security-hardened, highly responsive, and lightweight single-file PHP script designed to display file and directory lists. It features real-time search without reloading, instant sorting, file hash verification (CRC32, MD5, SHA-1) with a local caching mechanism, strict protection against path traversal attacks, bcrypt-secured password-protected folders, and a premium glassmorphic user interface built using Bootstrap 5 and Font Awesome 6.
HttpOnly, SameSite=Strict, dan Secure flag..cache otomatis menggunakan file .htaccess berisi larangan akses publik.password_hash / password_verify) โ password tidak pernah disimpan plaintext.random_bytes(32).HttpOnly, SameSite=Strict, and Secure attributes..cache directory featuring auto-generated .htaccess public denial access.password_hash / password_verify) โ passwords are never stored in plaintext.random_bytes(32) tokens.| Layanan / Requirement | Versi Minimum / Minimum Version |
|---|---|
| PHP | 8.0 atau lebih baru / or newer |
| PHP Extensions | session, hash, json, pcre, spl |
| Web Server | Apache (direkomendasikan / recommended), Nginx, Lighttpd, dll |
Buka file index.php untuk menyesuaikan setelan variabel berikut di bagian paling atas:
$browseDirectories = true; // Mengizinkan penelusuran sub-direktori
$title = 'Index of '; // Format judul halaman utama
$subtitle = ' files'; // Format sub-judul halaman
$showDirectories = true; // Menampilkan direktori
$showDirectoriesFirst = true; // Mengurutkan direktori di posisi atas
$showHiddenFiles = false; // Menyembunyikan/menampilkan file dot (.)
$dateFormat = 'd-M-Y H:i'; // Format tanggal modifikasi file
$allowExternalSymlinks = false; // Mengizinkan symlink ke luar root
$enableHashCache = true; // Mengaktifkan penyimpanan cache hash file
$passwordSessionLifetime = 2400; // Durasi sesi login folder (detik)
// Generate bcrypt hash terlebih dahulu:
// php -r "echo password_hash('password_anda', PASSWORD_BCRYPT);"
$protectedFolders = [
'nama-folder' => '$2y$12$hashBcryptAnda...',
];
โ ๏ธ PENTING: Jangan pernah menyimpan password plaintext. Selalu gunakan hasil
password_hash().
foreach($requiredExtensions) sebelumnya ditempatkan di dalam blok if (version_compare()) setelah exit(), sehingga seluruh pemeriksaan ekstensi tidak pernah dieksekusi akibat brace yang salah posisi.foreach($requiredExtensions) was placed inside the version_compare() if-block after exit(), causing all extension checks to never execute due to a misplaced closing brace.e() escaping pada $lockedFolder di hidden input dan seluruh atribut HTML renderPasswordPage() untuk mencegah Reflected XSS melalui nama folder.e() escaping on $lockedFolder in the renderPasswordPage() hidden input and all HTML attributes to prevent Reflected XSS via folder name.queryUrl() Empty String:
queryUrl() kini mengembalikan '' (string kosong) alih-alih '?' saat parameter kosong, mencegah URL yang tidak valid pada link sortir dan breadcrumb.queryUrl() now returns '' (empty string) instead of '?' when params are empty, preventing malformed URLs in sort links and breadcrumbs.calculateHashes() fread Error:
calculateHashes() kini melakukan pengecekan fread() === false secara benar sebelum memanggil hash_update(), mencegah komputasi hash pada pembacaan file yang gagal.calculateHashes() now correctly short-circuits on fread() === false before calling hash_update(), preventing hash computation on failed reads.isValidHashData() Hex Length Validation:
isValidHashData() kini memvalidasi panjang hex string secara ketat per algoritma (crc32=8, md5=32, sha1=40) untuk menolak entri cache yang korup atau dipalsukan.isValidHashData() now strictly validates hex string length per algorithm (crc32=8, md5=32, sha1=40) to reject corrupt or spoofed cache entries.ensureCacheDir() Path Sanitization:
ensureCacheDir() kini membersihkan $hashCacheVersion sebelum menggunakannya sebagai komponen path filesystem untuk mencegah path injection.ensureCacheDir() now sanitizes $hashCacheVersion before using it as a filesystem path component to prevent path injection.@ suppression berlebihan pada fungsi I/O file (file_put_contents, rename, unlink, chmod, fopen) dan menggantinya dengan pemeriksaan nilai kembalian secara eksplisit.@ error suppression on file I/O functions (file_put_contents, rename, unlink, chmod, fopen) and replaced with explicit return-value checks.getFirstLockedFolder():
unlocked_folders yang kedaluwarsa di dalam getFirstLockedFolder() untuk mencegah membengkaknya data sesi secara tak terbatas.unlocked_folders session entries inside getFirstLockedFolder() to prevent unbounded session bloat over time.Content-Type Header:
Content-Type: text/html; charset=UTF-8 secara eksplisit di sendSecurityHeaders() untuk menghilangkan ketergantungan pada deteksi charset browser.Content-Type: text/html; charset=UTF-8 header in sendSecurityHeaders() to remove reliance on browser charset sniffing.(int) pada output $lockTimeRemaining di HTML untuk keamanan strict_types dan rendering bilangan bulat yang bersih.(int) cast on $lockTimeRemaining output in HTML for strict_types safety and clean integer rendering.style inline pada container halaman hash yang melanggar kebijakan CSP ketat.style attribute on the hash page container that violated the strict CSP policy.onsubmit inline pada form pencarian untuk kepatuhan penuh CSP script-src tanpa 'unsafe-inline'.onsubmit handler from the search form to achieve full CSP script-src compliance.session_regenerate_id(true) setelah verifikasi password folder berhasil untuk mencegah session fixation.session_regenerate_id(true) after successful folder password verification to prevent session fixation.X-XSS-Protection: 0 Header:
X-XSS-Protection: 0 untuk menonaktifkan XSS auditor browser lama (mencegah false positive).X-XSS-Protection: 0 header to disable the legacy browser XSS auditor and prevent false positives.isHiddenName() Static Cache:
strtolower di isHiddenName() menggunakan variabel static untuk menghindari pemanggilan array_map berulang.strtolower mapping in isHiddenName() using a static variable to avoid repeated array_map calls.humanizeFilesize() Loop Optimization:
humanizeFilesize().humanizeFilesize().ob_end_flush() Safety Check:
ob_end_flush dengan pemeriksaan ob_get_level() untuk keamanan.ob_end_flush shutdown handler with an ob_get_level() safety check.intdiv() untuk tampilan waktu penguncian guna mencegah keluaran float pada pesan yang terlihat pengguna.intdiv() for lock time display to prevent float output in user-facing messages.fa-folder-open) pada navigasi breadcrumb, sekaligus mempertahankan ikon folder tertutup standar pada tampilan daftar untuk konsistensi visual.fa-folder-open) in breadcrumb navigation while retaining standard closed folder icons in the file list view for visual consistency.%2F (slash ter-encode) yang sebelumnya menyebabkan spinner loader tidak berhenti.%2F) which previously caused the spinner loader to get stuck indefinitely.$loginMaxAttempts = 5) dan durasi penguncian login ($loginLockSeconds = 300) untuk proteksi folder dengan tampilan hitung mundur (countdown) secara real-time.if bersarang yang redundan.ob_end_flush() dari bagian akhir skrip ke register_shutdown_function() terpusat agar buffer selalu dibilas secara otomatis dan aman saat skrip berakhir.$loginMaxAttempts = 5) and temporary lockout timers ($loginLockSeconds = 300) with real-time countdown display.if statements to resolve code analyzer warnings.ob_end_flush() to a centralized register_shutdown_function() to ensure proper output buffer cleaning upon termination.h2 menggunakan var(--text-primary) dan .text-muted/.text-secondary agar kontras dan terbaca jelas.h2 heading color via var(--text-primary) and updating .text-muted/.text-secondary rules to use crisp high-contrast colors.folder menjadi berkas.index.php pada URL serta mengarahkan otomatis (HTTP 301) permintaan lama /index.php?folder=XXX menjadi /?berkas=XXX untuk SEO dan navigasi yang lebih bersih.folder to berkas.index.php path segment from URLs and implemented automatic redirects (HTTP 301) from /index.php?folder=XXX to /?berkas=XXX for cleaner SEO routing.%2F dalam parameter query berkas otomatis diterjemahkan kembali menjadi / (?berkas=folder1/subfolder1), dan mengarahkan otomatis jika diakses dengan format URL-encoded.%2F in query parameters back to slashes to display clean folder paths (e.g. ?berkas=folder1/subfolder1), redirecting requests containing URL-encoded %2F to clean slash representations.© 2009–2026 · All Rights Reserved) guna menghindari kendala rendering simbol di berbagai tipe browser.getFileIconClass(), menghapus 6 sub-fungsi pendukung untuk mempermudah pemeliharaan kode jangka panjang.getFileIconClass(), removing six helper subfunctions to maximize readability and ease of maintenance.style="..." pada elemen HTML (#search-form-container, #fileTable, dan tag <col>) untuk kepatuhan 100% terhadap Content Security Policy (CSP) tanpa 'unsafe-inline'.<noscript> dengan menyematkan nonce-key CSP secara dinamis..cssText di JavaScript menjadi modifikasi properti style individual guna mencegah pemblokiran CSP.style="..." attributes on HTML tags (#search-form-container, #fileTable, and <col> elements) to achieve 100% CSP compliance without relying on 'unsafe-inline'.<noscript> block..cssText manipulation to use individual style property settings instead, avoiding CSP style-src blocks.repo.alsyundawy.com โ tulisan tajam, terang, tidak buram, dan ramah mata.repo.alsyundawy.com โ featuring high readability, crisp text, and zero eye-strain.password_hash(PASSWORD_BCRYPT) / password_verify().=== menjadi password_verify() untuk mencegah timing attack.onclick diblokir oleh Content-Security-Policy โ dipindah ke nonce-tagged script block.array_values() setelah array_filter() untuk menghindari off-by-one pada subfolder dalam.?) dengan animasi hover dan dukungan dark/light mode.array_change_key_case($protectedFolders) ke luar loop foreach pada render tabel โ dari O(n) menjadi O(1).aria-label pada hash fingerprint link dan aria-hidden="true" pada ikon dekoratif.findOriginalFolderKey() untuk mereduksi cognitive complexity pada getFirstLockedFolder().listDirectory, processDirectoryItem, readHashCache) dengan memisahkannya ke helper functions yang modular dan memiliki satu jalur return.secure secara eksplisit.background-clip bersama dengan -webkit-background-clip.<button> untuk menunjang kontrol aksesibilitas via keyboard.realpath yang berat pada symlink.isDisplayableFolder guna mencegah kebocoran direktori tersembunyi.[!IMPORTANT]
๐ฎ๐ฉ Bahasa Indonesia (DocNote)
- Hak Akses Direktori Cache: Pastikan direktori tempat script dijalankan memiliki izin tulis (write permission) agar script dapat membuat direktori
.cacheotomatis. Jika hak akses tidak tersedia, fitur penyimpanan cache hash akan dinonaktifkan demi keselamatan runtime.- Dukungan SSL/HTTPS: Untuk keamanan optimal, jalankan script ini di lingkungan yang didukung HTTPS untuk menjamin enkripsi cookie sesi CSRF dan token transit.
- Pemblokiran File Sensitif: Secara bawaan, script memblokir file berekstensi seperti
.php,.bat,.env,.sql, dan sejenisnya untuk mencegah eksekusi kode berbahaya serta kebocoran informasi kredensial.- Password Folder โ Wajib Hash: Password untuk fitur proteksi folder TIDAK BOLEH disimpan dalam bentuk teks biasa (plaintext). Gunakan selalu hasil dari
password_hash('password_anda', PASSWORD_BCRYPT). Jalankan perintah berikut untuk generate hash:php -r "echo password_hash('password_anda', PASSWORD_BCRYPT);".- CSP & Inline Event Handler: Script ini menggunakan Content-Security-Policy berbasis nonce. Inline
onclick=""attribute pada HTML akan diblokir oleh CSP โ semua event listener harus didaftarkan dalam<script nonce="...">block.๐ฌ๐ง English (DocNote)
- Cache Folder Permissions: Ensure that the directory where the script executes has write permissions so it can spawn the
.cachefolder automatically. If permissions are missing, hash caching will be bypassed gracefully to ensure execution.- HTTPS/SSL Deployment: It is highly recommended to host this script under an SSL/HTTPS enabled domain to guarantee safe transit of session cookies and browser tokens.
- Exclusion of Sensitive Files: By default, critical file formats including
.php,.bat,.env,.sql, and others are locked from being displayed or hashed to prevent unauthorized code execution and credential leakage.- Folder Passwords โ Must Be Hashed: Folder protection passwords MUST NOT be stored as plaintext. Always use the output of
password_hash('your_password', PASSWORD_BCRYPT). Generate a hash with:php -r "echo password_hash('your_password', PASSWORD_BCRYPT);".- CSP & Inline Event Handlers: This script uses a nonce-based Content-Security-Policy. Inline
onclick=""HTML attributes will be blocked by CSP โ all event listeners must be registered inside a<script nonce="...">block.
Anda bebas untuk mengubah, mendistribusikan script ini untuk keperluan anda.
If you find this project helpful and would like to support it, please consider donating via https://www.paypal.me/alsyundawy or https://ko-fi.com/alsyundawy. Thank you for your support!
Jika Anda merasa terbantu dan ingin mendukung proyek ini, pertimbangkan untuk berdonasi melalui https://www.paypal.me/alsyundawy atau https://ko-fi.com/alsyundawy. Terima kasih atas dukungannya!
Jika Anda merasa terbantu dan ingin mendukung proyek ini, pertimbangkan untuk berdonasi melalui QRIS. Terima kasih atas dukungannya!
MIT License โ Copyright ยฉ 2026 HARRY DS ALSYUNDAWY โ ALSYUNDAWY IT SOLUTION
Note: Please retain credit to the original author (HARRY DS ALSYUNDAWY โ ALSYUNDAWY IT SOLUTION) if you use or modify this script. Attribution is appreciated but not legally required under the MIT License.