Fitur unggah file adalah salah satu yang paling umum di aplikasi web — untuk foto profil, gambar produk, atau lampiran dokumen. Namun, PHP File Upload juga merupakan salah satu titik yang paling rawan keamanan jika tidak ditangani dengan benar. Panduan ini membahas cara mengunggah file dengan aman.
Membuat Form Upload
Form untuk upload wajib memiliki dua atribut khusus: method="post" dan enctype="multipart/form-data". Tanpa enctype, file tidak akan terkirim:
<form method="post" enctype="multipart/form-data"> <input type="file" name="berkas"> <button type="submit">Unggah</button> </form>
Memahami Superglobal $_FILES
File yang diunggah dapat diakses melalui array $_FILES, yang berisi informasi penting:
<?php $_FILES["berkas"]["name"]; // nama asli file $_FILES["berkas"]["tmp_name"]; // lokasi sementara di server $_FILES["berkas"]["size"]; // ukuran (byte) $_FILES["berkas"]["type"]; // MIME type ?>
Memindahkan File yang Diunggah
File awalnya disimpan di lokasi sementara. Untuk menyimpannya permanen, gunakan move_uploaded_file():
<?php $tujuan = "uploads/" . $_FILES["berkas"]["name"]; move_uploaded_file($_FILES["berkas"]["tmp_name"], $tujuan); ?>
Validasi Keamanan (Langkah Wajib!)
Kode di atas belum aman. Anda harus memvalidasi tipe dan ukuran, serta mengganti nama file agar tidak berbahaya:
<?php
$file = $_FILES["berkas"];
$ext = strtolower(pathinfo($file["name"], PATHINFO_EXTENSION));
$izin = ["jpg", "jpeg", "png", "pdf"];
if (in_array($ext, $izin) && $file["size"] < 2 * 1024 * 1024) {
// nama acak agar tidak menimpa & lebih aman
$namaBaru = uniqid() . "." . $ext;
move_uploaded_file($file["tmp_name"], "uploads/" . $namaBaru);
echo "Berhasil diunggah sebagai $namaBaru";
} else {
echo "File tidak diizinkan atau terlalu besar.";
}
?>
Mengapa langkah ini penting? Tanpa validasi, penyerang bisa mengunggah file .php berbahaya dan menjalankannya di server Anda. Membatasi ekstensi dan mengganti nama file menutup celah ini.
Tips Keamanan Tambahan
- Simpan file di folder yang tidak bisa mengeksekusi PHP.
- Periksa juga MIME type dengan
getimagesize()untuk gambar. - Batasi ukuran maksimum lewat validasi dan pengaturan
upload_max_filesize.
Kesalahan Umum
- Lupa enctype pada form sehingga file tidak terkirim.
- Mempercayai nama file dari pengguna — selalu ganti dengan nama acak yang aman.
Kesimpulan
PHP File Upload mudah diterapkan, tetapi keamanan adalah prioritas. Selalu validasi ekstensi dan ukuran, ganti nama file, dan simpan di lokasi yang aman agar fitur unggah tidak menjadi pintu masuk serangan.
Referensi: untuk penjelasan lebih mendalam, kunjungi dokumentasi resmi PHP (php.net).

