انتقل للمحتوى
المحرر والوسائط

هذا النوع من الملفات غير مسموح في ووردبريس؟ تجربة MIME حقيقية

بتحاول ترفع SVG او خط او ملف بيانات، وووردبريس بحكيلك: عذرا، غير مسموح لك رفع هذا النوع من الملفات؟ الخطا مش دايما مشكلة صلاحية مدير. ووردبريس بفحص امتداد الاسم، نوع MIME المتوقع، نوع المحتوى الحقيقي، وقائمة الانواع المسموحة للحساب والموقع.

عملنا تجربة رفع حقيقية باربعة ملفات: JPEG صالح، SVG صالح، كود PHP غير ضار داخل المختبر لكنه متنكر باسم JPG، وامتداد نصي خاص اسمه .smsmnote. مررنا الملفات من فحص ووردبريس ثم من مسار wp_handle_sideload() الذي يستخدم منطق الرفع نفسه، وسجلنا النجاح ورسالة الرفض ونظفنا كل ملف مرفوع.

المشكلة متكررة في موضوع حديث في دعم ووردبريس عن SVG وZIP، وظهرت كمان في نقاش ريديت عن رفع SVG. استخدمنا النقاشات لاختيار السؤال، اما الملفات والنتائج التالية فمن مختبرنا.

النتيجة باختصار

  • JPEG الحقيقي كان نوعه image/jpeg، وطابق امتداد .jpg ونجح رفعه.
  • SVG كان ملفا صالحا ونوعه image/svg+xml، لكنه غير موجود في القائمة الافتراضية فرفضه ووردبريس.
  • الملف المتنكر انتهى اسمه بـ .jpg، لكن محتواه كان text/x-php، فرفضه ووردبريس.
  • امتداد المختبر النصي كان مرفوضا، ثم نجح بعد ربط امتداده حصرا بـ text/plain.
  • بعد التجربة ازلنا قاعدة السماح وحذفنا الملفات المرفوعة والمؤقتة.

الامتداد مش هو نوع الملف

الجزء بعد النقطة في الاسم مجرد ادعاء. ممكن تسمي ملفا نصيا photo.jpg من غير ما يتحول إلى صورة. لهذا ووردبريس ما يعتمد على الاسم وحده، وخصوصا مع الصور.

استخدمنا wp_check_filetype_and_ext() مع fileinfo. حسب توثيق ووردبريس الرسمي، الدالة تحاول تحديد النوع الحقيقي ومقارنته بالامتداد وقائمة MIME المسموحة.

تقرير تجربة يقارن JPEG حقيقيا وSVG صالحا وملف كود متنكر بامتداد JPG مع انواع MIME التي اكتشفها ووردبريس
هذه صورة تقرير مبني على الملفات الفعلية: الاسم وحده لم يخدع الفحص، وصحة SVG وحدها لم تجعله مسموحا.

الحالة الاولى واضحة: real-photo.jpg صورة JPEG حقيقية، لذلك رجع الفحص jpg وimage/jpeg. الحالة الثانية ملف SVG سليم، لكن القائمة الافتراضية ما فيها SVG. الحالة الثالثة اسمها يوحي بصورة، لكن fileinfo اكتشف text/x-php، فرجع ووردبريس ext=false وtype=false.

نتائج الرفع الفعلي

بعد الفحص مررنا نسخة مؤقتة من كل ملف إلى معالج الرفع. JPEG انتقل إلى مجلد uploads ورجع نوع image/jpeg. حذفناه بعد تسجيل النجاح. SVG والملف المتنكر بقيا خارج uploads ورجعا الرسالة نفسها: عذرا، غير مسموح لك رفع هذا النوع من الملفات.

تقرير تجربة يظهر نجاح رفع JPEG ورفض SVG الافتراضي ورفض ملف كود يحمل اسم JPG
الرسالة واحدة، لكن سبب SVG مختلف عن سبب الملف المتنكر. الاول خارج القائمة، والثاني لا يطابق الاسم.
صورة JPEG فعلية ابعادها 1200 في 720 استخدمت كحالة الرفع المسموحة في تجربة MIME
هذه صورة JPEG الحقيقية التي اجتازت فحص MIME والرفع، وليست رسما لنتيجة الاختبار.

هذه النقطة مهمة بالتشخيص. اذا ملف SVG صالح ومرفوض، راجع سياسة الانواع. اذا JPG مزعوم يرجع نوعا نصيا او غير معروف، لا تضفه لقائمة المسموح؛ افحص مصدر الملف وافتحه بمحرر صور واحفظ نسخة جديدة.

فيديو توثيق التجربة الفعلية

هذا تسجيل شاشة صامت ومتواصل للاختبار وهو يحدث داخل بيئة محلية معزولة. تظهر الخطوات والنتائج الفعلية لحظة التنفيذ، من غير تركيب صور ثابتة.

تسجيل شاشة صامت ومتواصل لتجربة فعلية داخل بيئة محلية معزولة. يعرض الحالة السليمة، تنفيذ المسبب، ظهور النتيجة، ثم الاصلاح واعادة الفحص. لا يستخدم صورا مركبة.

جربنا قاعدة ضيقة بدل السماح بكل شيء

انشانا ملف نص عادي بامتداد مختبر غير معروف اسمه .smsmnote. قبل اي تعديل كان نوعه الحقيقي text/plain لكنه مرفوض لان الامتداد غير موجود. بعدها اضفنا مؤقتا خريطة واحدة فقط:

smsmnote => text/plain

