Как удалить заголовки ответа IIS / ASP.NET

46

У меня есть пара серверов IIS / 6.0, которые служба безопасности просит меня удалить пару заголовков ответов, которые отправляются клиентским браузерам по запросам. Они обеспокоены разглашением информации о платформе через заголовки ответов. Я удалил все HTTP-заголовки из конфигурации IIS для веб-сайта (X-Powered-By или некоторый такой заголовок).

(Я лично знаю, что эту информацию можно легко узнать, даже если она скрыта, но это не мой звонок.)

Заголовки, которые я хочу удалить:

  • Сервер - Microsoft-IIS / 6.0
  • X-AspNet-версия - 2.0.50727

Я также знаю, что ASP.NET MVC также испускает свой собственный заголовок, и если вы знаете, как его удалить, это было бы полезно.

  • X-AspNetMvc-Version - 1.0
Брайан Ребейн
источник

Ответы:

32

Ваш отдел безопасности хочет, чтобы вы сделали это, чтобы тип сервера было труднее идентифицировать. Это может уменьшить заграждение от инструментов автоматического взлома и затруднить взлом людей на сервер.

В IIS откройте свойства веб-сайта и перейдите на вкладку «Заголовки HTTP». Большинство X-заголовков можно найти и удалить здесь. Это можно сделать для отдельных сайтов или для всего сервера (измените свойства объекта веб-сайтов в дереве).

Что касается заголовка сервера, на IIS6 вы можете использовать инструмент URLScan от Microsoft, чтобы удалить его . Port 80 Software также создает продукт под названием ServerMask , который позаботится об этом и многом другом за вас.

Для IIS7 (и выше) вы можете использовать модуль перезаписи URL, чтобы перезаписать заголовок сервера или очистить его значение. В файле web.config (на сайте или на сервере в целом) добавьте этот контент после установки модуля перезаписи URL:

<rewrite>    
  <outboundRules rewriteBeforeCache="true">
    <rule name="Remove Server header">
      <match serverVariable="RESPONSE_Server" pattern=".+" />
      <action type="Rewrite" value="" />
    </rule>
  </outboundRules>
</rewrite>

Вы можете добавить пользовательское значение в действие перезаписи, если хотите. Этот образец взят из этой статьи, которая также имеет другую полезную информацию.

Для заголовка MVC в Global.asax:

MvcHandler.DisableMvcResponseHeader = true;

Отредактировано 11-12-2019 для обновления информации IIS7, поскольку ссылка на блог TechNet больше не действительна.

Джастин скотт
источник
2
Принял ответ, хотелось бы поделиться ответом с @squillman. Web.config для исправления X-AspNet-Version: <system.web> <httpRuntime enableVersionHeader = "false" /> </system.web>
Брайан Ребейн,
Удаление заголовка X помещает это в мой файл web.config, так что сэкономьте время: <system.webServer> <httpProtocol> <customHeaders> <remove name = "X-Powered-By" /> </ customHeaders> </ httpProtocol> </system.webServer>
Broam
Broam, это правильный ответ ... для IIS7. Вопрос по IIS6. Это не влияет на IIS6.
Энтони
56

Чтобы удалить все пользовательские заголовки, которые раскрывают слишком много информации, методы меняются (к сожалению) для IIS 7:

Имя заголовка: X-Powered-By

Добавлять:

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

в <system.webServer>разделе.

Имя заголовка: сервер

Реализуйте модуль httpModule, который удаляет этот заголовок, вызывая Response.Headers.Remove ("Server") из события PreSendRequestHeaders. Еще один ресурс для этого: скрытие вашего веб-приложения ASP.NET MVC на IIS 7

Имя заголовка: X-AspNet-версия

В разделе httpRuntime файла web.config - установите:

<httpRuntime enableVersionHeader="false" />

Имя заголовка: X-AspNetMvc-Version

Из события Application_Start в global.asax - выполните следующий код (C #):

MvcHandler.DisableMvcResponseHeader = true;
Адам
источник
Я просто хотел бы уточнить кое-что: большинство этих приемов будут работать только с IIS> = 7 в режиме Integrated Pipeline. В классическом режиме он в лучшем случае ничего не делает (<remove> строк в web.config) или генерирует исключение (прямые вызовы Response.Headers в global.asax, который является другим решением для удаления заголовков). Я работаю над сайтом, подключенным к классическому режиму, и, к сожалению, я не смог удалить эти заголовки.
AFract
16

Помещение этого в файл web.config приложения ASP.NET избавит от заголовка X-AspNet-Version:

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

Обратите внимание, что тег system.web должен уже существовать в файле. Не создавайте дубликат, просто добавьте тег httpRuntime. Возможно, тег httpRuntime уже существует. Если это так, просто добавьте атрибут или установите его значение, если он уже там.

squillman
источник
Однако это оставляет заголовок «powered by».
UpTheCreek
но когда я вставляю этот строковый код в system.webмой веб-сайт выходит из строя. ты знаешь почему?
Неда Дерахшеш
5

После того, как мой текущий проект прошел цикл «ужесточения», я написал в блоге о нашем подходе, который включает HTTPModule для удаления следующих заголовков :

Сервер,
X-AspNet-версия,
X-AspNetMvc-версия,
X-Powered-By

Соответствующие произведения воспроизведены ниже:

Но нет простого способа удалить заголовок ответа Сервера через конфигурацию. К счастью, IIS7 имеет управляемую подключаемую модульную инфраструктуру, которая позволяет легко расширять его функциональные возможности. Ниже приведен исходный код модуля HttpModule для удаления указанного списка заголовков ответа HTTP:

namespace Zen.Core.Web.CloakIIS
{
    #region Using Directives

    using System;
    using System.Collections.Generic;
    using System.Web;

    #endregion

    /// <summary>
    /// Custom HTTP Module for Cloaking IIS7 Server Settings to allow anonymity
    /// </summary>
    public class CloakHttpHeaderModule : IHttpModule
    {
        /// <summary>
        /// List of Headers to remove
        /// </summary>
        private List<string> headersToCloak;

        /// <summary>
        /// Initializes a new instance of the <see cref="CloakHttpHeaderModule"/> class.
        /// </summary>
        public CloakHttpHeaderModule()
        {
            this.headersToCloak = new List<string>
                                      {
                                              "Server",
                                              "X-AspNet-Version",
                                              "X-AspNetMvc-Version",
                                              "X-Powered-By",
                                      };
        }

        /// <summary>
        /// Dispose the Custom HttpModule.
        /// </summary>
        public void Dispose()
        {
        }

        /// <summary>
        /// Handles the current request.
        /// </summary>
        /// <param name="context">
        /// The HttpApplication context.
        /// </param>
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += this.OnPreSendRequestHeaders;
        }

        /// <summary>
        /// Remove all headers from the HTTP Response.
        /// </summary>
        /// <param name="sender">
        /// The object raising the event
        /// </param>
        /// <param name="e">
        /// The event data.
        /// </param>
        private void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            this.headersToCloak.ForEach(h => HttpContext.Current.Response.Headers.Remove(h));
        }
    }
}

