Defaults.Exposed › رفع اشکالها › MIME-sniffing protection (X-Content-Type-Options)
چطور MIME-sniffing protection (X-Content-Type-Options) را رفع کنید
یک header یکخطی که از حدس زدن مرورگر دربارهی اینکه یک فایل واقعاً چیست جلوگیری میکند. بدون آن، فایلی که کسی به سایت شما آپلود میکند — یا یک فایل روی صفحات خودتان — میتواند توسط مرورگر اشتباه خوانده شده و به عنوان کد اجرا شود، که دقیقاً نحوهی تبدیل برخی حملات از یک آپلود بیخطر به روشی برای دزدیدن session های مشتریان شما است.
نتیجه نهایی برای کسبوکار شما: از دست دادن این header یک نشانهی واضح و قابل اسکن است که پایهها محکم نشدهاند. به تنهایی به ندرت یک سایت را از کار میاندازد، اما همراه با فرم آپلود فایل یا محتوای تولید شده توسط کاربر مسیری برای اجرای کد مخرب در مرورگر بازدیدکنندگان باز میکند — ربودن session های login شده، دزدیدن جزئیات ورود یا کارت. یکی از ارزانترین رفعها در امنیت است: یک خط، رایگان، حدود پنج دقیقه.
هزینه این برای شما
- هر صفحهای که مشتریان یا کارکنان میتوانند فایل آپلود کنند (آواتارها، اسناد، پیوستهای پشتیبانی، عکسهای فهرست) به یک محل پرتاب احتمالی برای حملات سمت مرورگر تبدیل میشود.
- یک مهاجم میتواند کد مخرب را به عنوان یک تصویر یا فایل متنی پنهان کند و مرورگر بازدیدکننده آن را اجرا کند — session login شدهی آنها در سایت شما را میدزدد.
- پرسشنامههای امنیتی، بررسیهای بیمهی سایبری و خریداران سازمانی این header را اسکن میکنند؛ غیابش به عنوان 'پایهها را انجام نمیدهند' خوانده میشود و میتواند معامله را متوقف یا سرنگون کند.
چرا اهمیت دارد. مرورگرها، وقتی سرور دربارهی اینکه یک فایل چیست مبهم است، سعی میکنند حدس بزنند ('sniff'). مهاجمان از این حدس سوءاستفاده میکنند: یک فایل آپلود کنید که سرور به عنوان تصویر تلقی میکند، اما محتوا را طوری تنظیم کنید که مرورگر تصمیم بگیرد JavaScript است — و آن را اجرا کند. `X-Content-Type-Options: nosniff` header به هر مرورگر میگوید حدس زدن را متوقف کند و به نوع اعلام شده سرور اعتماد کند. یک بررسی نمرهگذاری شده با ارزش ۲۵ امتیاز است.
نسخهی کوتاه برای مالک
یک فرض آرام در هر مرورگر وب وجود دارد: وقتی یک فایل را از سایت شما دانلود میکند، سعی میکند بفهمد چه نوع فایلی است. معمولاً به سرور اعتماد میکند. اما اگر سرور مبهم باشد، مرورگر حدس میزند — و این حدس زدن MIME-sniffing نامیده میشود.
مشکل این است که مهاجمان میتوانند از حدس سوءاستفاده کنند. آنها میتوانند فایلی بسازند که سرور شما صادقانه آن را به عنوان تصویر بیخطر میداند، اما مرورگر، اگر به حال خود رها شود، تصمیم میگیرد کدی است — و آن را اجرا میکند.
یک دستورالعمل یکخطی وجود دارد که حدس زدن را خاموش میکند: X-Content-Type-Options: nosniff. به هر مرورگر میگوید: «حدس نزن — دقیقاً همانچه که سرورم میگوید اعتماد کن.»
این بررسی آن header را جستجو میکند. اگر گمشده باشد، ۲۵ امتیاز از دست میدهید و به عنوان یک مشکل با شدت متوسط نمرهبندی میشود.
این چقدر ممکن است برای شما هزینه داشته باشد
-
‘پیوست بیخطر’ که نبود. یک پورتال پشتیبانی یا یک marketplace اجرا میکنید که مشتریان فایل آپلود میکنند. یک مهاجم فایلی را آپلود میکند که سیستم شما به عنوان تصویر ذخیره و ارائه میدهد. بدون nosniff، مرورگر قربانی حدس میزند فایل در واقع اسکریپت است و آن را اجرا میکند — session login شدهی آن بازدیدکننده روی سایت شما را میدزدد.
-
معاملهای که روی یک پرسشنامهی امنیتی متوقف میشود. تیم خرید یک مشتری بزرگتر یک اسکن خودکار از سایت شما اجرا میکند قبل از امضا. Header های امنیتی گمشده فوراً ظاهر میشوند.
-
تجدید بیمهی سایبری که سختتر میشود. بیشتر بیمهگران اکنون قبل از نقل قول یا تجدید اسکن خارجی اجرا میکنند. یک پروفایل header تمیز شواهد ارزان بهداشت است؛ یکی گمشده نشانهی کوچک سیاه است.
در واقع چیست
وقتی یک مرورگر یک فایل دریافت میکند، سرور باید آن را با یک content type برچسبگذاری کند. به طور تاریخی، مرورگرها به این برچسب کاملاً اعتماد نمیکردند — پس به بایتهای واقعی فایل نگاه میکردند و خودشان تصمیم میگرفتند. این MIME-sniffing است.
این یک راحتی بود که به یک مسئولیت تبدیل شد.
X-Content-Type-Options: nosniff حدسزنی را کاملاً حذف میکند. با تنظیم آن، به مرورگر گفته میشود: از نوع اعلام شده سرور استفاده کن و هیچ چیز دیگری نه.
«خوب» چه شکلی است: هر پاسخ از سایت شما — صفحات و asset ها یکسان — دقیقاً این header را دارد:
X-Content-Type-Options: nosniff
هیچ مقدار معتبر دیگری وجود ندارد و هیچ چیزی برای tune کردن نیست.
چگونه آن را رفع کنیم (رایگان، ~۵ دقیقه)
این بخش را به هر کسی که وبسایت شما را اجرا میکند بدهید. اصلاح رایگان و سریع است؛ چیزی برای خرید نیست.
Cloudflare (یا یک CDN/proxy مشابه) — اغلب سریعترین جا برای انجام آن، کل سایت را یکباره پوشش میدهد:
- از یک Response Header Transform Rule استفاده کنید تا
X-Content-Type-Optionsرا رویnosniffبرای همهی درخواستهای ورودی set کنید.
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 باید روی هر پاسخ باشد — از جمله تصاویر، اسکریپتها، استایلشیتها و فایلهای آپلود شده.
- اشتباه تایپی در مقدار. تنها مقدار معتبر
nosniffاست. - فرض کردن که Content Security Policy را جایگزین میکند. nosniff یک لایه است. کنترل نمیکند کدام اسکریپتها مجاز هستند اجرا شوند.
- حذف ‘تکرار’. اگر CDN و origin هر دو آن را تنظیم کنند، دو بار میبینید. این بیخطر است — وقت خود را صرف حذف یکی از آنها نکنید.
پرسشهای متداول
ما اجازه نمیدهیم کسی فایل آپلود کند. آیا همچنان به این نیاز داریم؟
بله، و همچنان ارزش انجام دادن دارد. این 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 کردن فایلی که بارگذاری میشود توسط مرورگر جلوگیری میکند.