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
- Cek
$file["error"]dulu, jangan asumsi sukses. - Batasi ukuran agar server tidak penuh.
- Batasi ekstensi/MIME (pakai
finfountuk cek MIME asli kalau mau serius). - Rename file dengan nama acak, jangan pakai nama asli user.
- Simpan di folder khusus (
uploads/), idealnya di luar document root atau tanpa eksekusi PHP. - Pakai
move_uploaded_file(), bukancopy(), 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.phpberkedok gambar lalu mengeksekusinya lewat URL kalau folder upload bisa diakses langsung. Inilah alasan validasi ekstensi + rename + folder terpisah itu wajib, bukan opsional.