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

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

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


پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

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

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

مطالعه بیشتر
بررسی کتابخانه‌های محبوب جاوا اسکریپت: آشنایی با Lodash و Moment.js - مزایا و کاربردها
4م آبان 1403

بررسی کتابخانه‌های محبوب جاوا اسکریپت: آشنایی با Lodash و Moment.js - مزایا و کاربردها

مطالعه بیشتر
آموزش استفاده از position در CSS: نحوه موقعیت‌دهی عناصر در صفحات وب
9م آبان 1403

آموزش استفاده از position در CSS: نحوه موقعیت‌دهی عناصر در صفحات وب

مطالعه بیشتر
استفاده از Viewports و Viewport Units در CSS: طراحی واکنش‌گرا با vw، vh، vmin و vmax
16م آبان 1403

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

مطالعه بیشتر
مفاهیم پیشرفته در کلاس‌ها و وراثت (Super, Extends) در جاوا اسکریپت: راهنمای کامل و مثال‌ها
29م مهر 1403

مفاهیم پیشرفته در کلاس‌ها و وراثت (Super, Extends) در جاوا اسکریپت: راهنمای کامل و مثال‌ها

مطالعه بیشتر
آموزش ایجاد Transitions و انیمیشن‌های صفحه بارگذاری (Loader) در CSS: طراحی لودرهای جذاب
16م آبان 1403

آموزش ایجاد Transitions و انیمیشن‌های صفحه بارگذاری (Loader) در CSS: طراحی لودرهای جذاب

مطالعه بیشتر
آموزش جامع و گام‌به‌گام حلقه for در PHP + مثال‌های کاربردی
4م تیر 1405

آموزش جامع و گام‌به‌گام حلقه for در PHP + مثال‌های کاربردی

مطالعه بیشتر
آموزش کامل تفاوت echo و print در PHP به زبان ساده
21م خرداد 1405

آموزش کامل تفاوت echo و print در PHP به زبان ساده

مطالعه بیشتر
آموزش مفاهیم اولیه CSS Grid Layout: طراحی شبکه‌های پیچیده و واکنش‌گرا راهنمای کامل
6م شهریور 1402

آموزش مفاهیم اولیه CSS Grid Layout: طراحی شبکه‌های پیچیده و واکنش‌گرا راهنمای کامل

مطالعه بیشتر
مدیریت خطاها در Async/Await و Promises در جاوا اسکریپت: راهنمای کامل با مثال‌های عملی
30م مهر 1403

مدیریت خطاها در Async/Await و Promises در جاوا اسکریپت: راهنمای کامل با مثال‌های عملی

مطالعه بیشتر
درک و استفاده از Watchers در Vue.js | آموزش Watch با مثال کاربردی
28م آذر 1404

درک و استفاده از Watchers در Vue.js | آموزش Watch با مثال کاربردی

مطالعه بیشتر
سیر تا پیاز عملگرهای ریاضی در PHP + مثال‌های کاربردی
24م خرداد 1405

سیر تا پیاز عملگرهای ریاضی در PHP + مثال‌های کاربردی

مطالعه بیشتر

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