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
- Tulis tujuan dan acceptance criteria.
- Buat perubahan kecil yang dapat ditinjau.
- 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 candidateMIME 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
- Jalankan contoh dengan input normal.
- Ulangi dengan input kosong, tipe salah, dan nilai batas.
- Pastikan error tidak membocorkan secret atau detail internal.
Latihan
- Modifikasi contoh dengan satu kebutuhan baru dan tulis acceptance criteria-nya.
- 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.