Облачное хранилище
Удаление лишних HTTP-заголовков в ASP.NET
Как удалить ненужные HTTP-заголовки в ASP.NET

Современные веб-приложения требуют аккуратного отношения к мелочам — даже к тем, что не видны пользователю. Одни из таких мелочей — HTTP-заголовки, которые ASP.NET и IIS отправляют по умолчанию. Они несут информацию о сервере и версиях технологий, увеличивают размер ответа и потенциально облегчают жизнь злоумышленникам.

Разберём, как убрать лишние заголовки и сделать приложение чище и безопаснее.

Зачем убирать стандартные заголовки ASP.NET

При стандартной конфигурации сервер отдаёт заголовки:

  • Server
  • X-Powered-By
  • X-AspNet-Version
  • X-AspNetMvc-Version

Эти заголовки:

  • увеличивают размер ответа
  • раскрывают информацию о сервере
  • могут стать дополнительной подсказкой для атакующих
  • в больших проектах дают лишний трафик на масштабе

Удаление лишних заголовков — простой шаг в сторону оптимизации и безопасности.

Удаляем заголовок X-AspNet-Version

Самый простой случай — заголовок, который вставляется самим ASP.NET.
Отключается в web.config:

код

<system.web>
    <httpRuntime enableVersionHeader="false" />
</system.web>

После перезапуска приложения заголовок исчезнет.

Убираем X-AspNetMvc-Version

Этот заголовок добавляется MVC-фреймворком.
Отключается одной строкой в Global.asax:

код

protected void Application_Start()
{
    MvcHandler.DisableMvcResponseHeader = true;
}

Удаляем X-Powered-By

Этот заголовок относится к IIS.
Его можно выключить через управление серверами:

  1. Открываем IIS Manager
  2. Переходим к нужному сайту
  3. Открываем Configuration Editor
  4. Находим параметр, отвечающий за отправку X-Powered-By
  5. Отключаем

На Windows Server 2008 R2 и выше параметр доступен сразу. На старых версиях может потребоваться UrlScan.

Удаляем заголовок Server

Самый сложный случай. Варианты разные в зависимости от версии IIS.

IIS 7+ (Integrated Pipeline Mode)

Можно удалить заголовок программно:

код

protected void Application_PreSendRequestHeaders()
{
    HttpContext.Current.Response.Headers.Remove("Server");
}

Работает только при включённом Integrated Pipeline Mode.

IIS 6 и старые системы

Единственный рабочий вариант — Microsoft UrlScan.
В конфигурации можно убрать или переписать Server.

Проверяем результат

После внесения изменений:

  • открываем DevTools → вкладка Network
  • обновляем страницу
  • смотрим список заголовков в ответе сервера

Или проверяем через терминал:

код

curl -I https://example.com

Если всё сделано правильно — лишние заголовки исчезнут.

Итоги

Удаление стандартных заголовков ASP.NET и IIS — это:

  • меньше трафика
  • выше безопасность
  • отсутствие лишней информации о сервере
  • чистый и аккуратный HTTP-ответ

Рекомендуется применять эти настройки на всех продакшн-серверах, особенно если проект публичный и обрабатывает чувствительные данные.

FAQ

Зачем вообще убирать стандартные заголовки?
Они раскрывают информацию о сервере, версиях ASP.NET и MVC. Это не критично, но уменьшает безопасность и создаёт лишний «шум» в ответах сервера.

Удаление заголовков может сломать приложение?
Нет, это безопасные настройки. Они не влияют на логику работы приложения — только на HTTP-ответ.

Работает ли это в .NET Core?
Для .NET Core заголовки настраиваются иначе — через middleware. Могу подготовить пример, если нужно.

Можно ли убрать заголовок Server на всех IIS?
Нет. На старых версиях IIS (до 7) работает только UrlScan. На новых — через код или через фильтры.

Нужно ли убирать все заголовки подряд?
Не обязательно. Основное: скрыть версию ASP.NET и не раскрывать лишние детали о сервере.

Полезные советы

  • После каждого изменения проверяй заголовки через curl -I — это быстрее, чем открывать браузер.
  • На продакшне держи одинаковые настройки для всех веб-серверов (особенно при балансировке).
  • Если используешь Web.config-трансформации, можно автоматически отключать лишние заголовки только для Release.
  • Для проектов с повышенными требованиями безопасности стоит добавить HTTP Security Headers (CSP, HSTS, X-Frame-Options).
  • Логику удаления заголовков удобно вынести в отдельный модуль, чтобы не размазывать по проекту.

Полезные ссылки