Amankan skrip unggahan
Aug 17 2020
Saya membuat jejaring sosial yang memungkinkan pengguna mengunggah gambar profil. Saya hanya ingin tahu apakah ini cara yang aman untuk melakukannya. Terima kasih.
<?php
include 'includes/header.php';
include 'includes/form_handlers/settings_handler.php';
//$userPic = ''; $date_time = date('Y-m-d_H-i-s');
if(!empty($userLoggedIn)) { if (isset($_FILES['fileToUpload'])) {
$errors= array(); $file_name = $_FILES['fileToUpload']['name']; $file_size = $_FILES['fileToUpload']['size']; $width = 1500;
$height = 1500; $file_tmp = $_FILES['fileToUpload']['tmp_name']; $file_type = $_FILES['fileToUpload']['type']; $tmp = explode('.',$_FILES['fileToUpload']['name']); $file_ext=strtolower (end ($tmp)); $extensions = array( "jpeg", "jpg", "png", "gif");
if(in_array($file_ext,$extensions)=== false){
$errors[]="extension not allowed, please choose a JPEG or PNG file."; } if ($file_size > 8097152) {
$errors[] = 'File size must be 2 MB'; } if ($width > 1500 || $height > 1500) { echo"File is to large"; } if(!$errors) {
$userPic = md5($_FILES["fileToUpload"]["name"]) . $date_time . " " . $file_name;
$profilePic = move_uploaded_file($file_tmp,"assets/images/profile_pics/" . $userPic); $file_path = "assets/images/profile_pics/" . $userPic; $stmt = $con->prepare("UPDATE users SET profile_pic = ? WHERE username = ?"); $stmt->bind_param('ss', $file_path, $username);
$stmt->execute(); $stmt->close();
header('Location: settings.php');
exit();
}
}
} else {
echo "Invalid Username";
}
?>
Jawaban
5 LiamSorsby Aug 18 2020 at 21:13
Ini adalah pendapat pribadi saya, tetapi saya akan mengatakan yang berikut:
- Kode harus diformat, saya pribadi akan melihat PSR-12 karena standar ini harus diikuti jika memungkinkan.
- move_uploaded_file tidak melindungi dari traversal direktori. Anda harus menggunakan nama dasar
$_FILES['fileToUpload']['tmp_name']
dan beberapa bentuk validasi lainnya - Memeriksa ekstensi file dengan
if(in_array($file_ext,$extensions)=== false)
tidak mencegah pengguna mengunggah file berbahaya, mereka dapat misalnya menggunakan byte ajaib untuk mengelabui server agar mengira itu adalah jenis file tertentu. Anda harus melihat finfo dan contoh pertama pada unggahan file - Anda membuat serangkaian kesalahan, yang saat ini sedang diperiksa dalam pernyataan if dan kemudian dibuang. Jika Anda tidak berencana untuk menggunakannya, Anda mungkin lebih baik keluar dari fungsi lebih awal daripada melanjutkan eksekusi.
- Bergantung pada seberapa unik nama file itu, Anda mungkin ingin menggunakan sesuatu seperti
uniqid(mt_rand(), true)
- move_uploaded_file akan mengganti file jika sudah ada, Anda mungkin ingin memeriksa apakah ini ada sebelum Anda menimpa file yang sudah ada. Bergantung pada solusi penamaan Anda, hal ini sangat tidak mungkin terjadi tetapi dengan beban tinggi untuk jangka waktu yang lama, hal ini dapat terjadi lebih sering daripada yang Anda kira.
- Anda menggunakan
UPDATE users SET profile_pic = ? WHERE username = ?
Saya akan berasumsi bahwa nilai ini ada dalam database karena pengguna perlu masuk. Namun, jika Anda tidak yakin apakah bidang itu ada atau tidak (saya belum melihat database) saya akan secara pribadi menggunakan:INSERT INTO users (profile_pic, username) VALUES (?,?) ON DUPLICATE KEY UPDATE profile_pic=?, username=?
ini akan dimasukkan ke dalam tabel jika baris tidak ada tetapi akan memperbaruinya jika ada. - Anda telah menetapkan variabel lokal yang disebut lebar dan tinggi dan membandingkannya dengan nilai yang sama. Saya berasumsi ini dimaksudkan untuk memeriksa dimensi file yang sebenarnya?
Saya harap ini membantu dalam beberapa hal :)
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'