آپلود فایل (PHP Upload)
آپلود فایل: مدیریتِ محتوایِ کاربر 📤🛡️
آپلودِ فایل یکی از چالشبرانگیزترین بخشهایِ امنیت در PHP است. شما به کاربر اجازه میدهید فایلی را رویِ هاردِ سرورِ شما بنویسد!
۱. پیشنیازها در HTML
فرمِ شما حتماً باید دارایِ صفتِ enctype="multipart/form-data" باشد، وگرنه فایل ارسال نمیشود.
۲. متغیرِ سراسری $_FILES
تمامِ اطلاعاتِ فایلِ آپلود شده در این آرایه است: نام، حجم، نامِ موقت (Temporary Name) و خطاها.
{code_block('$tmp_path = $_FILES["fileToUpload"]["tmp_name"];')}چکلیستِ امنیتیِ حیاتی:
- بررسیِ پسوند: فقط پسوندهایِ مجاز (مثل jpg, png) را قبول کنید.
- بررسیِ حجم: از آپلودِ فایلهایِ گیگابایتی جلوگیری کنید.
- تغییرِ نام: هرگز فایل را با نامِ اصلیِ خودش ذخیره نکنید (هکرها ممکن است فایلی با نام
shell.phpبفرستند).
جابجایی نهایی:
{code_block('move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/new_name.jpg");')}getimagesize() استفاده کنید تا مطمئن شوید فایلی که ادعا میکند عکس است، واقعاً دیتایِ عکس دارد.
بخش تخصصی: مهندسی پیشرفته و امنیت در PHP 🐘⚙️
درکِ عمیقِ مفاهیمِ پیشرفته، تفاوتِ بینِ یک کدنویسِ معمولی و یک معمارِ نرمافزار را رقم میزند.
۱. بهینهسازی I/O و بافرینگ
در هنگامِ کار با فایلهایِ حجیم، هرگز کلِ فایل را به یکباره در حافظه (RAM) بارگذاری نکنید. استفاده از Streams و توابعِ fopen/fgets به شما اجازه میدهد فایل را خط به خط پردازش کنید که باعث میشود مصرفِ حافظه همیشه در کمترین سطحِ ممکن باقی بماند.
۲. امنیتِ نشستها (Session Security)
مهمترین خطر در مدیریتِ کاربران، Session Hijacking است. همیشه بعد از لاگین کردنِ کاربر، از session_regenerate_id(true) استفاده کنید تا شناسهیِ نشستِ قبلی باطل شود. همچنین فلگهایِ HttpOnly و Secure را برای کوکیها فعال کنید.
۳. استانداردهایِ مدرن و Autoloading
در پروژههایِ بزرگ، استفاده از include دستی فاجعهبار است. استانداردِ PSR-4 و استفاده از Composer به شما اجازه میدهد کلاسها را فقط در زمانی که واقعاً نیاز هستند بارگذاری کنید (Lazy Loading)، که سرعتِ لود شدنِ کلِ اپلیکیشن را به شدت بالا میبرد.
DateTime و PDO از این پارادایم استفاده میکنند.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
نامِ اصلیِ فایلی که با نام "resume" آپلود شده را از آرایهیِ $_FILES استخراج و چاپ کنید.
<?php
echo $_FILES["resume"]["name"];
?>
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.