Header Ads

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.
$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 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.
<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 { // 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);
}
}
Sebagai tambahan, mungkin juga perlu untuk membatasi ukuran file yang diupload untuk melindungi website dari serangan yang mencoba mengganggu network traffic atau system load.

Semoga Bermanfaat

No comments

Silahkan Komentar dengan bahasa yang sopan

Powered by Blogger.