सुरक्षित अपलोड स्क्रिप्ट
मैं एक सोशल नेटवर्क बना रहा हूं जो उपयोगकर्ताओं को एक प्रोफ़ाइल चित्र अपलोड करता है। मैं सिर्फ यह जानना चाहता हूं कि क्या यह करने का एक सुरक्षित तरीका है। धन्यवाद।
<?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";
}
?>
जवाब
5 LiamSorsby
यह मेरी निजी राय है, लेकिन मैं निम्नलिखित कहना चाहूंगा:
- कोड को प्रारूपित किया जाना चाहिए, मैं व्यक्तिगत रूप से PSR-12 को देखूंगा क्योंकि जब संभव हो तो इस मानक का पालन किया जाना चाहिए।
- Move_uploaded_file निर्देशिका ट्रैवर्सल से सुरक्षा नहीं करता है। आपको आधार
$_FILES['fileToUpload']['tmp_name']
और कुछ अन्य प्रकार के सत्यापन के आधार पर उपयोग करना चाहिए - फ़ाइल एक्सटेंशन की जांच
if(in_array($file_ext,$extensions)=== false)
करने से उपयोगकर्ता को दुर्भावनापूर्ण फ़ाइल को अपलोड करने से नहीं रोका जा सकता है, उदाहरण के लिए वे एक जादू बाइट का उपयोग कर सकते हैं ताकि यह सोच सके कि यह एक निश्चित प्रकार की फ़ाइल है। आपको फाईनफो पर एक नज़र रखना चाहिए और फ़ाइल अपलोड पर पहला उदाहरण देना चाहिए - आप त्रुटियों की एक सरणी बना रहे हैं, वर्तमान में एक अगर बयान में जाँच की जा रही है और फिर उसे फेंक दिया जाता है। यदि आप इसका उपयोग करने की योजना नहीं बना रहे हैं, तो बेहतर हो सकता है कि आप निष्पादन को जारी रखने के बजाय केवल फ़ंक्शन से जल्दी वापस लौटें।
- इस बात पर निर्भर करता है कि फ़ाइल नाम कितना अनूठा होना चाहिए, जैसे आप कुछ उपयोग करना चाहते हैं
uniqid(mt_rand(), true)
- Move_uploaded_file एक फ़ाइल को प्रतिस्थापित करेगा यदि यह पहले से मौजूद है, तो आप यह जाँचना चाहते हैं कि मौजूदा फ़ाइल को अधिलेखित करने से पहले यह मौजूद है। आपके नामकरण समाधान के आधार पर यह होने की बहुत संभावना नहीं है लेकिन लंबे समय तक उच्च भार के तहत यह आपके विचार से अधिक बार हो सकता है।
- आप उपयोग कर रहे हैं
UPDATE users SET profile_pic = ? WHERE username = ?
मुझे लगता है कि यह मान डेटाबेस में मौजूद है क्योंकि उपयोगकर्ता को लॉग इन करने की आवश्यकता है। हालांकि, यदि आप सुनिश्चित नहीं हैं कि क्षेत्र मौजूद है या नहीं (मैंने डेटाबेस नहीं देखा है) व्यक्तिगत रूप से उपयोग करें:INSERT INTO users (profile_pic, username) VALUES (?,?) ON DUPLICATE KEY UPDATE profile_pic=?, username=?
यह तालिका में सम्मिलित होगा यदि पंक्ति मौजूद नहीं है, लेकिन यदि यह करता है तो इसे अपडेट करेगा। - आपने चौड़ाई और ऊँचाई नामक एक स्थानीय चर निर्धारित किया है और उनकी उसी मान से तुलना कर रहे हैं। मुझे लगता है कि यह वास्तविक फ़ाइल आयामों की जांच करने के लिए था?
मुझे उम्मीद है कि यह किसी तरह से मदद करता है :)