PHP: Verifikasi Command File
Verifikasi Data (Hapus file)
---------------------------------
ini adalah pegetahuan dasar mengenai masalah security bagi php coder yaitu jangan percaya semua data yang diinputkan user (sekalipun itu admin) sebelum kau memverifikasi data tersebut. langsung menjalankan data yang diterima dari $_GET, $_POST dan $_COOKIE adalah salah satu perbuatan bodoh.
contoh:
jika anda mempuyai script utnuk menghapus file pada folder "gambar"
if (isset($_GET['hapusgambar'])) {
$dir = "./gambar/";
$file = $dir . $_GET['hapusgambar'];
unlink($file);
}
?>
masalah akan muncul jika ada yang merequest url
www.mysite.id/admin.php?hapusgambar=../index.php
maka bisa dipastikan file index.php anda akan terhapus dan struktur website anda pun terbuka utnuk dilihat siapapun. jadi anda harus punya kontrol mana file yang boleh dihapus dan tidak boleh dihapus.
cara memperbaikinya?
anda bisa mengikuti rekomendasi Regin Gaarsmand (http://www.sourcerally.net/regin/8-The-PHP-coder's-top-10-mistakes-and-problems.htm) dengan memverifikasi input terlebih dahulu. jika kita sesuaikan maka seperti ini
if (isset($_GET['hapusgambar'])) {
/* memasukan file yang boleh dihapus kedalam array */
$allowedFiles = array('file1.jpg','file2.jpg','file3.gif');
/* memeriksa apakah input dari user termasuk yang boleh dihapus */
if(in_array((string)$_GET['hapusgambar'],$allowedFiles)) {
$dir = "./gambar/";
$file = $dir . $_GET['hapusgambar'];
unlink($file);
}
else{
exit('not allowed');
}
}
?>
masalah kembali muncul, bagaimana jika file yang yang ingin di hapus itu dinamis artinya selalu berubah-ubah seperti file di dalam folder gambar. tidak mungkin setiap saat anda mengedit source code hanya untuk mengganti array file.
maka sebagai gantinya anda bisa menggunakan script seperti ini
if (isset($_GET['hapus'])) {
$fileuser = $_GET['hapus'];
$retVal = array ();
/* buka direktori gambar */
$handle = opendir("./gambar/");
while ($file = readdir($handle)) {
/* memasukan nama file kedalam array */
$retVal[count($retVal)] = $file;
}
/* tutup dan urutkan data */
closedir($handle);
sort($retVal);
/* check apakah file yang ingin dihapus ada didirektori tersebut */
if(in_array($fileuser,$retVal)) {
unlink($fileuser);
/* jika file tidak terdapat di folder gambar, maka tampilkan pesan */
} else {
exit('tidak di ijinkan');
}
}
?>
Happy coding....
By Boy21 a.k.a S-Elf
---------------------------------
ini adalah pegetahuan dasar mengenai masalah security bagi php coder yaitu jangan percaya semua data yang diinputkan user (sekalipun itu admin) sebelum kau memverifikasi data tersebut. langsung menjalankan data yang diterima dari $_GET, $_POST dan $_COOKIE adalah salah satu perbuatan bodoh.
contoh:
jika anda mempuyai script utnuk menghapus file pada folder "gambar"
if (isset($_GET['hapusgambar'])) {
$dir = "./gambar/";
$file = $dir . $_GET['hapusgambar'];
unlink($file);
}
?>
masalah akan muncul jika ada yang merequest url
www.mysite.id/admin.php?hapusgambar=../index.php
maka bisa dipastikan file index.php anda akan terhapus dan struktur website anda pun terbuka utnuk dilihat siapapun. jadi anda harus punya kontrol mana file yang boleh dihapus dan tidak boleh dihapus.
cara memperbaikinya?
anda bisa mengikuti rekomendasi Regin Gaarsmand (http://www.sourcerally.net/regin/8-The-PHP-coder's-top-10-mistakes-and-problems.htm) dengan memverifikasi input terlebih dahulu. jika kita sesuaikan maka seperti ini
if (isset($_GET['hapusgambar'])) {
/* memasukan file yang boleh dihapus kedalam array */
$allowedFiles = array('file1.jpg','file2.jpg','file3.gif');
/* memeriksa apakah input dari user termasuk yang boleh dihapus */
if(in_array((string)$_GET['hapusgambar'],$allowedFiles)) {
$dir = "./gambar/";
$file = $dir . $_GET['hapusgambar'];
unlink($file);
}
else{
exit('not allowed');
}
}
?>
masalah kembali muncul, bagaimana jika file yang yang ingin di hapus itu dinamis artinya selalu berubah-ubah seperti file di dalam folder gambar. tidak mungkin setiap saat anda mengedit source code hanya untuk mengganti array file.
maka sebagai gantinya anda bisa menggunakan script seperti ini
if (isset($_GET['hapus'])) {
$fileuser = $_GET['hapus'];
$retVal = array ();
/* buka direktori gambar */
$handle = opendir("./gambar/");
while ($file = readdir($handle)) {
/* memasukan nama file kedalam array */
$retVal[count($retVal)] = $file;
}
/* tutup dan urutkan data */
closedir($handle);
sort($retVal);
/* check apakah file yang ingin dihapus ada didirektori tersebut */
if(in_array($fileuser,$retVal)) {
unlink($fileuser);
/* jika file tidak terdapat di folder gambar, maka tampilkan pesan */
} else {
exit('tidak di ijinkan');
}
}
?>
Happy coding....
By Boy21 a.k.a S-Elf
Komentar