Validasi File Upload di PHP

Validasi file upload sangat penting dilakukan karena adanya fitur mengunggah file ke web server adalah kegiatan yang cukup berbahaya. Ambil contoh pada sebuah web yang mengijinkan user untuk meng-upload foto/gambar bisa jadi dijadikan celah bagi para hacker untuk meletakan script berbahaya pada server.

Berbekal beberapa baris kode PHP kita sudah bisa membuat file upload sederhana. Namun hanya mengandalkan script sederhana tersebut tidak cukup untuk membuat file upload yang bisa diandalkan.

Untuk meminimalkan celah pada fitur file upload, dapat dilakukan dengan cara memverifikasi jenis file yang diupload. Kita tidak boleh mengandalkan informasi dari ekstensi file atau dari nilai $_FILES['berkas']['type'] atau dari mime type karena ketiga informasi tersebut bisa dipalsukan. Lebih baik menggunakan fungsi PHP exif_imagetype() untuk memeriksa signature dari file yang diupload atau fungsi PHP getimagesize() untuk memperoleh ukuran gambar.

$fileType = exif_imagetype($_FILES['myFile']['tmp_name']);
$allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
if (!in_array($fileType, $allowed)) {
  echo "hanya diijinkan untuk meng-upload file gambar (gif, jpg, atau png)";
}

Namun tidak menutup kemungkinan, fungsi PHP di atas juga belum cukup untuk menghentikan hacker yang kelewat kreatif. Jadi perlu ditambahkan juga pemeriksaan ekstensi file, dan ubah paksa file .php menjadi file .jpg sehingga kode php yang mungkin lolos dari pemeriksaan pertama tidak bisa dieksekusi di server.

<form action="" method="post" enctype="multipart/form-data">
 <input type="file" name="myFile"/>
 <input type="submit" value="Upload"/>
</form>

<?php
define("UPLOAD_DIR", "images/");

if (!empty($_FILES['myFile']['name'])) {
	
  // verifikasi file gambar (GIF, JPEG, atau PNG)
  $fileType = exif_imagetype($_FILES['myFile']['tmp_name']);
  $allowed = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG);
  if (!in_array($fileType, $allowed)) {
    echo "hanya diijinkan untuk meng-upload file gambar (gif, jpg, atau png)";
  }
	
  else{
    $myFile = $_FILES['myFile'];


    // ubah paksa nama file yg mengandung selain huruf, angka, ".", "_", dan "-" dengan regex
    $name = preg_replace("/[^A-Z0-9._-]/i", "_", $myFile['name']);

    // periksa ekstensi file
    $parts = pathinfo($name);		
    if (isset($parts['extension'])) {
      $ext = $parts['extension'];
			
      if ($ext !== 'jpg' && $ext !== 'gif' && $ext !== 'png')
        $ext = "jpg";
			
	$name = $parts['filename'] . '.' . $ext;
      }
		
      else { // jika file tidak memiliki ekstensi maka berikan ekstensi .jpg
        $ext = 'jpg';
	$name = $parts['filename'] . '.jpg';
      }

      // simpan file
      move_uploaded_file($myFile['tmp_name'], UPLOAD_DIR . $name);
  }
}

Sebagai tambahan, mungkin juga perlu untuk membatasi ukuran file yang diupload untuk melindungi website dari serangan yang mencoba mengganggu network traffic atau system load.

Comments

7 responses to “Validasi File Upload di PHP”

  1. annonymouse Avatar
    annonymouse

    bisakah php digunakan untuk melakukan pengenalan citra? jadi fileuploader bisa dilengkapi lengkapi fitur untuk mensensor gambar/menolak gambar yang dianggap mengandung image yang disensor

      1. annonymouse Avatar
        annonymouse

        caranya pake apa ya?

        1. Sibudi Avatar

          kurang tau masalah ini. pengolahan citra digital bukan bidang saya

  2. Al Bahri Avatar

    Mas, imagetype_gif, imagetype_png itu kan buat gambar… kalo misalnya kita hanya ingin file bentuk rar… perintah nya apa ya?

    Terima Kasih

  3. santo Avatar

    Gan Kalo Selain Image (doc,zip,rar) G mana ya validasinya?
    Klo pake mime type sering bobol 😀

  4. andra Avatar
    andra

    mas, tutorialnya sudah saya ikutin dan berhasil. cuma gmn caranya ketika filter upload data di folder berhasil dan di databasenya juga ikut di filter.

Leave a Reply

Your email address will not be published. Required fields are marked *