uploadfilekeamananMenengah4 mnt baca

Upload File

Menerima file dari pengunjung: form multipart, $_FILES, dan validasi keamanan yang wajib.

Form upload

Form upload wajib memakai enctype="multipart/form-data", kalau tidak file tidak akan terkirim:

html
<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="foto" accept="image/*">
  <button type="submit">Upload</button>
</form>

Menangani di PHP

php
<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $file = $_FILES["foto"];

    if ($file["error"] !== UPLOAD_ERR_OK) {
        die("Upload gagal, kode error: " . $file["error"]);
    }

    // Validasi ukuran (maks 2MB)
    if ($file["size"] > 2 * 1024 * 1024) {
        die("File terlalu besar, maksimal 2MB.");
    }

    // Validasi ekstensi
    $ext = strtolower(pathinfo($file["name"], PATHINFO_EXTENSION));
    $boleh = ["jpg", "jpeg", "png", "webp"];
    if (!in_array($ext, $boleh, true)) {
        die("Hanya file gambar yang diizinkan.");
    }

    // Nama acak agar tidak bentrok dan tidak bisa ditebak
    $namaBaru = bin2hex(random_bytes(16)) . "." . $ext;
    $tujuan = __DIR__ . "/uploads/" . $namaBaru;

    if (move_uploaded_file($file["tmp_name"], $tujuan)) {
        echo "Upload berhasil: " . htmlspecialchars($namaBaru);
    } else {
        echo "Gagal memindahkan file.";
    }
}

Checklist keamanan upload

  1. Cek $file["error"] dulu, jangan asumsi sukses.
  2. Batasi ukuran agar server tidak penuh.
  3. Batasi ekstensi/MIME (pakai finfo untuk cek MIME asli kalau mau serius).
  4. Rename file dengan nama acak, jangan pakai nama asli user.
  5. Simpan di folder khusus (uploads/), idealnya di luar document root atau tanpa eksekusi PHP.
  6. Pakai move_uploaded_file(), bukan copy(), karena fungsi ini memastikan file memang hasil upload HTTP.

Catatan teknis: Jangan pernah percaya $_FILES["foto"]["type"] karena nilainya dikirim browser dan gampang dipalsukan. Penyerang bisa mengunggah file .php berkedok gambar lalu mengeksekusinya lewat URL kalau folder upload bisa diakses langsung. Inilah alasan validasi ekstensi + rename + folder terpisah itu wajib, bukan opsional.