دوره‌ها / آموزش جامع PHP (از صفر تا استادی) / آپلود فایل (PHP Upload)

آپلود فایل (PHP Upload)

30 دقیقه Article

آپلود فایل: مدیریتِ محتوایِ کاربر 📤🛡️

آپلودِ فایل یکی از چالش‌برانگیزترین بخش‌هایِ امنیت در PHP است. شما به کاربر اجازه می‌دهید فایلی را رویِ هاردِ سرورِ شما بنویسد!

۱. پیش‌نیازها در HTML

فرمِ شما حتماً باید دارایِ صفتِ enctype="multipart/form-data" باشد، وگرنه فایل ارسال نمی‌شود.

۲. متغیرِ سراسری $_FILES

تمامِ اطلاعاتِ فایلِ آپلود شده در این آرایه است: نام، حجم، نامِ موقت (Temporary Name) و خطاها.

{code_block('$tmp_path = $_FILES["fileToUpload"]["tmp_name"];')}

چک‌لیستِ امنیتیِ حیاتی:

  1. بررسیِ پسوند: فقط پسوندهایِ مجاز (مثل jpg, png) را قبول کنید.
  2. بررسیِ حجم: از آپلودِ فایل‌هایِ گیگابایتی جلوگیری کنید.
  3. تغییرِ نام: هرگز فایل را با نامِ اصلیِ خودش ذخیره نکنید (هکرها ممکن است فایلی با نام shell.php بفرستند).
آپلودِ شِل (Shell): بزرگترین خطر این است که کاربر یک فایلِ PHP آپلود کند و بعد با فراخوانیِ آن در مرورگر، کلِ سرورِ شما را در دست بگیرد.

جابجایی نهایی:

{code_block('move_uploaded_file($_FILES["file"]["tmp_name"], "uploads/new_name.jpg");')}
توابعِ امنیتی: از getimagesize() استفاده کنید تا مطمئن شوید فایلی که ادعا می‌کند عکس است، واقعاً دیتایِ عکس دارد.
<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: مهندسی پیشرفته و امنیت در PHP 🐘⚙️

درکِ عمیقِ مفاهیمِ پیشرفته، تفاوتِ بینِ یک کدنویسِ معمولی و یک معمارِ نرم‌افزار را رقم می‌زند.

۱. بهینه‌سازی I/O و بافرینگ

در هنگامِ کار با فایل‌هایِ حجیم، هرگز کلِ فایل را به یکباره در حافظه (RAM) بارگذاری نکنید. استفاده از Streams و توابعِ fopen/fgets به شما اجازه می‌دهد فایل را خط به خط پردازش کنید که باعث می‌شود مصرفِ حافظه همیشه در کمترین سطحِ ممکن باقی بماند.

۲. امنیتِ نشست‌ها (Session Security)

مهم‌ترین خطر در مدیریتِ کاربران، Session Hijacking است. همیشه بعد از لاگین کردنِ کاربر، از session_regenerate_id(true) استفاده کنید تا شناسه‌یِ نشستِ قبلی باطل شود. همچنین فلگ‌هایِ HttpOnly و Secure را برای کوکی‌ها فعال کنید.

۳. استانداردهایِ مدرن و Autoloading

در پروژه‌هایِ بزرگ، استفاده از include دستی فاجعه‌بار است. استانداردِ PSR-4 و استفاده از Composer به شما اجازه می‌دهد کلاس‌ها را فقط در زمانی که واقعاً نیاز هستند بارگذاری کنید (Lazy Loading)، که سرعتِ لود شدنِ کلِ اپلیکیشن را به شدت بالا می‌برد.

نکته استراتژیک: به جایِ استفاده از توابعِ سنتی، سعی کنید به سمتِ Object-Oriented Programming (OOP) حرکت کنید. اکثرِ کتابخانه‌هایِ پیشرفته‌یِ PHP مثل DateTime و PDO از این پارادایم استفاده می‌کنند.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

دریافت نام اصلی فایل Medium
سوال تمرین

نامِ اصلیِ فایلی که با نام "resume" آپلود شده را از آرایه‌یِ $_FILES استخراج و چاپ کنید.

پاسخ تمرین
PHP
<?php
echo $_FILES["resume"]["name"];
?>

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.