آموزش رایگان PHP

آموزش کامل و امن آپلود فایل در PHP (مطابق استاندارد گوگل)

1405/05/01 20:17 محراب حسن زاده
آموزش کامل و امن آپلود فایل در PHP (مطابق استاندارد گوگل)

مقدمه‌ای بر آپلود فایل در PHP

آپلود فایل یکی از رایج‌ترین و در عین حال حساس‌ترین عملیات‌ها در برنامه‌نویسی وب است. اگر سیستم آپلود فایل شما به اندازه کافی امن نباشد، هکرها می‌توانند با آپلود فایل‌های مخرب (مانند شل‌های PHP)، کنترل کامل سرور شما را به دست بگیرند. گوگل و نهادهای امنیتی مانند OWASP استانداردهای سخت‌گیرانه‌ای برای این موضوع دارند.

مراحل آپلود امن فایل طبق استاندارد گوگل

برای پیاده‌سازی یک آپلودر استاندارد و ایمن، باید مراحل زیر را به دقت انجام دهیم:

  • اعتبارسنجی نوع فایل (MIME Type): هرگز به پسوند فایل فرستاده شده توسط کاربر اعتماد نکنید.
  • محدود کردن حجم فایل: برای جلوگیری از حملات DoS حجم فایل را محدود کنید.
  • تغییر نام فایل به صورت هش/تصادفی: از نام اصلی فایل استفاده نکنید تا از اجرای کدهای مخرب جلوگیری شود.
  • ذخیره‌سازی خارج از روت اصلی: فایل‌ها را در پوشه‌ای ذخیره کنید که دسترسی مستقیم برای اجرای کدهای PHP در آن غیرفعال باشد.

۱. طراحی فرم HTML آپلود فایل

ابتدا نیاز به یک فرم HTML داریم. نکته کلیدی استفاده از ویژگی enctype="multipart/form-data" است:


< form action="upload.php" method="POST" enctype="multipart/form-data" >
    < label for="file-upload" >انتخاب فایل:< / label >
    < input type="file" name="uploaded_file" id="file-upload" / >
    < button type="submit" name="submit" >آپلود فایل< / button >
< / form >

۲. پردازش امن فایل در PHP

حالا کد PHP سمت سرور را می‌نویسیم. در این کد، تمام لایه‌های امنیتی از جمله بررسی پسوند، اندازه فایل و اعتبارسنجی MIME Type با استفاده از افزونه finfo انجام می‌شود:


if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['uploaded_file'])) {
    $file = $_FILES['uploaded_file'];
    
    // 1. بررسی خطاهای پیش‌فرض آپلود
    if ($file['error'] !== UPLOAD_ERR_OK) {
        die("خطا در آپلود فایل رخ داده است.");
    }

    // 2. محدود کردن حجم فایل (مثلاً حداکثر 2 مگابایت)
    $maxSize = 2 * 1024 * 1024;
    if ($file['size'] --> $maxSize) {
        die("حجم فایل فرستاده شده بیشتر از حد مجاز (2 مگابایت) است.");
    }

    // 3. اعتبارسنجی پسوند و MIME Type واقعی فایل (طبق استاندارد امنیتی گوگل)
    $allowedMimes = [
        'image/jpeg' => 'jpg',
        'image/png'  => 'png',
        'image/gif'  => 'gif',
        'application/pdf' => 'pdf'
    ];

    $finfo = new finfo(FILEINFO_MIME_TYPE);
    $realMime = $finfo->file($file['tmp_name']);

    if (!array_key_exists($realMime, $allowedMimes)) {
        die("فرمت فایل ارسالی مجاز نیست. فقط عکس و PDF مجاز است.");
    }

    // 4. ایجاد نام تصادفی و امن برای فایل
    $extension = $allowedMimes[$realMime];
    $newFileName = sha1(uniqid(mt_rand(), true)) . '.' . $extension;

    // 5. تعیین مسیر نهایی برای ذخیره سازی
    $uploadDir = './uploads/';
    if (!is_dir($uploadDir)) {
        mkdir($uploadDir, 0755, true);
    }
    
    $destination = $uploadDir . $newFileName;

    // 6. انتقال فایل از پوشه موقت به پوشه نهایی
    if (move_uploaded_file($file['tmp_name'], $destination)) {
        echo "فایل شما با موفقیت و به صورت امن آپلود شد. نام جدید: " . $newFileName;
    } else {
        echo "خطا در انتقال و ذخیره فایل.";
    }
}

