Удалить заголовок сервера IIS7

Есть ли способ удалить заголовок ответа "Сервер" из IIS7? Есть несколько статей, показывающих, что с помощью HttpModules мы можем достичь того же. Это будет полезно, если у нас нет права администратора на сервер. Также я не хочу писать фильтр ISAPI.

У меня есть права администратора на моем сервере. Поэтому я не хочу заниматься этим. Поэтому, пожалуйста, помогите мне сделать то же самое.

Ответ 1

Добавьте это в свой global.asax.cs:

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}

Ответ 2

В IIS7 вам нужно использовать HTTP-модуль. Создайте следующее в виде библиотеки классов в VS:

namespace StrongNamespace.HttpModules
{
  public class CustomHeaderModule : IHttpModule
  { 
    public void Init(HttpApplication context)
    {
      context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    } 

    public void Dispose() { } 

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
      HttpContext.Current.Response.Headers.Set("Server", "Box of Bolts");
    }
  }
}

Затем добавьте следующее в свой web.config или настройте его в IIS (если вы настроите в IIS, сборка должна быть в GAC).

<configuration>
  <system.webServer>
    <modules>
      <add name="CustomHeaderModule"
       type="StrongNamespace.HttpModules.CustomHeaderModule" />
    </modules>
  </system.webServer>
</configuration>

Ответ 3

При включенной версии 2.0 модуля перезаписи URL для IIS (UrlRewrite) в разделе конфигурации <configuration><system.webServer><rewrite> добавьте правило для исходящих сообщений:

<outboundRules>
  <rule name="Remove RESPONSE_Server" >
    <match serverVariable="RESPONSE_Server" pattern=".+" />
    <action type="Rewrite" value="" />
  </rule>
</outboundRules>

Ответ 4

Скотт Митчелл предоставляет в своем блоге решения для удаления ненужных заголовков.

Как уже говорилось здесь в других ответах, для заголовка Server есть решение для модуля http или модуль UrlScan. (Модуль URLScan больше не доступен в IIS7. 5+. Вместо этого используйте URLRewrite для его очистки.)

Для X-AspNet-Version и X-AspNetMvc-Version он предоставляет лучший способ, чем удаление их при каждом ответе: просто не генерировать их вообще.

Используйте enableVersionHeader для отключения X-AspNet-Version в web.config

<httpRuntime enableVersionHeader="false" />

Используйте MvcHandler.DisableMvcResponseHeader в событии .Net Application_Start для отключения X-AspNetMvc-Version

MvcHandler.DisableMvcResponseHeader = true;

И, наконец, удалите в конфигурации IIS пользовательский заголовок X-Powered-By. (Это можно сделать в configuration/system.webServer/httpProtocol/customHeaders/remove[name=X-Powered-By] web.config, configuration/system.webServer/httpProtocol/customHeaders/remove[name=X-Powered-By])

Осторожно, если у вас есть ARR (Application Request Routing), он также добавит свой собственный X-Powered-By, который не будет удален пользовательскими настройками заголовков. Это нужно удалить через диспетчер IIS, конфигурацию редактора в корне IIS (не на сайте): перейдите в system.webServer/proxy и установите для arrResponseHeader значение false. После IISReset это учитывается.
(Я нашел этот здесь, за исключением того, что этот пост о старом IIS 6.0 способе настройки вещей.)

Не забывайте, что решение по коду приложения по умолчанию не применяется к заголовку, сгенерированному на статическом контенте (вы можете активировать runAllManagedModulesForAllRequests для его изменения, но это заставит все запросы запускать конвейер .Net). Это не проблема для X-AspNetMvc-Version поскольку она не добавляется в статический контент (по крайней мере, если статический запрос не выполняется в конвейере .Net).

Примечание: если целью является скрытие используемой технологии, вам также следует изменить стандартные имена .ASPXAUTH cookie.Net(.ASPXAUTH если активирована .ASPXAUTH форм (используйте атрибут name в теге forms в web.config), ASP.NET_SessionId (use <sessionState cookieName="yourName"/> в web.config под тегом system.web), __RequestVerificationToken (измените его на код с помощью AntiForgeryConfig.CookieName, но, к сожалению, не применяется к скрытому вводу, который эта система генерирует в html)).

