Видаліть заголовок відповіді сервера 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

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

Це спричиняє помилку виконання в казино ... / ASP.NET Dev server
UpTheCreek

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

2
Оскільки зміна заголовка PreSendRequestHeadersможе спричинити проблеми з HttpCacheModule , вам слід використовувати щось подібне PostReleaseRequestState.
Ейрік Н

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

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>
Vignesh Subramanian

1
Дякую! Працює в IIS 8.5, це так просто. У мене немає текстового редактора, але ви можете легко використовувати графічний інтерфейс. Ім'я повинно бути RESPONSE_Server, а не лише Сервер (саме тут я спочатку провалився).
Луї Маттійссен

це досить добре, якщо ви отримали додаток non-ASP.Net для цього, ви не можете видалити заголовок сервера із згаданими кодами
mhesabi

4
@vignesh - це деякі підрозділи конфігурації UrlRewrite. Ви повинні помістити їх під rewriteвузлом system.webServer. Остерігайтеся, це призведе до збою вашого веб-сайту, якщо UrlRewrite не буде встановлений на сервері. А вам краще спочатку скористатися консоллю конфігурації IIS, щоб перевірити, як вона записує ці конфігураційні вузли.
Фредерік

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 (Application Request Routing), він також додасть свій власний X-Powered-By, який не буде видалено налаштуваннями користувацьких заголовків. Це потрібно видалити через диспетчер IIS, конфігурацію редактора в корені IIS (не на сайті): перейдіть до system.webServer/proxyвузла та встановіть arrResponseHeaderна false. Після цього IISResetвін враховується.
(Я знайшов цю, тут , крім цієї публікації, йдеться про старий спосіб налаштування речей IIS 6.0.)

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

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


18

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

Наприклад, додайте <в кінці своєї URL-адреси, і ви отримаєте сторінку "Неправильний запит", яка все ще відкриває заголовок сервера. Дуже багато розробників це не помічає.

Показані налаштування реєстру також не працюють. URLScan - ТІЛЬКИ спосіб видалення заголовка "сервера" (принаймні в IIS 7.5).


Він працює для мене з кодованим модулем (додається в web.config) навіть за поганого запиту;) У global.asax це не дуже працює (наприклад, статичні файли тощо)
kapsiR

Сподіваємось, що у вас все ще увімкнено перевірку запиту.
Dan Ware

1
хтось має альтернативу urlscan для IIS 8+?
herostwist

Існує робоче рішення , по крайней мере в IIS10 +: stackoverflow.com/a/53222967/1671558
Ілля Черномордик

16

Або додайте в 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 в конфігурації заголовків відповідей на рівні сервера.
Сніговий опік

1
Я не знаю, чи є випадки, коли цей спосіб видаляє X-AspNet-Versionта X-AspNetMvc-Versionзаголовки. Я знаю, що цей спосіб не завжди працює (якщо він колись працює). Дивіться @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


Чи видаляється це всі версії IIS та ASP з хакера
aggie

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

Якщо ви просто хочете видалити заголовок, ви можете скористатися скороченою версією відповіді 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>

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, "Версія 6.1 (збірка 7601: пакет оновлень 1)". Так само мій OnPreSendRequestHeadersобробник подій (див. Вище) чомусь ніколи не стріляє.
Оуен Блекер

3
На жаль, ключ реєстру, здається, не працює на IIS 7.5
Andrew Csontos


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 ваш сервер поверне http-відповідь сервера з файлу HTTP.sys. Крім того, ось загальні підводні матеріали щодо використання інструменту UrlScan: http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008


2
Будь ласка, опублікуйте свій код на "Переповнення стека". Посилання можуть змінюватися та перериватися, тому розміщення коду набагато корисніше
Блудні філософ

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

Я спробував усі речі тут і на кількох подібних потоках переповнення стека.

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

В основному я працюю, видаляючи 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.