Убедитесь, что вы подписали сборку, затем вы можете установить ее в GAC вашего веб-сервера и просто внести следующую модификацию в файл web.config вашего приложения (или, если вы хотите, чтобы он применялся глобально, к machine.config):

<configuration>
    <system.webServer>
        <modules>
            <add name="CloakHttpHeaderModule" 
                 type="Zen.Core.Web.CloakIIS.CloakHttpHeaderModule, Zen.Core.Web.CloakIIS, 
                       Version=1.0.0.0, Culture=neutral, PublicKeyToken=<YOUR TOKEN HERE>" />
        </modules>
    </system.webServer>
</configuration>
HowardvanRooijen
источник
2
Подавление генерации заголовков с помощью конфигурации, кажется, имеет гораздо больше смысла, чем генерация заголовков, а затем их удаление.
realMarkusSchmidt
1
Похоже, что ссылка сейчас мертва. :-(
Дэнни Шоеманн
2

Проверьте этот блог . Не используйте код для удаления заголовков ответов. Нестабильно по мнению Microsoft

Вместо этого используйте раздел пользовательских заголовков Web.config:

<system.webServer>          
<httpProtocol>
    <!-- Security Hardening of HTTP response headers -->
    <customHeaders>
        <!--Sending the new X-Content-Type-Options response header with the value 'nosniff' will prevent 
                Internet Explorer from MIME-sniffing a response away from the declared content-type. -->
        <add name="X-Content-Type-Options" value="nosniff" />

        <!-- X-Frame-Options tells the browser whether you want to allow your site to be framed or not. 
                 By preventing a browser from framing your site you can defend against attacks like clickjacking. 
                 Recommended value "x-frame-options: SAMEORIGIN" -->
        <add name="X-Frame-Options" value="SAMEORIGIN" />

        <!-- Setting X-Permitted-Cross-Domain-Policies header to “master-only” will instruct Flash and PDF files that 
                 they should only read the master crossdomain.xml file from the root of the website. 
                 https://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html -->
        <add name="X-Permitted-Cross-Domain-Policies" value="master-only" />

        <!-- X-XSS-Protection sets the configuration for the cross-site scripting filter built into most browsers. 
                 Recommended value "X-XSS-Protection: 1; mode=block". -->
        <add name="X-Xss-Protection" value="1; mode=block" />

        <!-- Referrer-Policy allows a site to control how much information the browser includes with navigations away from a document and should be set by all sites. 
                 If you have sensitive information in your URLs, you don't want to forward to other domains 
                 https://scotthelme.co.uk/a-new-security-header-referrer-policy/ -->
        <add name="Referrer-Policy" value="no-referrer-when-downgrade" />

        <!-- Remove x-powered-by in the response header, required by OWASP A5:2017 - Do not disclose web server configuration -->
        <remove name="X-Powered-By" />

        <!-- Ensure the cache-control is public, some browser won't set expiration without that  -->
        <add name="Cache-Control" value="public" />
    </customHeaders>
</httpProtocol>

<!-- Prerequisite for the <rewrite> section
            Install the URL Rewrite Module on the Web Server https://www.iis.net/downloads/microsoft/url-rewrite -->
<rewrite>
    <!-- Remove Server response headers (OWASP Security Measure) -->
    <outboundRules rewriteBeforeCache="true">
        <rule name="Remove Server header">
            <match serverVariable="RESPONSE_Server" pattern=".+" />

            <!-- Use custom value for the Server info -->
            <action type="Rewrite" value="Your Custom Value Here." />
        </rule>
    </outboundRules>
</rewrite>
</system.webServer>
Митака
источник
Это было решением моей проблемы. использование win2008 R2 (IIS 7.5)
paqogomez
1

Я использую следующий код и работает для меня IIS 7.5

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}
Насир Махмуд
источник
3
А как насчет ваших изображений и контента, которые не проходят через конвейер кода?
Марк Совул
что вы положили в "Сервер"? должно ли быть так? Response.Headers.Remove («Сервер: Microsoft-IIS / 7.0»); ? или это должен быть сервер? Пожалуйста , помогите
Нед Derakhshesh
Я просто поставил "Сервер" больше ничего. если ваше имя заголовка отличается, вы можете попробовать его с другим именем.
Насир Махмуд