Ответ 5

На самом деле кодированные модули и примеры Global.asax, показанные выше, работают только для действительных запросов.

Например, add < в конце вашего URL-адреса, и вы получите страницу "Плохой запрос", которая все еще предоставляет заголовок сервера. Многие разработчики не замечают этого.

Показанные параметры реестра также не работают. URLScan - это единственный способ удалить заголовок "server" (по крайней мере, в IIS 7.5).

Ответ 6

Или добавьте в web.config:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <remove name="X-AspNet-Version" />
            <remove name="X-AspNetMvc-Version" />
            <remove name="X-Powered-By" />
            <!-- <remove name="Server" />  this one doesn't work -->
        </customHeaders>
    </httpProtocol>
</system.webServer>

Ответ 7

Дополнение к ответу перезаписи URL, вот полный XML для web.config

<system.webServer>
  <rewrite>
    <outboundRules>
      <rule name="Remove RESPONSE_Server" >
        <match serverVariable="RESPONSE_Server" pattern=".+" />
        <action type="Rewrite" value="Company name" />
      </rule>
    </outboundRules>
  </rewrite>
</system.webServer>

URL Rewrite

Ответ 8

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

protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
    // Remove the "Server" HTTP Header from response
    HttpApplication app = sender as HttpApplication;
    if (null != app && null != app.Request && !app.Request.IsLocal &&
        null != app.Context && null != app.Context.Response)
    {
        NameValueCollection headers = app.Context.Response.Headers;
        if (null != headers)
        {
            headers.Remove("Server");
        }
    }
}

Если вы хотите, чтобы полное решение удалило все связанные заголовки на Azure/IIS7, а также работает с Cassini, см. эту ссылку, в котором показан лучший способ отключить эти заголовки без использования HttpModules или URLScan.

Ответ 9

Эта настройка web.config работает для удаления всех ненужных заголовков из ответа ASP.NET (по крайней мере, начиная с IIS 10):

<!--Removes version headers from response -->
<httpRuntime enableVersionHeader="false" />

<httpProtocol>
  <customHeaders>
    <!--Removes X-Powered-By header from response -->
    <clear />
  </customHeaders>
</httpProtocol>

<security>
  <!--Removes Server header from response-->
  <requestFiltering removeServerHeader ="true" />
</security>

Обратите внимание, что это скрывает все заголовки для "приложения", как и все другие подходы. Например, если вы попадаете на страницу по умолчанию или страницу с ошибкой, созданную самим IIS или ASP.NET вне вашего приложения, эти правила не будут применяться. Поэтому в идеале они должны находиться на корневом уровне в IIS, и этот порог может оставить некоторые сообщения об ошибках для самого IIS.

PS В IIS 10 есть ошибка, из- за которой иногда отображается заголовок сервера даже при правильной конфигурации. Это должно быть исправлено, но IIS/Windows должен быть обновлен.

Ответ 10

Если вы просто хотите удалить заголовок, вы можете использовать сокращенную версию lukiffer:

using System.Web;

namespace Site
{
    public sealed class HideServerHeaderModule : IHttpModule
    {
        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders +=
            (sender, e) => HttpContext.Current.Response.Headers.Remove("Server");
        }
    }
}

И затем в Web.config:

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="CustomHeaderModule" type="Site.HideServerHeaderModule" />
  </modules>
</system.webServer>

Ответ 11

Попробуйте установить запись реестра HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader в REG_DWORD из 1.

Ответ 12

UrlScan также может удалить заголовок сервера, используя AlternateServerName= под [options].

Ответ 13

В ответ на ответ eddiegroves в зависимости от версии URLScan вы можете вместо RemoveServerHeader=1 выбрать RemoveServerHeader=1 в [options].

Я не уверен, в какой версии URLScan этот параметр был добавлен, но он был доступен в версии 2.5 и более поздних версиях.

Ответ 14

