آموزش پیشرفته PHP – آپلود فایل
سلام
با یک آموزش دیگه از سری آموزش های پیشرفته PHP در خدمتتون هستیم، در جلسه ی قبل کار با فایل ها را یاد گرفتیم، حال نوبت به این میرسه که چگونه میتوانیم یک فایل را به سمت سرور بفرستیم و ذخیره کنیم یا در اصطلاح چطوری فایل را در سرور آپلود کنیم، در ادامه همراه بپرسم باشید.
نکته ای که قبل از شروع آموزش باید بهش توجه بسیار زیادی داشته باشید:
اگر نمیدانستید بدانید که آسیب پذیر ترین بخش یک سایت، بخش آپلود فایل آن هست، چرا که هکر با روش های مختلفی میتواند یک شل در سایت آپلود کند و دسترسی به کل اطلاعات شما داشته باشد،
آپلود فایل در PHP بسیار آسان است، و همین آسانی باعث شده تا باعث خطر پذیری زیادی شود؛ چرا که اگر مسائل امنیتی در هنگام آپلود فایل را رعایت نکنیم، هکر به سادگی می توانید با آپلود یک شل ساده، دسترسی کل سایت را در دست بگیرد.
پیکربندی فایل php.ini
برای اینکه در PHP دسترسی آپلود فایل را داشته باشیم، ابتدا باید فایل php.ini را پیکربندی کنیم.
اگر دارای سرور اختصاصی هستید، فایل php.ini را باز کنید و به دنبال عبارت file_uploads بگردید و مقدار آن را به On تغییر دهید:
۱ |
file_uploads = On |
اگر هاست اشتراکی دارید این مورد در ۹۹ درصد مواقع توسط مدیر سرور فعال شده است.
نمونه کد ساده فرم آپلود فایل
همانطور که قبلا گفته شد، آپلود فایل در PHP بسیار آسان است، شما با قرار دادن تکه کد زیر و اجرای آن در سرور میتوانید هر نوع فایلی را در سرور آپلود و ذخیره کنید:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ |
<?php $target='up/'.basename($_FILES['upfile']['name']); if(move_uploaded_file($_FILES['upfile']['tmp_name'],$target)){ echo $target; } ?> <html> <head> </head> <body> <form method="POST" enctype="multipart/form-data"> <p>File to upload : <input type ="file" name ="upfile"></p><br /> <input type = "submit" name = "Submit" value ="Upload"> </form> </body> </html> |
با همین قطعه کد ساده توانستیم تا یک فرم آپلود ایجاد کنیم، ولی این فرم بسیار آسیب پذیر است. در سمت سرور(کدهای PHP) باید اعتبار سنجی هایی را انجام دهیم تا اینکه مطمئن شویم فایلی که کاربر میخواد آپلود کنه، مخرب نباشه، این قطعه فرم رو صرفا جهت آشنایی گذاشتم، در ادامه آموزش میریم تا یک فرم آپلود ایمن بسازیم.
ایجاد فرم HTML
در سرور میخواهیم عکس آپلود کنیم، ابتدا باید یک فرم بسازیم، قطعه کد زیر یک فرم آپلود تصویر میسازد:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ |
<!DOCTYPE html> <html> <body> <form action="upload.php" method="post" enctype="multipart/form-data"> انتخاب عکس: <input type="file" name="fileToUpload" id="fileToUpload"> <input type="submit" value="آپلود" name="submit"> </form> </body> </html> |
قوانیی که باید در فرم HTML بالا رعایت شود:
- متد ارسال اطلاعات در فرم آپلود باید post باشد(method=post).
- هنگامیکه در فرم، داده هایی دودویی مثل محتوای یک فایل میخواهد ارسال شود، نیاز به خاصیتی به نام enctype داریم که در بر گیرنده مقدار multipart/form-data است که مشخص کننده نوع محتوای آپلود شده است(enctype=multipart/form-data).
بدون الزامات فوق، قادر به آپلود فایل نیستید
موارد دیگری که باید در نظر داشته باشید:
نوع فیلدی که برای انتخاب فایل در نظر میگیرید، باید از نوع file باشد، که باعث میشود در کنار فیلد یک دکمه جهت انتخاب فایل ها از سیستم مورد استفاده قرار گیرد.
فرم بالا اطلاعات را به فایل upload.php جهت پردازش ارسال میکند(در این فایل کدهای PHP قرار دارد).
کدهای سمت سرور
فایل upload.php که در برگیرنده کدهای سمت کلاینت(فرم HTML) هست، به صورت زیر است:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ |
<?php $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = ۱; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); // Check if image file is a actual image or fake image if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "File is an image - " . $check["mime"] . "."; $uploadOk = ۱; } else { echo "File is not an image."; $uploadOk = ۰; } } ?> |
توضیحات:
- متغیر target_dir$ محل ذخیره ی فایل های آپلود شده را مشخص میکند(در اینجا ما یک پوشه به اسم uploads ساختیم و آدرس پوشه را در این متغیر ذخیره کردیم).
- متغیر target_file$ مسیر فایل+ نام فایل را در خود نگه میدارد.
- متغیر uploadOk$ را خودمون ساختیم، و مقدار پیشفرض را برابر ۱ قرار دادیم، توسط این متغیر تعیین میکنیم که آیا فایل آپلود شده تصویر است یا خیر(در ادامه بیشتر توضیح میدهیم).
- متغیر imageFileType$ پسوند فایل آپلود شده را در خود ذخیره میکنید(توسط این متغیر میتوانیم بر اساس پسوند فایل آپلود شده شرطی بزاریم که آیا این فایل آپلود شده تصویر واقعی است یا فایل جعلی، در ادامه بیشتر توضیح میدهیم).
نکته: در کنار فایل upload.php باید پوشه ای به اسم uploads بسازید، زیرا که در متغیر target_dir$ نام پوشه ذخیره سازی فایل های آپلود شده را قرار دادیم.
حالا بریم سراغ امن کردن بخش آپلود و شرط های ضروری که برای آپلود فایل مورد نیاز است را بنویسیم، از این قسمت به بعد را سعی کنید به خوبی یاد بگیرید.
چگونه بررسی کنیم که آیا فایل از قبل وجود دارد یا خیر
طبیعتا نباید فایل های همنام و تکراری در سرور وجود داشته باشد، به همین منظور توسط تابع file_exists چک میکنیم که آیا نام فایل انتخاب شده توسط کاربر در پوشه uploads که در متغیر target_file$ ذخیره شده است قرار دارد یا خیر، اگه قرار داشت متغیر uploadOk$ را برابر ۰ قرار میدهیم.
۱ ۲ ۳ ۴ ۵ |
// Check if file already exists if (file_exists($target_file)) { echo "Sorry, file already exists."; $uploadOk = ۰; } |
محدودیت آپلود نوع فایل
توسط قطعه کد زیر به کاربر اجازه آپلود فایل هایی با پسوند عای PNG, JPG, JPEG و GIF را میدهیم، در غیر این صورت کاربر هر فایلی که آپلود کرد متغیر uploadOk را برابر ۰ قرار میدهیم تا از آپلود جلوگیری و پیغام خطا نشان دهیم.
۱ ۲ ۳ ۴ ۵ |
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "فایل آپلود شده مجاز نیست، پسوند های مجاز JPG,JPEG,PNG,GIF هستند."; $uploadOk = ۰; } |
محدودیت حجم فایل
نام input که برای آپلود فایل در فرم html قرار دارد، fileToUpload نام گذاری شده است.
برای آپلود فایل ها باید محدودیت حجم بزاریم که کاربر نتواند هر حجم فایلی را آپلود کند. برای مثال در قطعه کد زیر محدودیت حجم فایل ۵۰۰ کیلوبایت قرار دادیم که کاربر نتواند فایل بیشتر از ۵۰۰ کیلوبایت آپلود کند اگر حجم فایل بیش از حجم تعیین شده بود، مقدار uploadOk$ را برابر ۰ قرار میدهیم و از ادامه کار جلوگیری میکنیم.
۱ ۲ ۳ ۴ |
if ($_FILES["fileToUpload"]["size"] > ۵۰۰۰۰۰) { echo "Sorry, your file is too large."; $uploadOk = ۰; } |
سه شرط مهم که برای آپلود فایل ها میتوانستیم اعمال کنیم، تا اینجا گفته شد، شما هم اگر امنیت سایت برایتان مهم است، حتما این سه شرط را اعمال کنید تا آپلود فایل ایمنی داشته باشید.
اسکریپت آپلود فایل
فایل upload.php ما با تمامی مباحث گفته شده تا الان به صورت زیر شده است:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ ۳۲ ۳۳ ۳۴ ۳۵ ۳۶ ۳۷ ۳۸ ۳۹ ۴۰ ۴۱ ۴۲ ۴۳ ۴۴ ۴۵ ۴۶ ۴۷ ۴۸ ۴۹ ۵۰ |
<?php $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = ۱; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "فایل انتخاب شده، تصویر است - " . $check["mime"] . "."; $uploadOk = ۱; } else { echo "فایل انتخاب شده، تصویر نیست"; $uploadOk = ۰; } } // بررسی تکراری بودن فایل if (file_exists($target_file)) { echo "Sorry, file already exists."; $uploadOk = ۰; } // بررسی حجم فایل if ($_FILES["fileToUpload"]["size"] > ۵۰۰۰۰۰) { echo "Sorry, your file is too large."; $uploadOk = ۰; } // بررسی فرمت فایل if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = ۰; } // بررسی مقدار uploadOk برای جلوگیری از خطا if ($uploadOk == ۰) { echo "Sorry, your file was not uploaded."; // اگر همه شرایط صحیح بود، آپلود انجام میشود } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "خطا: آپلود فایل انجام نشد"; } } ?> |
این قسمت از آموزش نیز به پایان رسید، اگر مشکلی در رابطه با آموزش بالا داشتید، در بخش پرسش و پاسخ سایت بپرسید.
موفق باشید.
ارسال نظر
شما باید وارد شوید یا عضو شوید تا بتوانید نظر ارسال کنید