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