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

86

Мне нужно удалить лишние заголовки (в первую очередь, чтобы пройти тестирование на проникновение). Я потратил время на поиск решений, включающих запуск 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?

Ник Эванс
источник

Ответы:

139

Следующие изменения позволяют удалить эти заголовки 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>

    ...
Ник Эванс
источник
Согласно подсказке в VS, нет необходимости обнулять проверку запроса, ответа или ответа. Заголовки
Крис Хейнс,
1
При использовании в IIS, а не в Azure, имейте в виду, что пул приложений должен находиться в интегрированном режиме. И .IsLocal следует удалить при локальной отладке.
IvanH
5
В C # нет необходимости в «условиях Йоды» - он не позволяет
назначать
1
Спасибо за подробный ответ, однако я попытался выполнить шаги, но каждый раз, когда я сканирую сайт с помощью asafweb, он по-прежнему упоминает проблему с чрезмерным заголовком (X-AspNet-Version). Я даже использовал URLRewrite, чтобы удалить этот заголовок. Есть ли какие-нибудь другие возможности его удаления?
Raymond A
4
По-прежнему существует проблема с запросом несуществующего файла, например " yoursite / foo.jpg ". Поскольку этот запрос не обрабатывается MVC, заголовок ответа «Сервер: IIS xy» все равно будет там. Одно из решений, которое работает для веб-сайтов Azure (и, по-видимому, ТОЛЬКО для веб-сайтов Azure), - добавить это в <system.webServer>: <security xdt: Transform = "Insert"> <requestFiltering removeServerHeader = "true" /> </ security >
адриан х.
12

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

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

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

AKhooli
источник
3
Это именно то , что я искал. Спасибо.
Мартин Костелло
3
Это может работать для Azure, но не где-либо еще. Комментарии к статье подтверждают это, как и мое собственное тестирование. Ответ @ giveme5minutes - это то, как работает.
CrazyPyro
Было бы неплохо узнать, что было реализовано, чтобы сделать эту функцию: | Тем более, что URL SCAN ранее реализовал это из коробки.
felickz
6

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

Это продемонстрировано здесь: http://www.nwebsec.com/HttpHeaders/VersionHeaders (в Azure)

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

Klings
источник
«NWebsec помогает подавить почти все эти заголовки версий, то есть все, кроме заголовка Server: Microsoft-IIS / 8.0». :( github.com/NWebsec/NWebsec/wiki/Suppressing-version-headers
felickz
Он переехал из codeplex в GitHub (обновите ссылку github.com/NWebsec/NWebsec/wiki )
Nordes
6

Ответ Ника Эванса идеален, но ...

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

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

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

<system.web>
  <sessionState cookieName="PHPSESSID" />
</system.web>
Матье Шарбонье
источник
Изменение имени файла cookie имеет больше преимуществ, чем просто доступ к серверным технологиям - например, снижает риск общего массового сбора данных о
сессиях
4

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

Он по-прежнему жалуется на то, что файл cookie заголовка привязки Azure не является только 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>
Тимоти Ли Рассел
источник