Güvenli yükleme komut dosyası

Aug 17 2020

Kullanıcıların bir profil resmi yüklemesine izin veren bir sosyal ağ oluşturuyorum. Bunu yapmanın güvenli bir yolu olup olmadığını bilmek istiyorum. Teşekkürler.

<?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";
}

?>

Yanıtlar

5 LiamSorsby Aug 18 2020 at 21:13

Bu benim kişisel görüşüm, ancak şunu söyleyebilirim:

  1. Kod formatlanmalı, ben şahsen PSR-12'ye bakarım çünkü mümkün olduğunda bu standart takip edilmelidir.
  2. move_uploaded_file, dizin geçişine karşı koruma sağlamaz. $_FILES['fileToUpload']['tmp_name']Baz adını ve diğer bazı doğrulama biçimlerinde kullanmalısınız
  3. Dosya uzantısını ile işaretlemek if(in_array($file_ext,$extensions)=== false), bir kullanıcının kötü amaçlı bir dosyayı yüklemesini engellemez; örneğin, sunucuyu bunun belirli bir dosya türü olduğunu düşünmesi için sihirli bir bayt kullanabilir. Dosya yüklemeyle ilgili finfo'ya ve ilk örneğe bir göz atmalısınız.
  4. Şu anda bir if deyiminde kontrol edilen ve sonra atılan bir dizi hata oluşturursunuz. Kullanmayı planlamıyorsanız, yürütmeye devam etmek yerine işlevden erken dönmeniz daha iyi olabilir.
  5. Dosya adının ne kadar benzersiz olması gerektiğine bağlı olarak, aşağıdaki gibi bir şey kullanmak isteyebilirsiniz: uniqid(mt_rand(), true)
  6. move_uploaded_file, zaten varsa bir dosyanın yerini alacaktır, mevcut bir dosyanın üzerine yazmadan önce bunun var olup olmadığını kontrol etmek isteyebilirsiniz. Adlandırma çözümünüze bağlı olarak, meydana gelmesi pek olası değildir, ancak uzun süre yüksek yük altında bu, düşündüğünüzden daha sık gerçekleşebilir.
  7. Kullandığınız UPDATE users SET profile_pic = ? WHERE username = ?ben kullanıcı ihtiyaçları giriş yapmanız olarak bu değer veritabanında mevcut olduğunu varsayalım olur. Ancak, (Ben veritabanını görmedim) Ben istiyorum emin tarla varsa ya değilse kişisel olarak kullan: INSERT INTO users (profile_pic, username) VALUES (?,?) ON DUPLICATE KEY UPDATE profile_pic=?, username=?Bu, satır yoksa tabloya eklenir ancak varsa günceller.
  8. Genişlik ve yükseklik adında yerel bir değişken ayarladınız ve bunları aynı değerle karşılaştırıyorsunuz. Bunun gerçek dosya boyutlarını kontrol etmek için olduğunu varsayıyorum?

Umarım bu bir şekilde yardımcı olur :)