Defaults.Exposed

Defaults.Exposedالإصلاحات › الحماية من تخمين نوع المحتوى (X-Content-Type-Options)

كيف تُصلح الحماية من تخمين نوع المحتوى (X-Content-Type-Options)

ترويسة من سطر واحد توقف المتصفحات عن تخمين ماهية الملف فعلاً. بدونها، يمكن أن يُساء قراءة ملف يرفعه أحدهم إلى موقعك — أو ملف على صفحاتك — من قِبل المتصفح فيُشغَّل كشيفرة، وهو بالضبط كيف تحوّل بعض الهجمات ملفاً مرفوعاً يبدو غير ضار إلى وسيلة لسرقة جلسات عملائك.

الخلاصة لعملك: غياب هذه الترويسة علامة واضحة قابلة للمسح على أن الأساسيات ليست في مكانها. وبمفردها نادراً ما تُسقِط موقعاً، لكنها مقترنةً بنموذج رفع ملفات أو محتوى من المستخدمين تفتح طريقاً لمهاجم لتشغيل شيفرة خبيثة في متصفحات زوّارك — مختطِفاً جلسات مسجَّل دخولها، وسارقاً تفاصيل إدخال البطاقات أو تسجيل الدخول، وواضعاً إياك على الجانب الخطأ من محادثة اختراق بيانات. إنه من أرخص الإصلاحات في الأمن: سطر واحد، مجاني، نحو خمس دقائق.

ماذا قد يكلّفك هذا

لماذا يهمّ. تحاول المتصفحات، حين يكون الخادم غامضاً بشأن ماهية الملف، أن تخمّن ("sniff") نوع المحتوى. ويستغلّ المهاجمون ذلك التخمين: يرفعون ملفاً يصفه الخادم كصورة، لكنهم يصوغون محتواه بحيث يقرّر المتصفح أنه فعلاً JavaScript — فيشغّله. وترويسة X-Content-Type-Options: nosniff تُخبر كل متصفح بالتوقف عن التخمين والوثوق بالنوع المعلَن من الخادم، مُغلِقةً تلك الفئة كلها من الخداع. إنه فحص مُقيَّم يستحق 25 نقطة ويُصنَّف متوسط الخطورة عند غيابه.

النسخة المختصرة للمالك

هناك افتراض هادئ مبنيّ في كل متصفح ويب: حين يُنزِّل ملفاً من موقعك، يحاول معرفة أيّ نوع من الملفات هو. وعادة يثق بخادمك. لكن إن كان خادمك غامضاً، فسيُخمّن المتصفح — وذلك التخمين يُسمّى تخمين نوع المحتوى (MIME-sniffing).

والمشكلة أن المهاجمين يستطيعون التلاعب بالتخمين. يستطيعون صياغة ملف يعتقد خادمك بصدق أنه صورة غير ضارة، لكن المتصفح، إذا تُرِك ليُخمّن، يقرّر أنه فعلاً قطعة شيفرة برمجية — ثم يشغّلها، داخل متصفح عميلك مباشرة، على نطاقك.

هناك تعليمة من سطر واحد تُطفئ التخمين: X-Content-Type-Options: nosniff. إنها تُخبر كل متصفح، “لا تُخمّن — ثِق تماماً بما يخبرك به خادمي.” تلك هي كل الإصلاح. إنه مجاني، يستغرق نحو خمس دقائق، وعلى موقع مبنيّ بشكل صحيح لا يُعطّل شيئاً.

يبحث هذا الفحص عن تلك الترويسة. إن كانت مفقودة، تخسر 25 نقطة وتُصنَّف مشكلة متوسطة الخطورة — ليس لأن الترويسة وحدها كارثة، بل لأن غيابها علامة موثوقة على أن الأساسيات لم تُحكَم.

ما قد يكلّفك هذا

هذه سيناريوهات واقعية على مستوى الأعمال — لا مسرحية أسوأ الحالات.

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

ما هو فعلاً

