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


107

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

У меня есть права администратора на моем сервере. Так что я не хочу делать вышеупомянутые вещи. Итак, пожалуйста, помогите мне сделать то же самое.


Ответы:


111

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

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

11
Не знаю, почему ответ http-модуля выше, чем этот, этот намного проще
jjxtra 02

2
Вы можете найти NullReferenceExceptionв Кассини, если положитесь HttpContext.Current. В этом сообщении блога показано, как это сделать, не нарушая при этом поддержку Cassini, если это важно для вас.
Оуэн Блэкер

49
@PsychoDad, это работает только для запросов ASP.NET, а не для статических файлов, таких как .css и .js,
Макс Торо,

1
Чтобы избавиться от заголовка MVC, вы можете сделать это MvcHandler.DisableMvcResponseHeader = true;
ProVega

7
Не рекомендуется использовать PreSendRequestHeadersв классе, реализующем IHttpModuleили Global.asax. Я был свидетелем того, как приложение зависало на сервере под нагрузкой. BeginRequestСобытие должно работать , чтобы сделать изменения заголовка ответа. См. Hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx .
Дмитрий С.

77

В 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>

Отлично, я также могу настроить это, чтобы удалить заголовок ETag из моей серверной фермы.
devstuff

Это вызывает ошибку времени выполнения в casini ... / Сервер ASP.NET Dev
UpTheCreek

2
@UpTheCreek Серверу разработки ASP.Net (Cassini) этот код не понравится; в этом сообщении в блоге есть решение - вам нужно проверить, что the HttpApplication, the HttpRequest, the HttpContextи the HttpResponseнет null, а также проверить, что HttpRequest.IsLocalесть false.
Оуэн Блэкер

2
Поскольку изменение заголовка в PreSendRequestHeadersможет вызвать проблемы с HttpCacheModule , вам следует использовать что-то вроде PostReleaseRequestState.
Eirik H

5
Модуль не вызывается, когда IIS отправляет заголовок 304 Not Modified для статических файлов (css / less / images / etc), поскольку он не достигает конвейера ASP.NET, поэтому в этой ситуации сервер: Microsoft IIS / 7.5 все еще отображается
Яно

42

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

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

11
Обратите внимание, что это только очищает заголовок сервера, но не удаляет его.
Ник Эванс,

Извините за незнание, но в какую часть это добавить ?! Я пробовал добавить его в <system.webServer>
Виньеш Субраманиан

1
Спасибо! Работает в IIS 8.5, это так просто. У меня нет текстового редактора, но вы можете легко использовать графический интерфейс. Имя должно быть RESPONSE_Server, а не просто Server (здесь я сначала потерпел неудачу).
Луи Маттейссен

этого достаточно, если у вас есть приложение, отличное от ASP.Net, поэтому вы не можете удалить заголовок сервера с указанными кодами
mhesabi

4
@vignesh это некоторые подузлы конфигурации UrlRewrite. Вы должны поместить их под rewriteузел system.webServer. Остерегайтесь, это приведет к сбою вашего сайта, если UrlRewrite не установлен на сервере. И вам лучше сначала использовать консоль конфигурации IIS, чтобы проверить, как она записывает эти узлы конфигурации.
Frédéric

36

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

Как уже было сказано здесь, в других ответах, для Serverзаголовка существует решение модуля http или решение web.config для IIS 10+ , или вы можете использовать URLRewrite вместо его гашения .

Наиболее практичным решением для установки обновленной версии (IIS 10+) является использование removeServerHeaderфайла web.config:

<system.webServer>
  ...
  <security>
    <requestFiltering removeServerHeader="true" />
  </security>
  ...
</system.webServer>

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

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

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

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

MvcHandler.DisableMvcResponseHeader = true;

И, наконец, удалите в конфигурации IIS X-Powered-Byнастраиваемый заголовок в web.config.

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

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

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

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


18

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

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

Показанные параметры реестра также не работают. URLScan - ЕДИНСТВЕННЫЙ способ удалить заголовок «сервер» (по крайней мере, в IIS 7.5).


У меня он работает с закодированным модулем (добавленным в web.config) даже при плохом запросе;) В global.asax он действительно не работает (например, статические файлы и т. Д.)
kapsiR

Будем надеяться, что у вас все еще включена проверка запросов.
Дэн Вэр

1
есть ли у кого-нибудь альтернатива urlscan для IIS 8+?
herostwist

По крайней мере, в IIS10 + есть рабочее решение: stackoverflow.com/a/53222967/1671558
Илья Черномордик

