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 نقطة وتُصنَّف مشكلة متوسطة الخطورة — ليس لأن الترويسة وحدها كارثة، بل لأن غيابها علامة موثوقة على أن الأساسيات لم تُحكَم.
ما قد يكلّفك هذا
هذه سيناريوهات واقعية على مستوى الأعمال — لا مسرحية أسوأ الحالات.
-
“المرفق غير الضار” الذي لم يكن كذلك. تُدير بوابة دعم أو سوقاً يرفع فيها العملاء ملفات — إيصالات، صور، مستندات. يرفع مهاجم ملفاً يخزّنه نظامك ويقدّمه كصورة. وبدون nosniff، يُخمّن متصفح ضحية أن الملف فعلاً سكربت ويشغّله — سارقاً بهدوء جلسة ذلك الزائر المسجَّل دخولها على موقعك. والآن المهاجم هو هو: يضع الطلبات، ويقرأ الرسائل، ويغيّر التفاصيل. وتكتشف الأمر حين يبدأ العملاء بالشكوى من نشاط لم يقوموا به.
-
الصفقة التي تتعثّر على استبيان أمني. يُجري فريق مشتريات عميل أكبر مسحاً آلياً لموقعك قبل التوقيع. وتظهر ترويسات الأمن المفقودة فوراً. وحتى لو لم يُستغَلّ شيء أبداً، يقول التقرير “ترويسات أمن الويب الأساسية غائبة”، وفجأة تُجيب على أسئلة معالجة وتدفع موعد إغلاقك أسابيع — بسبب إصلاح كان سيستغرق خمس دقائق.
-
تجديد التأمين السيبراني الذي يصبح أصعب. يُجري مزيد من شركات التأمين الآن مسوحاً خارجية قبل التسعير أو التجديد. وملفّ ترويسات نظيف دليل رخيص على النظافة؛ والمفقود علامة سوداء صغيرة، مكدَّسةً مع غيرها، تدفع قسطك للأعلى أو شروطك للأسفل.
-
ضربة السمعة التي لا يمكن التراجع عنها بسهولة. إذا تتبّع حادث اختطاف جلسة إلى ملف قُدِّم من نطاقك، فالقصة ليست “ترويسة غامضة كانت مفقودة” — بل “[نشاطك التجاري] سرّب حسابات عملاء.” تلك هي النسخة التي يتذكّرها العملاء، وتكلّف أكثر بكثير مما كان سيكلّفه الإصلاح.
لا شيء من هذا يتطلب مهاجماً متطوّراً. فإساءة استغلال تخمين نوع المحتوى مفهومة جيداً ومؤتمتة، وهو بالضبط سبب تعليم الماسحات للترويسة المفقودة بهذا الحزم.
ما هو فعلاً
حين يستقبل متصفح ملفاً، يُفترَض بالخادم وسمه بـ نوع محتوى (مثلاً 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/وكيل مشابه) — غالباً أسرع مكان للقيام به، يغطّي الموقع كله دفعة واحدة:
- استخدم Response Header Transform Rule (Rules ← Transform Rules ← Modify Response Header) لـ ضبط
X-Content-Type-Optionsعلىnosniffلكل الطلبات الواردة. هذا يطبّقها على مستوى الموقع دون لمس الخادم الأصلي.
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. اختبر الموقع بإيجاز للتأكد من عدم تعطّل أي شيء مُنسَّق أو مُبرمَج — على موقع مبنيّ بشكل صحيح، لن يتعطّل شيء.
الأخطاء الشائعة
- ضبطها على الصفحة الرئيسية فقط. يجب أن تكون الترويسة على كل استجابة — بما في ذلك الصور والسكربتات وأوراق الأنماط والملفات المرفوعة — لأن تلك هي الموارد التي يؤثر فيها التخمين. طبّقها على مستوى الخادم أو CDN لتكون شاملة، لا صفحة بصفحة.
- خطأ مطبعي في القيمة. القيمة الصالحة الوحيدة هي
nosniff. وأي شيء آخر (قيمة فارغة، أو خطأ إملائي) يُفشِل الفحص ولا يوفّر حماية. وستُبلِّغ الماسحة بالقيمة التي رأتها فعلاً لتتمكن من رصد خطأ مطبعي. - افتراض أنها تحلّ محلّ سياسة أمن المحتوى. nosniff طبقة واحدة. وهي لا تتحكم في أي السكربتات يُسمَح بتشغيلها — تلك مهمة CSP. أضِف nosniff الآن كفوز سريع، وعامِل CSP سليماً كمتابعة أكبر.
- إزالة “التكرار”. إن ضبطها كل من CDN والأصل، فستراها مرتين. وذلك غير ضار — لا تُمضِ وقتاً في نزع إحداهما.
- الدفع مقابلها. إنها تغيير إعداد مجاني. المراقبة والتدقيقات ولوحات المحفظة مدفوعة بحقّ؛ أمّا إضافة ترويسة واحدة فلا.
سلّم هذا للشخص التقني لديك
الملخّص التقني: يفحص هذا الفحص ترويسات استجابة 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 كامل.