SSRF, path traversal, dan upload file — Vibe Coding dan Security: Dari Prompt ke Aplikasi Aman

MATERI 15 DARI 28

SSRF, path traversal, dan upload file

Lindungi fitur fetch URL, akses file, dan upload dari input yang dapat mengarahkan server ke resource berbahaya.

Tujuan pembelajaran

  • Membatasi host/protokol outbound.
  • Menormalkan dan membatasi path.
  • Memvalidasi upload dengan MIME dan nama server-generated.

Konsep utama

SSRF

Server dipaksa mengakses internal network atau metadata endpoint.

Path traversal

Input seperti `../` mencoba keluar dari direktori yang diizinkan.

Upload safety

Nama file client dan extension tidak dapat dipercaya.

Alur kerja teknis

  1. Tulis tujuan dan acceptance criteria.
  2. Buat perubahan kecil yang dapat ditinjau.
  3. Jalankan test dan baca diff sebelum menerima hasil AI.

Contoh implementasi

Path aman di bawah root

from pathlib import Path

ROOT = Path("/srv/app/uploads").resolve()
def safe_path(name: str) -> Path:
    candidate = (ROOT / name).resolve()
    if ROOT not in candidate.parents:
        raise ValueError("Path tidak diizinkan")
    return candidate

MIME upload allowlist

$mime = (new finfo(FILEINFO_MIME_TYPE))->file($_FILES['file']['tmp_name']);
$allowed = ['image/jpeg' => 'jpg', 'image/png' => 'png'];
if (!isset($allowed[$mime])) throw new InvalidArgumentException('Tipe file ditolak');
$filename = bin2hex(random_bytes(16)).'.'.$allowed[$mime];

Aspek keamanan

  • Blok eksekusi script di direktori upload.
  • Jangan follow redirect outbound tanpa validasi ulang host/IP.
  • Batasi ukuran, dimensi, timeout, dan jumlah file.

Kesalahan umum

  • Menerima kode AI tanpa membaca diff dan memahami alur data.
  • Menguji hanya happy path dan mengabaikan input salah atau batas nilai.
  • Menyimpan secret, token, atau data nyata di prompt dan source code.

Pengujian dan verifikasi

  1. Jalankan contoh dengan input normal.
  2. Ulangi dengan input kosong, tipe salah, dan nilai batas.
  3. Pastikan error tidak membocorkan secret atau detail internal.

Latihan

  1. Modifikasi contoh dengan satu kebutuhan baru dan tulis acceptance criteria-nya.
  2. Tambahkan satu negative test lalu jelaskan risiko yang dicegah.

Checklist

  • Tujuan dan batas pekerjaan jelas.
  • Input divalidasi di server.
  • Secret tidak berada di source/prompt.
  • Test lulus dan diff sudah dibaca.

Rangkuman

Lindungi fitur fetch URL, akses file, dan upload dari input yang dapat mengarahkan server ke resource berbahaya.