Di Balik MIME Type yang Menipu: Peran File Signature dalam Keamanan Upload

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.

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.

APLIKASI ABSENSI ONLINE

mv shell.php shell.png

File 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:

FormatSignature (Hex)Deskripsi
PNG89 50 4E 47Awal file PNG
JPEGFF D8 FF E0 / E1 / E2Awal file JPEG
GIF47 49 46 38Awal file GIF
PDF25 50 44 46Awal 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:

  1. Remote Code Execution (RCE)
    File berisi script (misal PHP) bisa dieksekusi jika bucket atau folder publik tidak dilindungi dengan benar.
  2. Penyebaran Malware
    Storage kamu bisa dijadikan tempat distribusi malware yang disamarkan sebagai gambar.
  3. Crash Library Image Processing
    File palsu bisa membuat library seperti sharp atau imagemagick rusak saat membaca file.
  4. XSS dan Data Leakage
    File berisi script berbahaya dapat menjalankan serangan Cross-Site Scripting jika diakses lewat domain kamu.
  5. 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:

  1. Periksa File Signature (Magic Number)
    Cocokkan minimal 4 byte pertama file dengan signature resmi.
  2. Gunakan Library Aman
  3. Pisahkan Folder Upload Publik dan Private
    Jangan simpan file upload langsung di folder yang bisa diakses browser.
  4. Gunakan Signed URL untuk Akses File
    Di cloud storage, gunakan URL sementara agar file tidak bisa diakses sembarangan.
  5. Batasi Ukuran dan Jenis File
    Hanya izinkan format tertentu seperti .jpg, .png, .webp, dan batasi ukuran maksimal (misalnya 5 MB).
  6. 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.

Mohammad Dandy Putra
Mohammad Dandy Putra

https://www.logique.co.id/blog/author/mohammad-dandy-putra/

Software Developer dengan pengalaman lebih dari 4 tahun di pengembangan perangkat lunak. Terampil membangun RESTful API menggunakan Go (Fiber, Gin), TypeScript (NestJS), dan PHP (Laravel), serta mengembangkan frontend responsif dengan Next.js dan Tailwind CSS. Berpengalaman dalam arsitektur microservices, deployment berbasis Docker & Kubernetes, serta aktif terlibat dalam proyek Research & Development (R&D) di lingkungan perusahaan maupun akademik.

Scroll to top