17

Или добавьте в 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>

3
Этот метод не удаляет заголовок «Сервер». Остальные удалены.
Pure.Krome

Вы можете избавиться от X-Powered-By в конфигурации заголовков ответа на уровне сервера.
Snowburnt

1
Я не знаю, есть ли случаи, когда этот способ удаляет X-AspNet-Versionи X-AspNetMvc-Versionheader. Я знаю, что этот способ не всегда работает (если он когда-либо работает). См. Ответ @Frederic для более надежного способа их удаления.
TheBlueSky

В IIS10 + теперь есть способ удалить заголовок сервера: stackoverflow.com/a/53222946/1671558
Илья Черномордик

14

Эта 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 необходимо обновить.


12

В дополнение к ответу на переопределение 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



1
Вышеупомянутое исправление работает правильно для веб-страниц, но для изображений / значков, если произошла внутренняя ошибка сервера 500, вместо значения отображается сервер: Microsoft-IIS / 7.5. Не могли бы вы помочь мне в этом
ravithejag

11

Чтобы удалить 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

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

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>

1
Это наиболее целесообразно, потому что такие ресурсы, как css / js, не будут иметь заголовка сервера, они портируют с сервера на сервер без конфигурации, а заголовок ответа сервера не будет просто пустым, он не будет отправлен.
Adam Caviness

Я видел комментарии о том, что runAllManagedModulesForAllRequests = "true" замедлит работу вашего приложения и не рекомендуется. Вместо этого можно использовать модуль urlrewrite outboundRules, чтобы очистить значение сервера также для статических файлов. britishdeveloper.co.uk/2010/06/…
Juri

5

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


Попал в странную ситуацию с нашей серверной фермой, где этот параметр реестра, кажется, единственное изменение, которое работает во всех операционных системах (W2K8, W2K3), которые мы используем, как для IIS6, так и для IIS7.
jerhewet

2
К сожалению, для меня это не имеет никакого значения, даже после перезагрузки виртуальной машины. Мы используем IIS 7.5 на Windows Server 2008 R2 Standard, «Версия 6.1 (сборка 7601: пакет обновления 1)». Точно так же мой OnPreSendRequestHeadersобработчик событий (см. Выше) по какой-то причине никогда не запускается.
Оуэн Блэкер

3
К сожалению, ключ реестра, похоже, не работает в IIS 7.5
Эндрю Ксонтос


2

Следуя ответу eddiegroves , в зависимости от версии URLScan, вы можете предпочесть RemoveServerHeader=1под [options].

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


2

Я нашел статью, в которой объясняется, почему нам нужно как редактировать реестр, так и использовать такой инструмент, как 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


2
Пожалуйста, разместите свой код на Stack Overflow. Ссылки могут меняться и ломаться, поэтому код публикации намного
полезнее

2

В 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>

ВАЖНОЕ ПРИМЕЧАНИЕ 1. Для этого решения требуется, чтобы пул приложений был настроен как интегрированный;

ВАЖНОЕ ПРИМЕЧАНИЕ 2: это повлияет на все ответы в веб-приложении (включая css и js);


1

Я исследовал это, и метод 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"


1

Предложенное выше решение в сочетании сработало для меня со следующими изменениями. Здесь я публикую свой сценарий и решение.

Для меня я хотел удалить следующие заголовки:

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

Я добавил их в свой global.asax:

<%@ Application Language="C#" %>
<script runat="server">
    protected void Application_PreSendRequestHeaders()
    {
        Response.Headers.Remove("Server");
        Response.Headers.Remove("X-Powered-By");
        Response.Headers.Remove("X-AspNet-Version");
        Response.Headers.Remove("X-AspNetMvc-Version");
    }
</script>

Вышеупомянутое событие не запускалось, поэтому я добавил следующее в web.config, и оно сработало.

<modules runAllManagedModulesForAllRequests="true" />

а для удаления заголовка версии я также добавил в web.config следующее:

<httpRuntime enableVersionHeader="false" />

Изменения в web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />
    </system.webServer>
    <system.web>
        <httpRuntime enableVersionHeader="false" />
    </system.web>
</configuration>

Надеюсь, поможет!


0

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

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

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

<modules runAllManagedModulesForAllRequests="true">

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

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

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-Aspnet-Версия
  • Сервер: Microsoft-HTTPAPI / 2.0 - который будет возвращен, если «запрос не может быть передан в IIS»

-1

В 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 

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.