محافظت بیشتر با استفاده از htaccess.

برای امنیت کامل، یک فایل به نام .htaccess در پوشه uploads بسازید و کدهای زیر را قرار دهید تا هکرها حتی در صورت دور زدن فیلترها، نتوانند هیچ اسکریپتی را اجرا کنند:


< FilesMatch "\.(php|php5|phtml|php4|php3|pl|py|jsp|asp|sh|cgi)$" >
    ForceType text/plain
    Deny from all
< / FilesMatch >

نتیجه‌گیری

رعایت این نکات امنیتی به شما کمک می‌کند سیستم آپلودی بسازید که در برابر حملاتی چون Arbitrary File Upload کاملاً مصون باشد و بر اساس اصول بهینه‌سازی و سئو گوگل، فایل‌ها را با نام‌های یکتا و سازمان‌دهی شده مدیریت کنید.


پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

چگونه یک فوتر چسبان در CSS بسازیم: آموزش ساخت فوتر ثابت و همیشگی
1403/06/02 17:39

چگونه یک فوتر چسبان در CSS بسازیم: آموزش ساخت فوتر ثابت و همیشگی

مطالعه بیشتر
آموزش کامنت‌گذاری در PHP بر اساس استاندارد گوگل و Clean Code
1405/03/21 01:15

آموزش کامنت‌گذاری در PHP بر اساس استاندارد گوگل و Clean Code

مطالعه بیشتر
آموزش توسعه بازی‌های ساده با استفاده از جاوا اسکریپت و Canvas API: راهنمای گام به گام
1403/08/05 21:06

آموزش توسعه بازی‌های ساده با استفاده از جاوا اسکریپت و Canvas API: راهنمای گام به گام

مطالعه بیشتر
درک Props و انتقال داده‌ها بین کامپوننت‌ها در Vue.js | آموزش کاربردی
1404/09/24 20:16

درک Props و انتقال داده‌ها بین کامپوننت‌ها در Vue.js | آموزش کاربردی

مطالعه بیشتر
آموزش جامع پارامترها و مقادیر بازگشتی در PHP (بر اساس استانداردهای مدرن)
1405/04/16 01:14

آموزش جامع پارامترها و مقادیر بازگشتی در PHP (بر اساس استانداردهای مدرن)

مطالعه بیشتر
آموزش جامع اینترفیس‌ها و کلاس‌ها (Classes) در ES6 جاوا اسکریپت: مفاهیم و کاربردها
1403/07/28 21:31

آموزش جامع اینترفیس‌ها و کلاس‌ها (Classes) در ES6 جاوا اسکریپت: مفاهیم و کاربردها

مطالعه بیشتر
آموزش ساخت یک برنامه ساده با Fetch API در جاوا اسکریپت: راهنمای گام به گام
1403/08/01 20:16

آموزش ساخت یک برنامه ساده با Fetch API در جاوا اسکریپت: راهنمای گام به گام

مطالعه بیشتر
آموزش جامع مدیریت خطا با Try Catch و Exception در PHP (اصول و استانداردهای تمیز)
1405/05/01 20:26

آموزش جامع مدیریت خطا با Try Catch و Exception در PHP (اصول و استانداردهای تمیز)

مطالعه بیشتر
آموزش کار با رویدادهای فرم و اعتبارسنجی فرم‌ها در جاوا اسکریپت: راهنمای جامع
1403/08/03 16:47

آموزش کار با رویدادهای فرم و اعتبارسنجی فرم‌ها در جاوا اسکریپت: راهنمای جامع

مطالعه بیشتر
راهنمای جامع قوانین نام‌گذاری متغیرها در PHP بر اساس استاندارد گوگل
1405/03/24 00:57

راهنمای جامع قوانین نام‌گذاری متغیرها در PHP بر اساس استاندارد گوگل

مطالعه بیشتر
آموزش تگ‌های زمان و مکان در HTML: استفاده از time و location در صفحات وب
1402/05/29 21:13

آموزش تگ‌های زمان و مکان در HTML: استفاده از time و location در صفحات وب

مطالعه بیشتر
آموزش استفاده از تگ‌های خاص HTML: تگ‌های کاربردی برای طراحی وب‌سایت
1402/05/22 23:53

آموزش استفاده از تگ‌های خاص HTML: تگ‌های کاربردی برای طراحی وب‌سایت

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد