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

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

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

چرا امنیت آپلود فایل تا این حد حیاتی است؟

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

سه قانون طلایی گوگل در اعتبارسنجی فایل‌ها

گوگل در مستندات امنیتی خود سه نکته کلیدی را برای فرآیند آپلود فایل پیشنهاد می‌کند:

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

گام اول: پیکربندی امن سرور در php.ini

پیش از نوشتن هر کدی، باید مطئمن شوید که تنظیمات پیش‌فرض PHP پذیرای حجم مدنظر شما هستند. فایل php.ini خود را بررسی و مقادیر زیر را متناسب با نیازتان تنظیم کنید:

upload_max_filesize = 2M
post_max_size = 8M
memory_limit = 128M

گام دوم: بررسی حجم فایل در سمت سرور

اولین لایه دفاعی، بررسی حجم فایل ارسال شده است. ما باید سایز فایل را با مقدار مجاز خود مقایسه کنیم. به نمونه کد زیر دقت کنید:


// حداکثر حجم مجاز: 2 مگابایت
$max_file_size = 2 * 1024 * 1024; 

if ($_FILES['uploaded_file']['size'] --> $max_file_size) {
    die("خطا: حجم فایل ارسالی بیشتر از حد مجاز (2 مگابایت) است.");
}

گام سوم: اعتبارسنجی امن نوع فایل (MIME Type) با finfo

بسیاری از برنامه‌نویسان تازه کار از $_FILES['uploaded_file']['type'] استفاده می‌کنند که یک فاجعه امنیتی است! این فیلد مستقیماً توسط مرورگر کلاینت ارسال شده و به سادگی قابل جعل است. راهکار استاندارد گوگل، استفاده از افزونه داخلی Fileinfo در PHP برای خواندن بایت‌های امضای فایل است:


// نمونه کد اعتبارسنجی واقعی نوع فایل
$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];

$file_tmp = $_FILES['uploaded_file']['tmp_name'];

// ایجاد یک شیء finfo
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$real_mime_type = finfo_file($finfo, $file_tmp);
finfo_close($finfo);

if (!in_array($real_mime_type, $allowed_types)) {
    die("خطا: نوع فایل نامعتبر است. تنها فرمت‌های JPG، PNG و GIF مجاز هستند.");
}

گام چهارم: بررسی و پاک‌سازی پسوند فایل (Extension White-listing)

علاوه بر MIME Type، باید بررسی کنیم که پسوند فایل نیز جزو لیست سفید ما باشد. استفاده از لیست سیاه خطرناک است؛ زیرا ممکن است برخی پسوندهای اجرایی مانند phtml, php5 یا exe را فراموش کنید. همیشه از رویکرد لیست سفید (White-list) استفاده کنید:


$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
$file_name = $_FILES['uploaded_file']['name'];

// استخراج پسوند فایل
$file_extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));

if (!in_array($file_extension, $allowed_extensions)) {
    die("خطا: پسوند فایل مجاز نیست.");
}

گام پنجم: تغییر نام فایل به شیوه امن

برای جلوگیری از حملات Directory Traversal (پیمایش دایرکتوری) و اوررایت شدن فایل‌های همنام، نام اصلی فایل را حذف کرده و یک نام تصادفی و منحصر‌به‌فرد تولید کنید:


$upload_dir = 'uploads/';
// تولید یک نام رندوم هش شده به همراه پسوند اصلی
$new_file_name = md5(uniqid(rand(), true)) . '.' . $file_extension;
$destination = $upload_dir . $new_file_name;

if (move_uploaded_file($file_tmp, $destination)) {
    echo "فایل شما با موفقیت و به صورت امن آپلود شد!";
} else {
    echo "خطا در ذخیره‌سازی فایل.";
}

نتیجه‌گیری استاندارد امنیتی گوگل

با ترکیب سه لایه دفاعی بالا یعنی کنترل دقیق حجم فایل، بررسی بایت‌های جادویی با finfo، و تغییر نام تصادفی فایل، ضریب امنیت وب‌سایت شما طبق موازین و استانداردهای موتورهای جستجو و گوگل به حداکثر خود می‌رسد. همیشه به یاد داشته باشید که امنیت یک فرآیند مستمر است و باید مداوم به‌روزرسانی شود.


پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

جمع‌بندی، مرور مطالب و پروژه نهایی: ایجاد یک اپلیکیشن وب کامل با جاوا اسکریپت - راهنمای گام به گام
1403/08/05 21:21

جمع‌بندی، مرور مطالب و پروژه نهایی: ایجاد یک اپلیکیشن وب کامل با جاوا اسکریپت - راهنمای گام به گام

مطالعه بیشتر
مدیریت ترتیب نمایش با z-index در CSS: آموزش کامل و کاربردی
1403/08/11 21:28

مدیریت ترتیب نمایش با z-index در CSS: آموزش کامل و کاربردی

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

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

مطالعه بیشتر
آموزش اصول کار با WebSockets و ارتباطات بلادرنگ در وب: راهنمای کامل
1403/08/05 20:55

آموزش اصول کار با WebSockets و ارتباطات بلادرنگ در وب: راهنمای کامل

مطالعه بیشتر
آموزش Event Handling و v-on در Vue.js | مدیریت رویدادها با مثال کاربردی
1404/09/22 00:17

آموزش Event Handling و v-on در Vue.js | مدیریت رویدادها با مثال کاربردی

مطالعه بیشتر
آموزش مدیریت Box Model و ترکیب اجزای آن با CSS: کنترل دقیق فاصله‌ها و ابعاد عناصر
1402/06/05 23:30

آموزش مدیریت Box Model و ترکیب اجزای آن با CSS: کنترل دقیق فاصله‌ها و ابعاد عناصر

مطالعه بیشتر
تفاوت آرایه عددی، انجمنی و چندبعدی در PHP: راهنمای جامع و کاربردی
1405/03/24 01:07

تفاوت آرایه عددی، انجمنی و چندبعدی در PHP: راهنمای جامع و کاربردی

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

آموزش ارث‌بری (Inheritance) در جاوا اسکریپت: نحوه استفاده از پروتوتایپ‌ها و کلاس‌ها

مطالعه بیشتر
آموزش Responsive Design با استفاده از Media Queries: طراحی واکنش‌گرا برای تمامی دستگاه‌ها
1402/06/10 18:07

آموزش Responsive Design با استفاده از Media Queries: طراحی واکنش‌گرا برای تمامی دستگاه‌ها

مطالعه بیشتر
پیمایش اشیاء و آرایه‌ها در جاوا اسکریپت: راهنمای کامل برای Object.keys، Object.values، for...in و for...of
1403/07/04 18:12

پیمایش اشیاء و آرایه‌ها در جاوا اسکریپت: راهنمای کامل برای Object.keys، Object.values، for...in و for...of

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

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

مطالعه بیشتر
تفاوت Session و Cookie در PHP؛ راهنمای جامع و کاربردی طبق استاندارد گوگل
1405/05/01 20:14

تفاوت Session و Cookie در PHP؛ راهنمای جامع و کاربردی طبق استاندارد گوگل

مطالعه بیشتر

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