حين يستقبل متصفح ملفاً، يُفترَض بالخادم وسمه بـ نوع محتوى (مثلاً image/png لصورة PNG أو text/html لصفحة ويب). تاريخياً، لم تثق المتصفحات بذلك الوسم تماماً — جزئياً لأن بعض الخوادم أخطأت فيه — فكانت تختلس النظر إلى بايتات الملف الفعلية وتقرّر بنفسها. ذلك الاختلاس هو تخمين نوع المحتوى.

كان راحة تحوّلت إلى عبء. فإذا استطاع مهاجم إيصال ملف إلى موقعك (عبر نموذج رفع، أو حقل تعليقات، أو مستند مستورَد) والتأثير في محتواه، فيمكنه صياغة شيء يصفه الخادم ببراءة لكن المتصفح يخمّنه كسكربت قابل للتنفيذ. ثم يشغّله المتصفح على نطاقك، بكل الثقة التي يحملها نطاقك.

X-Content-Type-Options: nosniff يزيل التخمين كلياً. ومع ضبطه، يُقال للمتصفح: استخدم النوع المُعلَن من الخادم ولا شيء غيره. فالملف المُوسَّم كصورة يُعامَل كصورة، نقطة — حتى لو بدا محتواه كسكربت. ويُغلَق متّجه الهجوم.

كيف يبدو “الجيد”: كل استجابة من موقعك — الصفحات والأصول على حدّ سواء — تحمل هذه الترويسة بالضبط:

X-Content-Type-Options: nosniff

لا توجد قيمة صالحة أخرى ولا شيء للضبط. وإذا أضافها كل من CDN لديك وخادمك (فترى nosniff, nosniff)، فذلك سليم ويُحتسَب اجتيازاً.

كيفية الإصلاح (مجاناً، ~5 دقائق)

سلّم هذا القسم لمن يدير موقعك — الشخص التقني لديك، أو مطوّر الويب، أو دعم الاستضافة. الإصلاح مجاني وسريع؛ لا شيء لشرائه. ما تطلبه بسيط: “أضِف ترويسة الاستجابة X-Content-Type-Options: nosniff إلى كل صفحة وأصل على الموقع.”

إليك التفصيل لهم، حسب المنصة الشائعة.

Cloudflare (أو CDN/وكيل مشابه) — غالباً أسرع مكان للقيام به، يغطّي الموقع كله دفعة واحدة:

Nginx — أضِف داخل كتلة server (أو location) ذات الصلة:

add_header X-Content-Type-Options "nosniff" always;

كلمة always تضمن إرسالها على استجابات الخطأ أيضاً. أعِد تحميل Nginx بعد الحفظ.

Apache — يتطلب تفعيل mod_headers؛ في إعداد الموقع أو .htaccess:

Header always set X-Content-Type-Options "nosniff"

IIS / استضافة Windows — في web.config تحت <system.webServer>:

<httpProtocol>
  <customHeaders>
    <add name="X-Content-Type-Options" value="nosniff" />
  </customHeaders>
</httpProtocol>

Node / Express — اضبطها لكل استجابة:

app.use((req, res, next) => {
  res.setHeader('X-Content-Type-Options', 'nosniff');
  next();
});

(أو استخدم حزمة helmet، التي تضبط هذه وعدة ترويسات أمن أخرى افتراضياً.)

مواقع Google Workspace / Microsoft 365: هذان يديران بريدك ومستنداتك، لا استضافة موقعك العام، فلا تُضبَط الترويسة هناك — بل تُضبَط حيثما يُقدَّم موقعك نفسه (CDN لديك، أو خادم الويب، أو منشئ المواقع). وإذا كنت تستخدم منشئ مواقع مُستضافاً (Squarespace، Wix، Shopify وما شابه)، فكثير منها يضيف هذه الترويسة لك تلقائياً؛ تحقّق من النتيجة بدلاً من الافتراض، واسأل دعمهم إن كانت مفقودة.

بعد النشر، تحقّق منها. أعِد إجراء مسحك، أو اطلب من مطوّرك فحص ترويسات الاستجابة في أدوات مطوّر المتصفح (تبويب Network ← انقر أي طلب ← Response Headers) والتأكد من وجود X-Content-Type-Options: nosniff. اختبر الموقع بإيجاز للتأكد من عدم تعطّل أي شيء مُنسَّق أو مُبرمَج — على موقع مبنيّ بشكل صحيح، لن يتعطّل شيء.