اعدنا الملف نفسه، فنجح الفحص والرفع. ما استخدمنا wildcard، وما سمحنا بـ PHP او SVG او كل الملفات. بعد القياس ازلنا الفلتر وحذفنا الملف المرفوع. توثيق upload_mimes يوضح ان الفلتر يعدل قائمة الامتدادات وانواع MIME المسموحة.

تقرير تجربة يظهر رفض امتداد smsmnote ثم نجاحه بعد ربطه حصرا بنوع text/plain وازالة الفلتر بعد الاختبار
قاعدة محددة سمحت بامتداد نصي خامل واحد، وبعد الاختبار رجعت القائمة لوضعها السابق وبقي صفر ملف مؤقت.

ليش ووردبريس ما بسمح SVG افتراضيا؟

SVG مش مجرد نقاط ملونة مثل JPEG. هو مستند XML ممكن يحتوي روابط وعناصر نشطة، وبعض الملفات ممكن تحمل JavaScript او محتوى يستغل المتصفح اذا عرض من نفس نطاق الموقع. عشان هيك السماح بالامتداد من غير تعقيمه قرار امني، مش مجرد حل لمشكلة رفع شعار.

اذا الموقع يحتاج SVG، استخدم اداة موثوقة تعقم الملف عند الرفع، وقيد الرفع على ادوار محددة، واختبر الملف الناتج. لا تكتفي باضافة svg => image/svg+xml وتفترض ان كل ملف صار آمنا.

ما الفرق بين MIME والصلاحية؟

ممكن النوع يكون مسموحا للمدير لكنه يفشل من نموذج الزوار. هون افحص المستخدم الفعلي ودور الحساب وnonce ومسار النموذج، مش قائمة MIME فقط. بعض الإضافات عندها قائمة خاصة فوق قائمة ووردبريس، وبعض مواقع Multisite تقيد الانواع من اعدادات الشبكة.

اعمل الاختبار بالحساب والمسار اللذين يفشلان. نجاح الرفع كمدير من مكتبة الوسائط ما يثبت ان نموذج التوظيف يسمح للزائر بـ PDF، والعكس صحيح.

ليش ALLOW_UNFILTERED_UPLOADS مش اول حل؟

السماح غير المفلتر يوسع الخطر وقد لا يحل المسار الذي تستخدمه الإضافة او Multisite. الاهم انه يلغي جزءا من الحماية بدل تعريف الحاجة بدقة. لو بدك CSV لاستيراد منتجات، اسمح CSV بالطريقة التي يدعمها المستورد وللدور المطلوب. لو بدك خطوطا، حدد الامتدادات الفعلية وانواعها واختبر رؤوس الخادم.

لا تسمح بـ php او phtml او ملفات قابلة للتنفيذ داخل uploads. كمان راجع إعداد الخادم حتى لا ينفذ سكربتات من مجلد الرفع، لان طبقة ووردبريس وحدها مش بديل عن إعداد خادم آمن.

تشخيص مرتب للرسالة

  1. اكتب الاسم الكامل والامتداد وحجم الملف.
  2. افحص MIME الحقيقي، مش Content-Type الذي يرسله المتصفح فقط.
  3. جرب ملفا معروفا من نفس النوع لتعرف هل المشكلة بالملف او بالسياسة.
  4. جرب من مكتبة الوسائط بالحساب نفسه، ثم من الإضافة او النموذج الذي يفشل.
  5. افتح Network وسجل رمز HTTP وجسم الرد.
  6. راجع get_allowed_mime_types() للحساب الحالي واعدادات Multisite ان وجدت.
  7. عطل مؤقتا إضافات MIME او SVG المتداخلة على staging، ثم اعد الملف نفسه.
  8. اذا احتجت نوعا جديدا، اضف امتدادا ونوعا محددين مع تحقق وتعقيم يناسبان الملف.

اذا JPG او PNG العادي صار مرفوضا

هون ما بنضيف JPG للقائمة؛ هو مسموح اصلا. افحص النوع الحقيقي. ممكن الملف WebP باسم JPG، او تنزيل HTML لصفحة خطا باسم صورة، او ملف ناقص. افتحه محليا وتأكد انه يعرض، ثم احفظ نسخة جديدة من محرر صور موثوق.

اذا كل الصور الصحيحة مرفوضة، راجع إضافة الحماية، مجلد temp، صلاحيات uploads، وسجل الخادم. رسالة النوع قد تظهر من إضافة قبل وصول الطلب لفحص ووردبريس الاساسي.

تنظيف المختبر

كل رفع ناجح انحذف بعد تسجيل النتيجة. فشل SVG والملف المتنكر من غير انتقال إلى uploads. قاعدة .smsmnote انضافت داخل العملية التجريبية فقط ثم ازيلت. الفحص النهائي سجل صفر ملف رفع مؤقت، وبقيت الإضافة الفعالة الوحيدة إضافة سمسم لاب.

الخلاصة

رسالة هذا النوع من الملفات غير مسموح ممكن تعني سياسة مقصودة او ملفا لا يطابق اسمه. تجربتنا فرقت بين الاثنين: SVG حقيقي لكنه خارج القائمة، وJPG مزعوم محتواه text/x-php. ووردبريس رفض الاثنين، بينما قبل JPEG الحقيقي.

الحل الآمن مش فتح كل الامتدادات. حدد النوع المطلوب، افحص MIME الحقيقي، اسمح بامتداد دقيق للحساب المطلوب، واضف تعقيما اذا كان النوع نشطا مثل SVG. بعدها اعد الرفع ونظف قاعدة الاختبار اذا ما كانت مطلوبة.