Defaults.Exposed

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 балів і він оцінюється як проблема середньої серйозності — не тому що заголовок сам по собі є катастрофою, але тому що його відсутність є надійним знаком, що базові заходи не були заблоковані.

Що це може коштувати вам

Ось реалістичні, бізнес-рівневі сценарії.

Жодне з них не вимагає складного зловмисника. Зловживання 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/проксі) — часто найшвидше місце для цього, що охоплює весь сайт одразу:

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 є. Коротко протестуйте сайт, щоб підтвердити, що нічого стилізованого або скрипового не зламалося — на правильно побудованому сайті нічого не зламається.

Поширені помилки

Передайте це вашому 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.