الأخطاء الشائعة

سلّم هذا للشخص التقني لديك

الملخّص التقني: يفحص هذا الفحص ترويسات استجابة HTTP ويجتاز حين تكون X-Content-Type-Options موجودة وقيمتها (غير الحساسة لحالة الأحرف) تحتوي على nosniff — بما في ذلك حالة المصدر المتعدد nosniff, nosniff حيث يضبطها كل من CDN والأصل. أمّا المفقودة أو أي قيمة غير nosniff فتفشل. إنه فحص P2 مُقيَّم يستحق 25 نقطة، يُصنَّف خطورة متوسطة عند الفشل، ويرتبط بـ OWASP Top 10 A05 (سوء إعداد الأمن). والمعالجة ترويسة استجابة ثابتة واحدة مطبَّقة عبر كل الاستجابات؛ لا معاملات ولا قيم بديلة صالحة. اضبطها على الحافة (CDN) لتغطية الموقع كله، أو على خادم الويب بدلالة always لتُصدَر على استجابات الخطأ أيضاً، ثم تأكد منها في ترويسات الاستجابة.

الأسئلة الشائعة

نحن لا نسمح لأي أحد برفع ملفات. هل ما زلنا نحتاج هذا؟

نعم، ولا يزال يستحق الفعل. الترويسة دفاع متعدد الطبقات: فهي توقف أيضاً المتصفح عن إساءة قراءة السكربتات وأوراق الأنماط وملفات البيانات المُقدَّمة من موقعك، ما يحمي من عدة حِيَل برمجة عبر المواقع حتى على مواقع بلا نموذج رفع. وهي لا تكلّف شيئاً ولا تُعطّل أبداً موقعاً مُعدّاً بشكل صحيح، فلا سبب لتخطّيها.

هل سيُعطّل إضافة هذا أي شيء على موقعنا؟

نادراً جداً. nosniff ببساطة يجعل المتصفحات تحترم نوع المحتوى الذي يرسله خادمك أصلاً. والطريقة الوحيدة التي يسبّب بها متاعب هي إن كان خادمك يُسيء وسم الملفات — مثلاً إرسال ورقة أنماط أو سكربت بالنوع الخطأ. فإذا تعطّل شيء، فذلك خلل حقيقي كشفه nosniff لا سبّبه، ويستحق الإصلاح على أي حال. اختبر مرة بعد النشر.

كيف يبدو 'الجيد' فعلاً؟

ترويسة استجابة واحدة على كل صفحة وأصل: X-Content-Type-Options: nosniff. تلك هي كل الإعداد الصحيح — لا توجد قيم صالحة أخرى ولا ضبط للقيام به.

كل من CDN لدينا (Cloudflare أو مشابه) وخادمنا يضيفها — هل هذه مشكلة؟

لا. رؤية القيمة مرتين ("nosniff, nosniff") لأن كلاً من CDN والأصل يضبطها أمر سليم تماماً ويظلّ يجتاز. لستَ بحاجة لإزالة إحداهما.

هل يكلّف إصلاح هذا مالاً؟

لا. الإصلاح سطر واحد من الإعداد المجاني على خادم الويب أو CDN لديك. وأي شخص يتقاضى منك مقابل إضافة ترويسة واحدة يبالغ في السعر. والأشياء الوحيدة التي تستحق الدفع مقابلها في هذا المجال هي المراقبة المستمرة، أو عرض محفظة عبر مواقع عديدة، أو تدقيق رسمي — لا الإصلاح نفسه.

كيف يختلف هذا عن سياسة أمن المحتوى (CSP)؟

إنهما متكاملان. CSP يتحكم في أي السكربتات والموارد يُسمَح بتحميلها أصلاً؛ وnosniff يوقف المتصفح عن سوء تصنيف ملف يحمّله فعلاً. أنت تريد كليهما. وnosniff أبسط وأسرع بكثير في الإضافة، فهو خطوة أولى جيدة في طريق CSP كامل.