Я нашел статью, которая объясняет, почему нам нужно сделать как редактирование реестра, так и использовать такой инструмент, как UrlScan, чтобы правильно настроить его в IIS. Я следил за ним на наших серверах, и он работает: http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx. Если вы используете UrlScan только, но не делаете изменения в реестре, во время остановки World Wide Publishing Service ваш сервер вернет ответ HTTP-сервера из файла HTTP.sys. Кроме того, здесь приведены общие ошибки использования инструмента UrlScan: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008

Ответ 15

В IIS 10 мы используем аналогичное решение для подхода Дрю, то есть:

using System;
using System.Web;

namespace Common.Web.Modules.Http
{
    /// <summary>
    /// Sets custom headers in all requests (e.g. "Server" header) or simply remove some.
    /// </summary>
    public class CustomHeaderModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += OnPreSendRequestHeaders;
        }

        public void Dispose() { }

        /// <summary>
        /// Event handler that implements the desired behavior for the PreSendRequestHeaders event,
        /// that occurs just before ASP.NET sends HTTP headers to the client.
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnPreSendRequestHeaders(object sender, EventArgs e)
        {
            //HttpContext.Current.Response.Headers.Remove("Server");
            HttpContext.Current.Response.Headers.Set("Server", "MyServer");
        }
    }
}

И, очевидно, добавьте ссылку на эту DLL в свой проект (ы), а также модуль в необходимых вам конфигурациях:

<system.webServer>
    <modules>
      <!--Use http module to remove/customize IIS "Server" header-->
      <add name="CustomHeaderModule" type="Common.Web.Modules.Http.CustomHeaderModule" />
    </modules>
</system.webServer>

Ответ 16

Я перепробовал все это здесь и на нескольких других похожих потоках.

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

Я получил это в основном работает, удалив runAllManagedModulesForAllRequests:

<modules runAllManagedModulesForAllRequests="true">

Это удалило посторонние заголовки из большинства статических файлов, но я все еще получал заголовок "Server" на некоторых статических файлах в моем проекте WebAPI в swagger.

Я наконец нашел и применил это решение, и теперь все нежелательные заголовки исчезли:

https://www.dionach.com/blog/easily-remove-unwanted-http-headers-in-iis-70-to-85

который обсуждает его код, который здесь:

https://github.com/Dionach/StripHeaders/releases/tag/v1.0.5

Это модуль Native-Code. Он может удалить заголовок сервера, а не просто убрать значение. По умолчанию он удаляет:

  • сервер
  • X-Powered-By
  • X-Сеть САШ-версия
  • Сервер: Microsoft-HTTPAPI/2.0 - который будет возвращен, если "запрос не будет передан в IIS"

Ответ 17

Я исследовал это, и метод URLRewrite работает хорошо. Кажется, нигде не могу найти изменения в сценарии. Я написал это совместимо с PowerShell v2 и выше и протестировал его на IIS 7.5.

# Add Allowed Server Variable
    Add-WebConfiguration /system.webServer/rewrite/allowedServerVariables -atIndex 0 -value @{name="RESPONSE_SERVER"}
# Rule Name
    $ruleName = "Remove Server Response Header"
# Add outbound IIS Rewrite Rule
    Add-WebConfigurationProperty -pspath "iis:\" -filter "system.webServer/rewrite/outboundrules" -name "." -value @{name=$ruleName; stopProcessing='False'}
#Set Properties of newly created outbound rule 
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "serverVariable" -value "RESPONSE_SERVER"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/match" -name "pattern" -value ".*"
    Set-WebConfigurationProperty -pspath "MACHINE/WEBROOT/APPHOST"  -filter "system.webServer/rewrite/outboundRules/rule[@name='$ruleName']/action" -name "type" -value "Rewrite"

Ответ 18

Вы можете добавить код ниже в файле Global.asax.cs

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

Ответ 19

В IIS 7.5 и, возможно, в более новых версиях текст заголовка хранится в iiscore.dll

Используя шестнадцатеричный редактор, найдите строку и слово "Сервер" 53 65 72 76 65 72 после нее и замените их нулевыми байтами. В IIS 7.5 это выглядит так:

4D 69 63 72 6F 73 6F 66 74 2D 49 49 53 2F 37 2E 35 00 00 00 53 65 72 76 65 72 

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