Defaults.Exposed

Defaults.Exposedرفع اشکال‌ها › MIME-sniffing protection (X-Content-Type-Options)

چطور MIME-sniffing protection (X-Content-Type-Options) را رفع کنید

یک header یک‌خطی که از حدس زدن مرورگر درباره‌ی اینکه یک فایل واقعاً چیست جلوگیری می‌کند. بدون آن، فایلی که کسی به سایت شما آپلود می‌کند — یا یک فایل روی صفحات خودتان — می‌تواند توسط مرورگر اشتباه خوانده شده و به عنوان کد اجرا شود، که دقیقاً نحوه‌ی تبدیل برخی حملات از یک آپلود بی‌خطر به روشی برای دزدیدن session های مشتریان شما است.

نتیجه نهایی برای کسب‌وکار شما: از دست دادن این header یک نشانه‌ی واضح و قابل اسکن است که پایه‌ها محکم نشده‌اند. به تنهایی به ندرت یک سایت را از کار می‌اندازد، اما همراه با فرم آپلود فایل یا محتوای تولید شده توسط کاربر مسیری برای اجرای کد مخرب در مرورگر بازدیدکنندگان باز می‌کند — ربودن session های login شده، دزدیدن جزئیات ورود یا کارت. یکی از ارزان‌ترین رفع‌ها در امنیت است: یک خط، رایگان، حدود پنج دقیقه.

هزینه این برای شما

چرا اهمیت دارد. مرورگرها، وقتی سرور درباره‌ی اینکه یک فایل چیست مبهم است، سعی می‌کنند حدس بزنند ('sniff'). مهاجمان از این حدس سوء‌استفاده می‌کنند: یک فایل آپلود کنید که سرور به عنوان تصویر تلقی می‌کند، اما محتوا را طوری تنظیم کنید که مرورگر تصمیم بگیرد JavaScript است — و آن را اجرا کند. `X-Content-Type-Options: nosniff` header به هر مرورگر می‌گوید حدس زدن را متوقف کند و به نوع اعلام شده سرور اعتماد کند. یک بررسی نمره‌گذاری شده با ارزش ۲۵ امتیاز است.

نسخه‌ی کوتاه برای مالک

یک فرض آرام در هر مرورگر وب وجود دارد: وقتی یک فایل را از سایت شما دانلود می‌کند، سعی می‌کند بفهمد چه نوع فایلی است. معمولاً به سرور اعتماد می‌کند. اما اگر سرور مبهم باشد، مرورگر حدس می‌زند — و این حدس زدن MIME-sniffing نامیده می‌شود.

مشکل این است که مهاجمان می‌توانند از حدس سوء‌استفاده کنند. آن‌ها می‌توانند فایلی بسازند که سرور شما صادقانه آن را به عنوان تصویر بی‌خطر می‌داند، اما مرورگر، اگر به حال خود رها شود، تصمیم می‌گیرد کدی است — و آن را اجرا می‌کند.

یک دستورالعمل یک‌خطی وجود دارد که حدس زدن را خاموش می‌کند: X-Content-Type-Options: nosniff. به هر مرورگر می‌گوید: «حدس نزن — دقیقاً همانچه که سرورم می‌گوید اعتماد کن.»

این بررسی آن header را جستجو می‌کند. اگر گمشده باشد، ۲۵ امتیاز از دست می‌دهید و به عنوان یک مشکل با شدت متوسط نمره‌بندی می‌شود.

این چقدر ممکن است برای شما هزینه داشته باشد

در واقع چیست

وقتی یک مرورگر یک فایل دریافت می‌کند، سرور باید آن را با یک content type برچسب‌گذاری کند. به طور تاریخی، مرورگرها به این برچسب کاملاً اعتماد نمی‌کردند — پس به بایت‌های واقعی فایل نگاه می‌کردند و خودشان تصمیم می‌گرفتند. این MIME-sniffing است.

این یک راحتی بود که به یک مسئولیت تبدیل شد.

X-Content-Type-Options: nosniff حدس‌زنی را کاملاً حذف می‌کند. با تنظیم آن، به مرورگر گفته می‌شود: از نوع اعلام شده سرور استفاده کن و هیچ چیز دیگری نه.

«خوب» چه شکلی است: هر پاسخ از سایت شما — صفحات و asset ها یکسان — دقیقاً این header را دارد:

X-Content-Type-Options: nosniff

هیچ مقدار معتبر دیگری وجود ندارد و هیچ چیزی برای tune کردن نیست.

چگونه آن را رفع کنیم (رایگان، ~۵ دقیقه)

این بخش را به هر کسی که وب‌سایت شما را اجرا می‌کند بدهید. اصلاح رایگان و سریع است؛ چیزی برای خرید نیست.

Cloudflare (یا یک CDN/proxy مشابه) — اغلب سریع‌ترین جا برای انجام آن، کل سایت را یک‌باره پوشش می‌دهد:

Nginx — داخل block server (یا location) مربوطه اضافه کنید:

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

Apache — نیاز دارد mod_headers فعال باشد:

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

IIS / هاستینگ Windows:

<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 استفاده کنید که این و چندین header امنیتی دیگر را به طور پیش‌فرض تنظیم می‌کند.)

اشتباهات رایج

پرسش‌های متداول

ما اجازه نمی‌دهیم کسی فایل آپلود کند. آیا همچنان به این نیاز داریم؟

بله، و همچنان ارزش انجام دادن دارد. این header دفاع عمیق است: همچنین از mis-read شدن اسکریپت‌ها، استایل‌شیت‌ها و فایل‌های داده‌ای که از سایت خودتان ارائه می‌شوند توسط مرورگر جلوگیری می‌کند. هیچ هزینه‌ای ندارد و سایت درست پیکربندی شده را هرگز نمی‌شکند.

آیا اضافه کردن این چیزی را روی وب‌سایت ما می‌شکند؟

تقریباً هرگز. nosniff به سادگی مرورگرها را مجبور می‌کند نوع content ای را که سرور شما از قبل ارسال می‌کند رعایت کنند. تنها راهی که مشکل ایجاد می‌کند این است که سرور شما فایل‌ها را اشتباه برچسب‌گذاری کند — اگر چیزی بشکند، این یک باگ واقعی است که nosniff نمایان کرده نه ایجاد کرده.

'خوب' واقعاً چه شکلی است؟

یک response header تنها روی هر صفحه و asset: `X-Content-Type-Options: nosniff`. این کل پیکربندی درست است — هیچ مقدار معتبر دیگری وجود ندارد و هیچ tuning نیاز نیست.

CDN ما (Cloudflare یا مشابه) و سرور ما هر دو آن را اضافه می‌کنند — آیا مشکل است؟

نه. دیدن مقدار دو بار ('nosniff, nosniff') چون CDN و origin هر دو آن را تنظیم کردند کاملاً عیبی ندارد.

آیا رفع این هزینه‌ای دارد؟

نه. اصلاح یک خط پیکربندی رایگان روی سرور وب یا CDN شماست.

این چه تفاوتی با یک Content Security Policy (CSP) دارد؟

مکمل هم هستند. CSP کنترل می‌کند کدام اسکریپت‌ها و منابع اصلاً مجاز هستند بارگذاری شوند؛ nosniff از mis-classify کردن فایلی که بارگذاری می‌شود توسط مرورگر جلوگیری می‌کند.