آموزش رایگان 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 کاملاً مصون باشد و بر اساس اصول بهینه‌سازی و سئو گوگل، فایل‌ها را با نام‌های یکتا و سازمان‌دهی شده مدیریت کنید.


پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آشنایی با متغیرها در PHP به زبان ساده (راهنمای جامع)
1405/03/21 01:34

آشنایی با متغیرها در PHP به زبان ساده (راهنمای جامع)

مطالعه بیشتر
آموزش mix-blend-mode و background-blend-mode در CSS: ترکیب رنگ‌ها و ایجاد افکت‌های جذاب
1403/08/12 20:18

آموزش mix-blend-mode و background-blend-mode در CSS: ترکیب رنگ‌ها و ایجاد افکت‌های جذاب

مطالعه بیشتر
آموزش جامع مدیریت خطاها در PHP بر اساس استانداردهای گوگل
1405/05/01 20:23

آموزش جامع مدیریت خطاها در PHP بر اساس استانداردهای گوگل

مطالعه بیشتر
آموزش متغیرهای سفارشی (Custom Properties) در CSS: نحوه تعریف و استفاده از var
1402/06/18 22:41

آموزش متغیرهای سفارشی (Custom Properties) در CSS: نحوه تعریف و استفاده از var

مطالعه بیشتر
آموزش کامل حلقه foreach در PHP برای پیمایش آرایه‌ها (به زبان ساده)
1405/04/04 00:22

آموزش کامل حلقه foreach در PHP برای پیمایش آرایه‌ها (به زبان ساده)

مطالعه بیشتر
استفاده از font face در CSS برای اضافه کردن فونت‌های سفارشی: راهنمای کامل
1403/08/16 21:48

استفاده از font face در CSS برای اضافه کردن فونت‌های سفارشی: راهنمای کامل

مطالعه بیشتر
آموزش گام به گام اتصال به دیتابیس با MySQLi در PHP (امن و استاندارد)
1405/05/04 23:40

آموزش گام به گام اتصال به دیتابیس با MySQLi در PHP (امن و استاندارد)

مطالعه بیشتر
آموزش کامل کار با آرایه‌ها و اشیاء در جاوا اسکریپت: ایجاد، دستکاری و پیمایش
1403/06/02 21:08

آموزش کامل کار با آرایه‌ها و اشیاء در جاوا اسکریپت: ایجاد، دستکاری و پیمایش

مطالعه بیشتر
Async/Await: نوشتن کدهای خواناتر و ناهم‌زمان در جاوا اسکریپت - آموزش کامل با مثال‌ها
1403/07/30 20:50

Async/Await: نوشتن کدهای خواناتر و ناهم‌زمان در جاوا اسکریپت - آموزش کامل با مثال‌ها

مطالعه بیشتر
نصب Node.js و Create React App: شروع پروژه‌های React.js به‌صورت آسان
1402/06/28 01:09

نصب Node.js و Create React App: شروع پروژه‌های React.js به‌صورت آسان

مطالعه بیشتر
واحدهای CSS مدرن: آموزش استفاده از vw، vh، vmin و vmax برای طراحی واکنش‌گرا
1403/08/11 20:43

واحدهای CSS مدرن: آموزش استفاده از vw، vh، vmin و vmax برای طراحی واکنش‌گرا

مطالعه بیشتر
مقدمه‌ای بر CSS و نحوه اضافه کردن آن به HTML: راهنمای ساده و کامل برای مبتدیان
1402/06/04 23:43

مقدمه‌ای بر CSS و نحوه اضافه کردن آن به HTML: راهنمای ساده و کامل برای مبتدیان

مطالعه بیشتر

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