SVG یک تصویر برداری مبتنی بر XML است و میتواند محتوای فعال یا ارجاع بیرونی داشته باشد. بنابراین افزودن MIME type به فهرست وردپرس بهتنهایی فایل را امن نمیکند. اگر فقط یک لوگوی ثابت لازم دارید، ابتدا نیاز به SVG را بسنجید؛ برای فایلهای نامطمئن، خروجی تصویری مناسب میتواند مسیر سادهتری باشد.
چرا یک قطعه کد upload_mimes کافی نیست؟
پسوند و Content-Type میتوانند با محتوای واقعی ناسازگار باشند. یک فیلتر ساده ممکن است مانع اولیه را بردارد ولی script، event handler یا ارجاع نامناسب را پاک نمیکند. تعریف ALLOW_UNFILTERED_UPLOADS برای همه فایلها نیز دامنه خطر را بیش از نیاز باز میکند.
روند پیشنهادی برای SVG لازم
- فایل اصلی را از منبع قابل اعتماد و با مجوز استفاده معتبر بگیرید.
- ابزار یا افزونه نگهداریشدهای انتخاب کنید که مشخصاً SVG را با parser و sanitizer مناسب پاکسازی میکند؛ صرف نمایش preview کافی نیست.
- دسترسی آپلود را به نقشهای لازم محدود و روی کپی آزمایشی کنترل کنید.
- فایل را پس از پاکسازی ذخیره و خروجی نهایی را با نسخه موردانتظار از نظر شکل و لینک بیرونی بررسی کنید.
- نمایش در کتابخانه، قالب و موبایل را جدا آزمایش کنید.
محتوای ورودی کاربران
برای فرم عمومی یا پروفایل کاربر، سیاست محدودتری از فایل داخلی برند لازم است. اندازه، تعداد، نام فایل، نوع واقعی و مجوز کاربر را کنترل کنید. sanitizer سفارشی مبتنی بر چند جایگزینی regex برای XML پیچیده قابل اتکا نیست. پردازشگر هم باید بهروز، با محدودیت منابع و بدون دریافت ناخواسته منابع بیرونی تنظیم شود.
نحوه سروکردن مهم است
نمایش SVG بهصورت img، درج inline و بازکردن مستقیم فایل در مرورگر رفتار یکسان ندارند. فایل پاکسازیشده را بدون نیاز inline نکنید و به محافظت یک حالت نمایش برای همه حالتها اتکا نکنید. سیاست سرور و origin فایلها باید با ریسک محتوای فعال هماهنگ باشد؛ خاموشکردن CSP یا اعتبارسنجی برای حل نمایش راهحل عمومی نیست.
چکلیست تحویل
- هیچ قاعده عمومی برای مجازکردن همه فرمتها باقی نمانده باشد.
- فقط نقش لازم بتواند SVG ارسال کند و مسیر عمومی بدون احراز هویت مجاز نشده باشد.
- فایل نهایی از نظر ابعاد، viewBox و نمایش بررسی شود.
- اگر فایل رد میشود، علت را در لاگ ابزار و سیاست MIME پیدا کنید؛ تغییر صرف پسوند مشکل را حل نمیکند.
مطالعه مرتبط
منابع و مستندات
بازبینی محتوا و منابع: ۲۶ مهر ۱۴۰۵.