Sebagai seorang backend developer, menangani proses upload file kelihatannya sepele, cukup cek MIME type dan pastikan ekstensinya .jpg atau .png, lalu simpan ke storage.
Namun di balik kesederhanaannya, ada lubang keamanan besar yang sering diabaikan: MIME type bisa menipu.
Table of Contents
Ketika MIME Type Tidak Bisa Dipercaya
MIME type (seperti image/png atau image/jpeg) biasanya digunakan untuk mengenali jenis file.
Sayangnya, nilai ini bisa dimanipulasi dengan sangat mudah, karena browser atau request client hanya membaca informasi berdasarkan ekstensi file, bukan isi file sebenarnya.
mv shell.php shell.pngFile di atas akan terdeteksi sebagai image/png, padahal isinya script PHP yang bisa dijalankan jika disimpan di server tanpa proteksi tambahan.
Serangan seperti ini dikenal sebagai MIME spoofing, dan bisa membuka jalan bagi exploit seperti:
- Penyisipan file berbahaya ke server (misalnya
.php,.jsp,.exe) - Crash library image processing
- Distribusi malware lewat cloud storage
Apa Itu File Signature?
Berbeda dari MIME type, File Signature (atau Magic Number) adalah pola byte khusus di awal file yang menandakan jenis file sebenarnya.
Pola ini sulit dimanipulasi tanpa merusak isi file.
Contoh beberapa signature umum:
| Format | Signature (Hex) | Deskripsi |
|---|---|---|
| PNG | 89 50 4E 47 | Awal file PNG |
| JPEG | FF D8 FF E0 / E1 / E2 | Awal file JPEG |
| GIF | 47 49 46 38 | Awal file GIF |
| 25 50 44 46 | Awal file PDF |
Dengan memeriksa byte pertama file, kita bisa memastikan apakah file tersebut benar-benar gambar, atau hanya menyamar jadi gambar. Untuk informasi lebih lanjut mengenai berbagai File Signatures, kamu bisa merujuk ke Wikipedia: List of File Signatures.
const blob = files[0];
const reader = new FileReader();
reader.onloadend = (e) => {
const arr = new Uint8Array(e.target.result).subarray(0, 4);
const header = Array.from(arr, byte => byte.toString(16)).join('');
let type = 'unknown';
switch (header) {
case '89504e47':
type = 'image/png';
break;
case 'ffd8ffe0':
case 'ffd8ffe1':
case 'ffd8ffe2':
type = 'image/jpeg';
break;
}
console.log('Detected file type:', type);
};
reader.readAsArrayBuffer(blob);Dengan pendekatan ini, kita tidak hanya percaya pada ekstensi file atau MIME type, tetapi benar-benar memverifikasi isi file. Jika kamu ingin mempelajari lebih lanjut tentang penggunaan Blob API untuk membaca file di JavaScript, kamu bisa melihat dokumentasinya di MDN Blob API.
Bahaya Jika File Manipulatif Tersimpan di Cloud
Ketika file berbahaya berhasil melewati validasi dan tersimpan di cloud storage (misalnya AWS S3, Firebase, atau Google Cloud Storage), dampaknya bisa fatal:
- Remote Code Execution (RCE)
File berisi script (misal PHP) bisa dieksekusi jika bucket atau folder publik tidak dilindungi dengan benar. - Penyebaran Malware
Storage kamu bisa dijadikan tempat distribusi malware yang disamarkan sebagai gambar. - Crash Library Image Processing
File palsu bisa membuat library sepertisharpatauimagemagickrusak saat membaca file. - XSS dan Data Leakage
File berisi script berbahaya dapat menjalankan serangan Cross-Site Scripting jika diakses lewat domain kamu. - Reputasi Domain Terancam
Cloud provider bisa memblokir bucket atau domain kamu jika dianggap menyebar konten berbahaya.
Best Practice Validasi File Upload
Sebagai backend developer, berikut langkah-langkah yang bisa kamu terapkan agar sistem upload lebih aman:
- Periksa File Signature (Magic Number)
Cocokkan minimal 4 byte pertama file dengan signature resmi. - Gunakan Library Aman
- Node.js:
file-type
- Node.js:
- Pisahkan Folder Upload Publik dan Private
Jangan simpan file upload langsung di folder yang bisa diakses browser. - Gunakan Signed URL untuk Akses File
Di cloud storage, gunakan URL sementara agar file tidak bisa diakses sembarangan. - Batasi Ukuran dan Jenis File
Hanya izinkan format tertentu seperti.jpg,.png,.webp, dan batasi ukuran maksimal (misalnya 5 MB). - Scan File Sebelum Simpan
Gunakan antivirus atau API scanning seperti ClamAV atau VirusTotal.
Kesimpulan
Validasi file upload bukan hanya tentang MIME type. MIME type bisa dengan mudah dimanipulasi, tapi File Signature tidak bisa berbohong.
Dengan memeriksa isi byte pertama file, bukan hanya label yang diklaim browser, kamu memperkuat pertahanan backend dari serangan file berbahaya dan langkah kecil ini bisa menyelamatkan server, storage, bahkan reputasi sistemmu.

