Defaults.Exposed › Виправлення › MIME-sniffing protection (X-Content-Type-Options)
Як виправити MIME-sniffing protection (X-Content-Type-Options)
Однорядковий заголовок, що зупиняє браузери від вгадування, що насправді є файл. Без нього файл, що хтось завантажує на ваш сайт — або файл на ваших власних сторінках — може бути неправильно інтерпретований браузером і запущений як код, що є саме тим, як деякі атаки перетворюють нешкідливо виглядаюче завантаження на спосіб вкрасти сесії ваших клієнтів.
Висновок для вашого бізнесу: Відсутність цього заголовку — чіткий, сканований знак, що базові заходи не на місці. Сам по собі він рідко виводить сайт з ладу, але в поєднанні з формою завантаження файлів або контентом, що генерується користувачами, він відкриває шлях для зловмисника для запуску шкідливого коду в браузерах ваших відвідувачів — захоплюючи авторизовані сесії, крадучи дані введення картки або авторизації та ставлячи вас на неправильний бік розмови про витік даних. Це одне з найдешевших виправлень у безпеці: один рядок, безкоштовно, близько п'яти хвилин.
Що це може вам коштувати
- Будь-яка сторінка, де клієнти або співробітники можуть завантажувати файли (аватари, документи, вкладення підтримки, фотографії оголошень) стає можливим майданчиком для атак на стороні браузера.
- Зловмисник може замаскувати шкідливий код як зображення або текстовий файл і змусити браузер відвідувача запустити його — крадучи їхню авторизовану сесію на вашому сайті.
- Опитувальники безпеки, перевірки кіберстрахування та корпоративні покупці сканують цей заголовок; його відсутність читається як 'вони не роблять базових речей' і може зупинити або знищити угоду.
- Старіші браузери і деякі інтеграції 'нюхають' типи контенту і можуть неправильно обробляти файли у способи, що підривають довіру або витікають дані.
Чому це важливо. Браузери, коли сервер є розпливчастим щодо того, що є файл, намагаються вгадати («нюхати») тип контенту. Зловмисники використовують це вгадування: завантажують файл, який сервер вважає нешкідливим зображенням, але вміст якого влаштований так, що браузер вирішує, що це насправді JavaScript — і запускає його. Заголовок X-Content-Type-Options: nosniff каже кожному браузеру зупинити вгадування і довіряти вказаному типу сервера, закриваючи весь цей клас хитрощів. Це оцінювана перевірка, вартістю 25 балів, і оцінюється як середня серйозність у разі відсутності.
Коротка версія для власника
У кожен браузер вбудовано тихе припущення: коли він завантажує файл з вашого сайту, він намагається з’ясувати, якого типу цей файл. Зазвичай він довіряє вашому серверу. Але якщо ваш сервер розпливчастий, браузер буде вгадувати — і це вгадування називається MIME-sniffing.
Проблема в тому, що зловмисники можуть обіграти вгадування. Вони можуть створити файл, який ваш сервер чесно вважає нешкідливим зображенням, але який браузер, якщо залишити вгадувати, вирішить що є насправді фрагментом програмного коду — і потім запускає його, прямо в браузері вашого клієнта, на вашому домені.
Є однорядкова інструкція, що вимикає вгадування: X-Content-Type-Options: nosniff. Вона каже кожному браузеру «не вгадуй — довіряй точно тому, що тобі каже мій сервер». Це все виправлення. Воно безкоштовне, займає близько п’яти хвилин, і на правильно побудованому сайті нічого не ламає.
Ця перевірка шукає цей заголовок. Якщо він відсутній, ви втрачаєте 25 балів і він оцінюється як проблема середньої серйозності — не тому що заголовок сам по собі є катастрофою, але тому що його відсутність є надійним знаком, що базові заходи не були заблоковані.
Що це може коштувати вам
Ось реалістичні, бізнес-рівневі сценарії.
-
«Нешкідливе вкладення», що таким не було. Ви запускаєте портал підтримки або торговий майданчик, де клієнти завантажують файли — квитанції, фотографії, документи. Зловмисник завантажує файл, що ваша система зберігає і обслуговує як зображення. Без nosniff браузер жертви вирішує, що файл насправді є скриптом і запускає його — тихо крадучи авторизовану сесію того відвідувача на вашому сайті. Тепер зловмисник — це вони: розміщує замовлення, читає повідомлення, змінює деталі. Ви дізнаєтесь, коли клієнти починають скаржитися на активність, якої вони не виконували.
-
Угода, що зависла на опитувальнику безпеки. Відділ закупівель великого клієнта запускає автоматизоване сканування вашого сайту перед підписанням. Відсутні заголовки безпеки миттєво з’являються. Навіть якщо нічого ніколи не було використано, звіт говорить «відсутні базові заголовки безпеки», і раптово ви відповідаєте на питання про виправлення і переносите свою дату закриття на тижні — через виправлення, що зайняло б п’ять хвилин.
-
Поновлення кіберстрахування, що стає складнішим. Все більше страховиків тепер проводять зовнішні сканування перед цінуванням або поновленням. Чистий профіль заголовків — це дешеве свідчення гігієни; відсутній — це маленька чорна позначка, яка, в сукупності з іншими, підвищує ваші премії або погіршує умови.
-
Репутаційний удар, від якого важко оговтатися. Якщо інцидент захоплення сесії простежується до файлу, що обслуговується з вашого домену, історія — не «відсутній незрозумілий заголовок» — а «[ваш бізнес] злив облікові записи клієнтів». Саме цю версію запам’ятовують клієнти, і вона коштує набагато більше, ніж виправлення.
Жодне з них не вимагає складного зловмисника. Зловживання MIME-sniffing добре зрозуміле і автоматизоване, що саме тому сканери так твердо позначають відсутній заголовок.
Що це насправді є
Коли браузер отримує файл, сервер має маркувати його типом контенту (наприклад, image/png для PNG-зображення або text/html для веб-сторінки). Історично браузери не повністю довіряли цьому ярлику — частково тому що деякі сервери помилялися — тому вони заглядали у фактичні байти файлу і вирішували самостійно. Це підглядання і є MIME-sniffing.
Це було зручністю, що стало відповідальністю. Якщо зловмисник може помістити файл на ваш сайт (через форму завантаження, поле коментарів, імпортований документ) і вплинути на його вміст, він може створити щось, що сервер маркує нешкідливо, але браузер нюхає як виконуваний скрипт. Потім браузер запускає це на вашому домені, з усією довірою, яку несе ваш домен.
X-Content-Type-Options: nosniff повністю прибирає здогадки. З його встановленням браузеру кажуть: використовуй оголошений тип сервера і нічого іншого. Файл, позначений як зображення, обробляється як зображення, крапка — навіть якщо його вміст виглядає як скрипт. Вектор атаки закривається.
Як виглядає «добре»: кожна відповідь вашого сайту — сторінки і ресурси однаково — несе точно цей заголовок:
X-Content-Type-Options: nosniff
Інших дійсних значень немає і нічого налаштовувати. Якщо ваш CDN і ваш сервер обидва додають його (тому ви бачите nosniff, nosniff) — це нормально і все одно рахується як прохідне.
Як це виправити (безкоштовно, ~5 хвилин)
Передайте цей розділ тому, хто керує вашим сайтом — вашому IT-фахівцю, веб-розробнику або підтримці хостингу. Виправлення безкоштовне і швидке; нічого купувати. Що ви просите — просте: «Додайте заголовок відповіді 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 тощо), багато додають цей заголовок автоматично; перевіряйте результат, а не припускайте, і запитуйте їхню підтримку, якщо він відсутній.
Після розгортання, перевірте його. Повторно запустіть ваше сканування або попросіть вашого розробника перевірити заголовки відповіді в засобах розробника браузера (вкладка Мережа → натисніть будь-який запит → Response Headers) і підтвердіть, що X-Content-Type-Options: nosniff є. Коротко протестуйте сайт, щоб підтвердити, що нічого стилізованого або скрипового не зламалося — на правильно побудованому сайті нічого не зламається.
Поширені помилки
- Встановлення лише на головній сторінці. Заголовок повинен бути на кожній відповіді — включно з зображеннями, скриптами, таблицями стилів і завантаженими файлами — бо саме на ці ресурси впливає sniffing. Застосовуйте його на рівні сервера або CDN, щоб він був універсальним.
- Помилка у значенні. Єдиним дійсним значенням є
nosniff. Будь-що інше (порожнє значення, помилка написання) провалює перевірку і не забезпечує захисту. - Припускати, що він замінює Content Security Policy. nosniff — це один шар. Він не контролює, яким скриптам дозволено запускатися — це завдання CSP. Додайте nosniff зараз як швидку перемогу і вважайте правильний CSP більшим наступним кроком.
- Видалення «дубліката». Якщо і ваш CDN, і джерело встановлюють його, ви бачитимете його двічі. Це нешкідливо — не витрачайте час на видалення одного.
- Оплата за це. Це безкоштовна зміна конфігурації. Моніторинг, аудити і панелі портфоліо — законно платні; додавання одного заголовка — ні.
Передайте це вашому IT-фахівцю
Технічне резюме: ця перевірка інспектує заголовки HTTP-відповіді і проходить, коли X-Content-Type-Options присутній і його значення (без урахування регістру) містить nosniff — включно з випадком кількох джерел nosniff, nosniff, де і CDN, і джерело встановлюють його. Відсутність або будь-яке не-nosniff значення провалює перевірку. Це оцінювана перевірка P2, вартістю 25 балів, оцінюється як середня серйозність у разі невдачі і відповідає OWASP Top 10 A05 (Security Misconfiguration). Виправлення — один статичний заголовок відповіді, застосований до всіх відповідей; параметрів немає і альтернативних дійсних значень немає. Встановлюйте на межі (CDN) для покриття всього сайту або на веб-сервері зі семантикою always, щоб він видавався і у відповідях про помилки теж, потім підтвердіть у заголовках відповіді.
FAQ
Ми не дозволяємо нікому завантажувати файли. Нам все одно потрібний цей заголовок?
Так, і все одно варто це зробити. Заголовок є глибинним захистом: він також зупиняє браузер від неправильного тлумачення скриптів, таблиць стилів та файлів даних, що обслуговуються вашим власним сайтом, що захищає від кількох XSS-хитрощів навіть на сайтах без форми завантаження. Це нічого не коштує і ніколи не ламає правильно налаштований сайт, тому немає причини пропускати.
Чи зламає додавання цього щось на нашому сайті?
Майже ніколи. nosniff просто змушує браузери дотримуватися типу контенту, який ваш сервер вже надсилає. Єдиний спосіб, яким він може спричинити проблеми, — якщо ваш сервер неправильно маркує файли — наприклад надсилає таблицю стилів або скрипт з неправильним типом. Якщо щось ламається, це реальна помилка, яку nosniff виявив, а не спричинив, і її все одно варто виправити. Перевірте один раз після розгортання.
Як виглядає 'добре'?
Один заголовок відповіді на кожній сторінці і ресурсі: X-Content-Type-Options: nosniff. Це вся правильна конфігурація — інших дійсних значень немає і нічого налаштовувати.
Наш CDN (Cloudflare або подібний) і наш сервер обидва додають його — це проблема?
Ні. Бачення значення двічі ('nosniff, nosniff') бо і CDN, і джерело встановлюють його — абсолютно нормально і все одно проходить. Вам не потрібно видаляти одне.
Виправлення коштує грошей?
Ні. Виправлення — це один рядок безкоштовної конфігурації на вашому веб-сервері або CDN. Хто б не брав з вас плату за додавання одного заголовку — переплачує. Єдине, за що варто платити в цій сфері, — постійний моніторинг, огляд портфоліо по кількох сайтах або формальний аудит, а не саме виправлення.
Чим це відрізняється від Content Security Policy (CSP)?
Вони доповнюють одне одного. CSP контролює, яким скриптам і ресурсам взагалі дозволено завантажуватися; nosniff зупиняє браузер від неправильної класифікації файлу, що він завантажує. Вам потрібні обидва. nosniff набагато простіше і швидше додати, тому це гарний перший крок на шляху до повного CSP.