Удаление/скрытие/отключение чрезмерных заголовков HTTP-ответа в Azure/IIS7 без UrlScan

Мне нужно удалить избыточные заголовки (в первую очередь для прохождения тестирования на проникновение). Я потратил время на решения, связанные с запуском UrlScan, но они громоздки, поскольку UrlScan необходимо устанавливать каждый раз при запуске экземпляра Azure.

Должно быть хорошее решение для Azure, которое не предполагает развертывание установщиков из startup.cmd.

Я понимаю, что заголовки ответов добавлены в разные места:

  • Сервер: добавлен IIS.
  • X-AspNet-Version: добавлено System.Web.dll во время Flush в классе HttpResponse
  • X-AspNetMvc-Version: добавлен MvcHandler в System.Web.dll.
  • X-Powered-By: добавлен IIS

Есть ли способ настроить (через web.config и т.д.?) IIS7, чтобы удалить/скрыть/отключить заголовки ответов HTTP, чтобы избежать предупреждения "Чрезмерные заголовки" на asafaweb.com, без создания модуля IIS или развертывания установщиков, которые нужно запускать каждый раз при запуске экземпляра Azure?

Ответ 1

Следующие изменения позволяют удалить эти заголовки HTTP-ответа в Azure без написания пользовательского HttpModule.

Большая часть информации в сети устарела и включает UrlScan (который с тех пор был интегрирован в IIS7, но с удаленной опцией RemoveServerHeader=1). Ниже представлено самое опрятное решение, которое я нашел (спасибо этот блог, этот ответ, и этот блог в сочетании).

Чтобы удалить Сервер, перейдите в Global.asax, найдите/создайте событие Application_PreSendRequestHeaders и добавьте следующее (спасибо BK и этот блог, это также не сработает на Cassini/local dev):

Отредактированный апрель 2014: вы можете использовать события PreSendRequestHeaders и PreSendRequestContext с собственными модулями IIS, но не используйте их с управляемыми модулями, которые реализуют IHttpModule. Установка этих свойств может вызвать проблемы с асинхронными запросами. Правильная версия - использовать событие BeginRequest.

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var application = sender as HttpApplication;
        if (application != null && application.Context != null)
        {
            application.Context.Response.Headers.Remove("Server");
        }
    }

Чтобы удалить X-AspNet-Version, в web.config найдите/создайте <system.web> и добавьте:

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

    ...

Чтобы удалить X-AspNetMvc-Version, перейдите в Global.asax, найдите/создайте событие Application_Start и добавьте строку следующим образом:

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

Чтобы удалить X-Powered-By, в web.config найдите/создайте <system.webServer> и добавьте:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>

    ...

Ответ 2

MSDN опубликовала эту статью о том, как скрыть заголовки на сайтах Azure. Теперь вы можете скрыть сервер от web.config, добавив запись в system.webServer

<security>
      <requestFiltering removeServerHeader ="true" />
</security>

VS будет хмуриться вышеприведенным как недействительным. Вышеупомянутая ссылка имеет код как фото, который трудно найти. Версия MVC по-прежнему скрыта при запуске приложения, как указано выше, так же, как для x-powered-by и .Net-версии.

Ответ 3

Там также есть пакет на NuGet, который поможет вам добиться этого через несколько строк конфигурации и никаких изменений в коде: NWebsec. Документы об удалении заголовков версий можно найти здесь: https://github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers

Здесь показано: http://www.nwebsec.com/HttpHeaders/VersionHeaders (в Azure)

Отказ от ответственности: я разработчик проекта.

Ответ 4

Повторяя предыдущие ответы от @giveme5minutes и @AKhooli, поскольку они относятся к Azure Websites, а также некоторые другие элементы, которые сканер хочет увидеть, это те изменения, которые я сделал, чтобы сделать ASafaWeb счастливым с сайтом Azure.

Он по-прежнему жалуется, что cookie заголовка азартной рекламы не является только https, но сродство - это тип файла cookie, который вы хотите воспроизвести в любом случае, правильно?

<system.web>
    <compilation debug="false">
    <httpRuntime enableVersionHeader="false" />
    <httpCookies httpOnlyCookies="true" requireSSL="true" />    
    <customErrors mode="RemoteOnly" defaultRedirect="~/Error.aspx" />
</system.web>

<system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Frame-Options" value="DENY" />
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
    <security>
      <!--removes Azure headers-->
      <requestFiltering removeServerHeader="true" />
    </security>
</system.webServer>

Ответ 5

Ответ Ник Эванс совершенен, но...

Если вы удалите эти заголовки для безопасности, не забудьте изменить ASP.NET Session coockie name! Потому что легче угадать используемый язык или версию сервера, если вы это видите:

введите описание изображения здесь

Чтобы изменить имя файла cookie: (быть творческим)

<system.web>
  <sessionState cookieName="PHPSESSID" />
</system.web>