Endpoint upload API sering menjadi pintu masuk utama untuk payload berbahaya, brute-force terhadap parameter, maupun credential stuffing dari akun yang bocor. Melindungi endpoint upload secara efektif berarti menggabungkan perlindungan pada level metadata, konten, kuota pengguna, dan observability. Dalam artikel ini, Anda akan mendapatkan pendekatan praktis agar API tetap menerima file sah tanpa membuka celah abuse.

Dalam setiap tahap, pastikan prosesnya terukur dan bisa diaudit, karena serangan terhadap upload sering kali terlihat hanya setelah sistem mengalami beban tinggi atau file berbahaya tersebar. Kita mulai dari identifikasi ancaman umum yang menarget endpoint upload.

Identifikasi Ancaman terhadap Endpoint Upload

Beberapa ancaman yang harus ditangani di awal meliputi:

  • Payload berbahaya: File yang tampak biasa tapi menyimpan skrip, macro, atau payload eksploitasi yang bisa merusak backend dan layanan downstream.
  • Brute-force parameter: Penyerang mencoba-coba metadata (nama field, MIME type) untuk menembus filter sederhana.
  • Credential stuffing: Akun pengguna yang diambil dari breach pihak ketiga digunakan untuk mengerek kuota upload/menyebarkan malware.

Memahami ancaman ini membantu menentukan langkah-langkah proteksi berikutnya.

Validasi Metadata dan Konten File

Pertama, pastikan setiap upload melewati lapisan validasi dua sisi: metadata (nama file, ukuran, tipe) dan konten aktual.

Validasi Metadata

Validasi metadata harus mencakup:

  • Jumlah field yang diperbolehkan dan pola penamaan; reject request dengan field tambahan yang tidak dikenali.
  • Panjang nama file dan ekstensi; bandingkan dengan whitelist tipe file yang benar-benar disupport.
  • Ukuran file tidak melebihi limit yang disepakati per tipe pengguna.

Gunakan response dengan header dan kode status yang informatif agar klien dapat menyesuaikan:

HTTP/1.1 400 Bad Request
Content-Type: application/json
X-Upload-Error: invalid-metadata

{"message":"Field 'filename' tidak sesuai format"}

Header khusus seperti X-Upload-Error membantu tim operasi mengelompokkan jenis error upload.

Validasi Konten

Setelah metadata lolos, periksa isi file menggunakan pendekatan bertahap:

  • Signature/MIME sniffing: Baca byte awal untuk memastikan file benar-benar tipe yang dipakai (misalnya, PDF atau JPEG).
  • Antivirus/Content scanning: Integrasi dengan mesin scanning untuk mendeteksi file berisi skrip atau binary mencurigakan sebelum disimpan.
  • Transformasi ringan: Jika memungkinkan, lakukan konversi/thumbnail di pipeline terisolasi sebelum file masuk storage utama.

Contoh pseudocode validasi:

function validateUpload(request) {
  assert(request.headers['Content-Length'] <= maxQuota);
  metadata = parseMetadata(request.body);
  assert(metadata.filename.match(/^[a-z0-9\-_]+\.(jpg|png)$/i));
  temp = writeTempFile(request.body.fileStream);
  assert(sniffMime(temp) == 'image/png');
  assert(scanForMalware(temp));
  return temp;
}

Jangan menyimpan file langsung; simpan di temporary storage sampai semua validasi selesai.

Pembatasan Kuota dan Rate Limit per Pengguna

Setiap pengguna harus memiliki batas upload yang logis baik secara kuota total maupun rate limit (per menit/detik).

Model Kuota

Gunakan kombinasi:

  • Kuota harian/bulanan: Batas total byte atau jumlah file per pengguna.
  • Rate limit burst: Jumlah request upload per window waktu pendek (contoh 5 request per 10 detik).

Pustaka rate limit ditambah cache (Redis/memory) sederhana cukup jika opsional. Contoh mekanisme rate limit per user:

function rateLimit(userId) {
  key = "upload:rate:" + userId;
  count = redis.incr(key);
  if (count == 1) redis.expire(key, 10);
  if (count > 5) throw new RateLimitExceeded();
}

Untuk kuota harian, simpan akumulator di database atau Redis dengan reset otomatis:

if (dailyUsage + fileSize > userQuota.daily) {
  return {status: 429, message: "Kuota harian terlampaui"};
}

Sertakan headers meaningful agar klien tahu sisa kuota:

X-Upload-Quota-Remaining: 1048576
X-Upload-RateLimit-Reset: 14

Trade-off

Rate limit agresif mengurangi abuse namun dapat mengganggu user sah di jaringan lambat. Sesuaikan window dan jumlah sesuai profil pengguna.

Isolasi Temporary File dan Rotasi Token Upload

Setelah validasi metadata, file sebaiknya ditulis ke direktori temporary atau layanan terisolasi, tidak langsung ke storage publik.

  • Isolasi sandbox: Gunakan path yang hanya bisa diakses handler verifikasi; hapus file setelah diteruskan atau ditolak.
  • Rotasi token upload: Setiap upload harus menggunakan token sekali pakai (one-time token) yang kadaluarsa dalam hitungan menit. Token ini diterbitkan oleh backend setelah autentikasi dan disimpan di cache untuk verifikasi.

Contoh alur rotasi token:

  1. User meminta token upload dengan autentikasi.
  2. Backend membuat token (misal UUID) dan menyimpannya dengan TTL pendek.
  3. Token dikirim sebagai header X-Upload-Token bersama payload.
  4. Handler upload memverifikasi token, lalu menghapusnya untuk mencegah replay.

Token kadaluarsa mengurangi risiko reuse saat credential bocor.

Deteksi dan Observability Abuse

Proteksi tidak lengkap tanpa observability. Berikut checklist observability dan alert:

  • Log event upload: Catat user ID, ukuran file, tipe, status validasi, dan response code.
  • Histogram latency: Pantau waktu validasi untuk mendeteksi delay akibat scanning intensif.
  • Alert threshold: Trigger alert jika rate limit terpicu 5x normal dalam 1 jam per user atau IP.
  • Monitor kuota mendekati limit: Kirim notifikasi ke user jika kuota harian mendekati habis untuk mengurangi permintaan ulang.
  • Deteksi pola abuse: Gabungkan log rate limit, error 500, dan token invalid untuk mendeteksi credential stuffing atau bot.

Gunakan dashboard sederhana (misal Grafana + Prometheus) untuk menampilkan metrics berikut:

  • Jumlah upload yang gagal karena validasi metadata.
  • Upload rate limit per region/IP.
  • Event token invalid atau sudah kadaluarsa.
  • Kecepatan scanning malware per file.

Jika digunakan sistem alerting, sertakan link ke runbook untuk langkah perbaikan cepat saat threshold tercapai.

Penutup

Melindungi endpoint upload bukan sekadar mencegah satu jenis serangan, melainkan menyusun lapisan-lapisan validasi, kuota, isolasi, dan observability. Terapkan validasi metadata & konten, atur kuota per pengguna dengan header informatif, isolasi temporary file, rotasi token, lalu pantau pola abuse secara aktif. Strategi ini memastikan upload API tetap kuat sekaligus nyaman untuk pengguna sah.