Lewati ke konten utama
menjadi.dev
Chapter 40.5 Data & Storage Lanjutan

Security: Virus Scanning, Type Validation & Access Control

Melindungi aplikasi dari file upload berbahaya — jangan percaya input user

Tujuan Pembelajaran

  • Mampu mengimplementasikan file type validation (bukan cuma ekstensi!)
  • Mampu mengintegrasikan virus scanning dalam upload pipeline
  • Mampu mendesain access control untuk served files (private vs public)

Analogi

Diagram

      File Upload Security = Pemeriksaan di Bandara:

1. Type validation = Cek tiket + paspor
→ Ekstensi .jpg tapi isinya executable? → TOLAK

2. Virus scanning = X-ray bagasi
→ File terlihat normal tapi mengandung malware? → TOLAK

3. Access control = Hanya penumpang bertiket yang boleh ke gate
→ User lain tidak boleh akses file privat user A

4. Storage isolation = Bagasi di kompartemen terpisah dari kokpit
→ Uploaded files tidak boleh di-execute oleh server
    

File upload security seperti pemeriksaan bandara — type validation, virus scanning, access control, dan storage isolation.

Penjelasan Konsep

File upload adalah vector serangan yang sering diremehkan. User bisa upload: executable yang menyamar sebagai gambar, file dengan virus, atau file yang mengeksploitasi vulnerability.

Type validation: (1) Ekstensi — PALING LEMAH. Bisa di-rename. (2) MIME type dari Content-Type header — bisa dimanipulasi client. (3) Magic bytes/file signature — baca byte pertama file. JPEG selalu mulai dengan FF D8 FF. Ini reliable. (4) Content validation — untuk gambar, coba parse dengan sharp. Kalau gagal, file corrupt atau bukan gambar.

Virus scanning: Gunakan ClamAV (open-source) atau Cloud AV APIs. Integrasi: (1) Upload file → simpan sementara di quarantine. (2) Scan dengan ClamAV. (3) Clean → pindahkan ke production storage. (4) Infected → delete, log, notifikasi.

Access control: (1) Public files (foto profil) → serve via CDN. (2) Private files (dokumen user) → serve via server API dengan authentication check. JANGAN serve private files via public CDN URL. (3) Gunakan signed URLs untuk akses temporary. (4) Implement rate limiting untuk mencegah download abuse.

Storage security: (1) Object storage bucket jangan public-readable. (2) Gunakan server-side encryption (SSE-S3). (3) Enable bucket versioning untuk recovery. (4) Setup CORS policy ketat.

Inti yang Perlu Dipahami

Bagian ini berfokus pada mampu mengimplementasikan file type validation (bukan cuma ekstensi!)., mampu mengintegrasikan virus scanning dalam upload pipeline., dan mampu mendesain access control untuk served files (private vs public). Jangan terburu-buru menghafal istilahnya. Lebih penting untuk memahami peran setiap konsep dan kapan konsep itu muncul dalam pekerjaan web development.

Saat membaca Security, gunakan tujuan belajar sebagai penanda arah. Kalau kamu sudah bisa menjelaskan tujuan itu dengan kata-katamu sendiri, berarti fondasinya mulai terbentuk.

Cara Membayangkannya

File upload security seperti pemeriksaan bandara — type validation, virus scanning, access control, dan storage isolation. Analogi ini dipakai supaya konsep teknis tidak terasa melayang. Hubungkan setiap istilah dengan perannya: siapa yang meminta, siapa yang memproses, data apa yang berpindah, dan hasil apa yang diharapkan.

Kalau analoginya sudah terasa masuk akal, barulah lihat istilah teknisnya. Cara ini membuat materi lebih mudah dipahami daripada langsung menghafal definisi.

Saat Melihat Contoh Kode

Contoh kode pada chapter ini memakai bahasa typescript. Bacalah contoh kode sebagai ilustrasi alur, bukan sebagai bagian yang harus langsung dihafal.

Perhatikan nama fungsi, urutan langkah, dan data yang berpindah. Biasanya tiga hal itu sudah cukup untuk memahami hubungan antara teori dan praktik.

Konteks dalam Perjalanan Belajar

Setiap konsep di platform ini dipilih karena dipakai di industri. Fokus pada pemahaman, bukan hafalan.

Kamu sudah di bagian lanjutan. Mulai pikirkan bagaimana konsep ini dipakai di dunia kerja — bukan hanya untuk belajar, tapi untuk membangun produk nyata.

Gunakan pertanyaan reflektif dan prompt AI di akhir chapter sebagai latihan aktif. Membaca saja tidak cukup — kamu perlu menjelaskan ulang dengan kata-katamu sendiri.

Contoh Kode

typescript
// File type validation dengan magic bytes
const FILE_SIGNATURES: Record<string, string[]> = {
  'image/jpeg': ['ffd8ff'],
  'image/png': ['89504e47'],
  'image/webp': ['52494646'],
  'application/pdf': ['25504446'],
};

async function validateFileType(buffer: Buffer, declaredType: string): Promise<boolean> {
  const header = buffer.subarray(0, 4).toString('hex');
  const validSignatures = FILE_SIGNATURES[declaredType];
  
  if (!validSignatures) return false;
  
  const matches = validSignatures.some(sig => header.startsWith(sig));
  
  // Additional: try to parse as image
  if (declaredType.startsWith('image/')) {
    try {
      const metadata = await sharp(buffer).metadata();
      if (!metadata.width) return false;
    } catch {
      return false; // Not a valid image
    }
  }
  
  return matches;
}

Prompt AI

Implementasi secure file upload pipeline: magic byte validation, file size limits, virus scanning (ClamAV mock), dan private file serving dengan signed URLs.

Pertanyaan Reflektif

Coba upload file .exe yang direname jadi .jpg ke aplikasi-mu. Apakah diterima? Kalau iya, aplikasi-mu vulnerable.