flawopen.com/XSS/Content-type sniffing
XSS из-за MIME sniffing: как путаница типов достигает браузера
Браузер использует Content-Type ответа, чтобы определить, как обрабатывать его байты. Если приложение отдаёт контролируемые пользователями файлы с отсутствующим или неверным типом, MIME sniffing может изменить обработку некоторых ответов. Указывайте правильный тип и X-Content-Type-Options: nosniff, а загрузки изолируйте от origin приложения. Заголовок снижает один риск интерпретации браузером, но не очищает файлы и не заменяет контроль загрузок.
Как загрузка пересекает границу документа
Приложение принимает файлы и затем отдаёт их с собственного аутентифицированного origin с отсутствующим или неверным Content-Type. Если браузер интерпретирует ответ как HTML-документ, разметка файла может стать активной в origin сайта. При открытии это создаёт риск хранимого XSS или подмены типа контента. Расширение и заявленный при загрузке тип не доказывают формат байтов.
Указывайте тип и изолируйте загрузки
HTTP/1.1 200 OK Content-Type: application/octet-stream // отсутствует X-Content-Type-Options // тот же origin, что у аутентифицированного приложения
HTTP/1.1 200 OK Content-Type: text/plain; charset=utf-8 X-Content-Type-Options: nosniff Content-Disposition: attachment; filename="download.txt"
Используйте заданный сервером Content-Type, соответствующий байтам; не копируйте тип, заявленный отправителем. X-Content-Type-Options: nosniff отключает MIME sniffing для документных ответов и блокирует запросы скриптов или стилей с неверным MIME-типом. Это не универсальное исправление XSS: храните загрузки на другом origin, предпочитайте Content-Disposition: attachment для скачивания и проверяйте размер, права и формат файлов. Для изображений и встроенных медиа возвращайте проверенный тип и тестируйте реальный ответ браузера.
Частые вопросы
Нет. Он управляет MIME-интерпретацией браузера и проверками скриптов и стилей, но не проверяет и не очищает файл, не исправляет ошибочный Content-Type и не изолирует файл того же origin. Для недоверенных файлов используйте отдельный origin и скачивание как вложение.
Источники
- MDN — заголовок ответа X-Content-Type-Options
- Стандарт WHATWG Fetch — X-Content-Type-Options
- OWASP — HTTP-заголовки безопасности