Patch file upload part II
Validasi file upload sangat penting dilakukan karena adanya fitur mengunggah file ke web server adalah kegiatan yang cukup berbahaya. Ambil contoh di sebuah web yang mengijinkan user buat meng-upload foto/gambar bisa jadi dijadikan celah buat para Attacker untuk meletakan script berbahaya pada server.
Berbekal beberapa baris kode PHP kita sudah bisa membuat file upload
sederhana. Tapi cuma mengandalkan script sederhana tersebut gak cukup
untuk membuat file upload yang bisa diandalkan.
Untuk meminimalkan celah di fitur file upload, dapat dilakukan dengan cara memverifikasi jenis file yang diupload. Kita gak 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() buat periksa signature dari file yang diupload atau fungsi PHP getimagesize() untuk memperoleh ukuran gambar.
Semoga Bermanfaat
Untuk meminimalkan celah di fitur file upload, dapat dilakukan dengan cara memverifikasi jenis file yang diupload. Kita gak 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() buat periksa signature dari file yang diupload atau fungsi PHP getimagesize() untuk memperoleh ukuran gambar.
$fileType = exif_imagetype($_FILES['myFile']['tmp_name']);Namun tidak menutup kemungkinan, fungsi PHP di atas juga belum cukup buat menghentikan Attacker yang kelewat kreatif. Jadi perlu ditambahin 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.
$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)";
}
<form action="" method="post" enctype="multipart/form-data">Sebagai tambahan, mungkin juga perlu untuk membatasi ukuran file yang diupload untuk melindungi website dari serangan yang mencoba mengganggu network traffic atau system load.
<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 { // kalo 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);
}
}
Semoga Bermanfaat
Post a Comment