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.

About Sibudi

Ubuntu user | Loves books | Blogger | Web Developer | Learn PHP, JavaScript, Ruby & Python the hard way

14. December 2011 by Sibudi
Categories: PHP | Tags: , , | 7 comments

Comments (7)

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

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

    Terima Kasih

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

  4. 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 to Sibudi Cancel reply

Required fields are marked *