ملف نصي رفعه مستخدم ممكن ينفتح كصفحة؟ حط nosniff
الهيدر X-Content-Type-Options: nosniff بيقول للمتصفح يمشي على Content-Type يلي بعته السيرفر وما يخمّن نوع الملف من محتواه، فملف text/plain فيه HTML بيضل نص.

مستخدم رفع ملف اسمه notes.txt لموقعك، وجوّاه سطور HTML وسكربت. السيرفر بيقدّمه من نفس الدومين، ولو المتصفح قرّر إنو هاد شكله صفحة، صار عندك صفحة ما كتبتها إنت عم تشتغل باسم موقعك. بهالمقال رح تعرف ليش المتصفح ممكن يخمّن، وكيف تمنعه بهيدر واحد.
شو هو تخمين نوع الملف بالمتصفح؟
تخمين نوع الملف (MIME sniffing) هو إنو المتصفح يقرا محتوى الرد ليقرّر شو نوعه، بدل ما يمشي على هيدر الـ Content-Type يلي بعته السيرفر.
ورقة هيدرات HTTP عند OWASP بتقول إنو هالتخمين ممكن يحوّل أنواع ملفات ما بتشتغل لأنواع بتشتغل. يعني ملف نصي أو صورة ممكن يتعامل معه المتصفح كأنه شي بينفّذه.
شو بيعمل X-Content-Type-Options: nosniff؟
الـ X-Content-Type-Options هيدر رد بيقول للمتصفح إنو أنواع الملفات بهيدر الـ Content-Type لازم تنحترم وما تتغيّر، وإلو قيمة وحدة: nosniff.
X-Content-Type-Options: nosniffحسب صفحة X-Content-Type-Options على MDN، الهيدر بيعمل تلات شغلات:
بيوقّف الطلب إذا وجهته
styleونوعه مشtext/css، أو إذا وجهتهscriptونوعه مش نوع JavaScript.بيمنع التخمين لكل أنواع الردود التانية، فالمتصفح بيستعمل الـ Content-Type المكتوب بلا ما يفحص المحتوى.
بيمنع المتصفح يعامل الرد كـ
text/htmlلما ينفتح بنافذة أو إطار، والـ Content-Type ناقص أو نوعه مش HTML.
كيف بيحمي هالهيدر الملفات المرفوعة؟
الهيدر بيحمي الملفات المرفوعة لأنو المتصفح بيعرضها حسب النوع يلي بعته السيرفر: ملف نصي بيضل نص، حتى لو جوّاه HTML.
نفس صفحة MDN بتعطي هالمثال بالزبط: إذا السيرفر بعت رد بـ Content-Type: text/plain ومعه X-Content-Type-Options: nosniff، المتصفح ما رح يفسّره كـ HTML، حتى لو المحتوى فيه وسوم HTML:
Content-Type: text/plain
X-Content-Type-Options: nosniff
<script>alert(document.domain)</script>هالرد بيطلع بالمتصفح سطر نص، والسكربت ما بيشتغل.
ليش لازم يكون Content-Type صح كمان؟
الـ Content-Type لازم يكون صح لأنو nosniff بيخلّي المتصفح يصدّقه بالحرف: نوع غلط على ملف CSS أو JavaScript بيخلّي المتصفح يوقّفه.
توصية OWASP شغلتين سوا: اضبط الـ Content-Type صح بكل الموقع، وحط X-Content-Type-Options: nosniff. ونفس الورقة بتقول إنو خاصية charset لازمة لحتى تمنع XSS بصفحات HTML، ومثالها:
Content-Type: text/html; charset=UTF-8وصفحة MDN بتقول إنو يلي بيفحصوا أمان المواقع عادة بيتوقعوا يلاقوا هالهيدر، ويلاقوا الـ Content-Type صح لكل الملفات.
من وين تبلّش هلق؟
افتح ملف مرفوع من مستخدم بموقعك، وملف CSS وملف JavaScript، وشوف هيدرات الرد بأدوات المطوّر. إذا ما في X-Content-Type-Options: nosniff، زيده على كل الردود من السيرفر، وتأكد إنو كل ملف رايح بنوعه الصح قبل ما تنشر، لحتى ما يوقف ملف CSS كان رايح بنوع غلط.
وإذا عم تكمّل هيدرات الأمان، شوف CSP بوضع Report-Only لتحدّ مين بيشغّل سكربتات بصفحتك، وتفعيل HSTS صح. وإذا بدك فحص كامل لطريقة رفع الملفات وباقي المنصة، مُحَصَّن بيعمله.
موقعك بيقبل ملفات من المستخدمين؟ بأي نوع بيرجّعها؟
أسئلة شائعة
nosniff بيكفي لحاله؟
لأ. nosniff بيخلّي المتصفح يمشي على Content-Type يلي بعته، فلازم يكون Content-Type صح لكل ملف بالموقع، وهيك بتنصح OWASP.
شو بيصير لملف CSS جاي بنوع غلط؟
مع nosniff، المتصفح بيوقّف طلب الـ style إذا نوعه مش text/css، وبيوقّف طلب الـ script إذا نوعه مش نوع JavaScript.
ليش بتنصح OWASP بـ charset بصفحات HTML؟
ورقة OWASP بتقول إنو خاصية charset بـ Content-Type لازمة لحتى تمنع XSS بصفحات HTML، ومثالها text/html; charset=UTF-8.


