Видалення / приховування / вимкнення надмірних заголовків відповідей HTTP в Azure / IIS7 без UrlScan


86

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

Має бути гарне рішення для Azure, яке не передбачає розгортання інсталяторів із startup.cmd.

Я розумію, що заголовки відповідей додаються в різних місцях :

  • Сервер : додано IIS.
  • Версія X-AspNet : додано System.Web.dll під час змиву в класі HttpResponse
  • Версія X-AspNetMvc : Додано 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 , у web.config знайдіть / створіть <system.web>та додайте:

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

    ...

Щоб видалити версію X-AspNetMvc , перейдіть на 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 # немає потреби в "умовах Йоди" - це не дозволяє присвоєння в умовному, en.wikipedia.org/wiki/Yoda_Conditions
tvanfosson

1
Дякую за детальну відповідь, проте я спробував виконати ці кроки, але кожного разу, коли я сканую сайт за допомогою asafweb, він все ще згадує проблему із надмірним заголовком (X-AspNet-Version). Я навіть використовував URLRewrite для видалення цього заголовка. Чи є у них інші можливості його видалення?
Реймонд,

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 версії.


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)

Застереження: Я розробник проекту.


"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 має більше переваг, ніж просто вплив серверної технології - наприклад, зменшує ризик загального збирання масових сеансів
mlhDev

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.