Як видалити заголовки HTTP за замовчуванням ASP.Net MVC?


176

Кожна сторінка програми MVC, над якою я працюю, встановлює відповіді на заголовки HTTP:

X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
X-AspNetMvc-Version: 2.0

Як я можу запобігти їх показу?


2
Перегляньте цю статтю Видалення зайвих заголовків HTTP в IIS та ASP.NET , там описано, як видалити всі перелічені заголовки.
Павло Моршенюк

@PavelMorshenyuk Вибачте, чи знайшли ви якийсь спосіб видалити ім’я сервера? прийнята відповідь не видаляє Сервер
неда Derakhshesh

Відповіді:


285

X-Powered-Byє спеціальним заголовком в IIS. Починаючи з IIS 7, ви можете видалити його, додавши до свого web.config:

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

Цей заголовок також можна змінити для ваших потреб, для отримання додаткової інформації див. Http://www.iis.net/ConfigReference/system.webServer/httpProtocol/customHeaders


Додайте це, щоб web.configпозбутися X-AspNet-Versionзаголовка:

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

Нарешті, щоб видалити X-AspNetMvc-Version, відредагувати Global.asax.csта додати наступне у Application_Startвипадку:

protected void Application_Start()
{
    MvcHandler.DisableMvcResponseHeader = true;
}

Ви також можете змінювати заголовки під час виконання через Application_PreSendRequestHeadersподію в Global.asax.cs. Це корисно, якщо значення заголовка динамічні:

protected void Application_PreSendRequestHeaders(object source, EventArgs e)
{
      Response.Headers.Remove("foo");
      Response.Headers.Add("bar", "quux");
}

4
+1 - заради інтересу, 1) Чому б ти це зробив? 2) Чи має це несприятливий вплив?
BritishDeveloper

69
Ви робите це з міркувань безпеки, щоб придушити, яку технологію ви використовуєте для створення веб-сторінок. Це змушує хакерів працювати трохи важче.
RedFilter

20
@BritishDeveloper Ця рекомендація вийшла з огляду безпеки. Я вважаю, що найкраща практика не рекламувати свій стек технологій, оскільки це допомагає хакерам орієнтуватися на певні вразливості на цій платформі.
Пол Фрайер

1
@RedFilter Дякую за швидку та детальну відповідь!
Пол Фрайер

6
На IIS 8 це не видаляє X-Powered-Byзаголовок. Дивіться інші відповіді, як цього досягти web.config.
Кнеліс

105

Ви також можете видалити їх, додавши код у файл global.asax:

 protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
 {
   HttpContext.Current.Response.Headers.Remove("X-Powered-By");
   HttpContext.Current.Response.Headers.Remove("X-AspNet-Version");
   HttpContext.Current.Response.Headers.Remove("X-AspNetMvc-Version");
   HttpContext.Current.Response.Headers.Remove("Server");
 }

29
У моєму випадку працювали лише останні три, для "X-Powered-By" мені все ще потрібно<system.webServer> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> </customHeaders> <redirectHeaders> <clear /> </redirectHeaders> </httpProtocol> </system.webServer>
Френк ван Ейкелен

2
У моєму випадку жодне з вищезазначених заголовків не було видалено. Я використовую .net 4.0 та IIS 7. Завдяки іншим коментарям у цій темі. Мені вдалося видалити всі непотрібні заголовки за винятком "Сервера", що є найгіршим випадком.
Farjad

2
Це працює проти файлів вмісту / зображень / тощо, які не проходять шлях коду?
Марк Совул

що ти поставив у "Сервер"? чи має бути так? Response.Headers.Remove ("Сервер: Microsoft-IIS / 7.0"); ? або це повинен бути "Сервер"? будь ласка, допоможіть
neda Derakhshesh

Як ні для кого іншого, що "PreSendRequestHeaders" насправді попередньо надсилає заголовки відповідей?
JDPeckham

50

Я знайшов цю конфігурацію у своїй, web.configяка була New Web Site...створена у Visual Studio (на відміну від a New Project...). Оскільки в запитанні вказано додаток ASP.NET MVC, це не так актуально, але все-таки є варіантом.

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

Оновлення : Крім того, у Troy Hunt є стаття під назвою Shhh… не дозволяйте заголовкам ваших відповідей занадто гучно говорити з детальними кроками щодо видалення цих заголовків, а також посиланням на його інструмент ASafaWeb для сканування їх та інших конфігурацій безпеки.


5
Найкращий варіант, але вимагає iis7 + Вам не потрібно <очистити /> їх ... видалити досить .. також ви можете додати це до system.webserver, щоб усунути ще одну вразливість: code <security> <requestFiltering> <verbs> <add verb = "OPTIONS" дозволяється = "false" /> </verbs> </requestFiltering> </security>code
felickz

Я думаю, що елемент <clear /> очищає всі заголовки, включаючи "X-Powererd-By", тому елемент <delete /> є зайвим.
Січень H

33

.NET Core

Щоб видалити заголовок сервера , у файлі Program.cs додайте наступну опцію:

.UseKestrel(opt => opt.AddServerHeader = false)

Для точкового чистого ядра 1 поставте додавання опції всередині виклику .UseKestrel (). Для точкового чистого ядра 2 додайте рядок після UseStartup ().

Щоб видалити заголовок X-Powered-By , якщо він розгорнуто в IIS, відредагуйте веб-конфіг і додайте наступний розділ всередині тегу system.webServer:

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

.NET 4.5.2

Щоб видалити заголовок сервера , у файл global.asax додайте наступне:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        string[] headers = { "Server", "X-AspNet-Version" };

        if (!Response.HeadersWritten)
        {
            Response.AddOnSendingHeaders((c) =>
            {
                if (c != null && c.Response != null && c.Response.Headers != null)
                {
                    foreach (string header in headers)
                    {
                        if (c.Response.Headers[header] != null)
                        {
                            c.Response.Headers.Remove(header);
                        }
                    }
                }
            });
        }

    }

Попередньо .NET 4.5.2

Додайте до свого проекту такий клас c #:

public class RemoveServerHeaderModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose() { }

    void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpContext.Current.Response.Headers.Remove("Server");
    }
}

а потім у свій web.config додайте наступний розділ <модулі>:

<system.webServer>
    ....
 <modules>
    <add name="RemoveServerHeaderModule" type="MyNamespace.RemoveServerHeaderModule" />
 </modules>

Однак у мене виникла проблема, коли підпроекти не змогли знайти цей модуль. Не смішно.

Видалення заголовка X-AspNetMvc-Version

Щоб видалити тег '' X-AspNetMvc-Version '', для будь-якої версії .NET модифікуйте файл '' web.config '', щоб він включав:

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

Дякую Microsoft, що зробив це неймовірно складно. А може, це був ваш намір, щоб ви могли відстежувати встановлення IIS та MVC по всьому світу ...


3
У цей день і вік це вважається "найгіршою практикою", і важко повірити, що Microsoft все ще робить "незахищеним" за замовчуванням і настільки складним, щоб увімкнути "безпеку". Це нагадує мені про те, як Windows за замовчуванням приховує поширені розширення файлів, щоб нічого не підозрюючі користувачі натискали на віруси. Здається, я згадую Білла Гейтса, який оголосив "безпеку за замовчуванням" у 2003 році - що з цією ідеєю сталося?
Майк Нелсон

2
@mikenelson, якщо це відчуває тебе краще, намагатися видалити тег сервера в nginx так само важко - мені в кінцевому підсумку довелося зламати власне вихідний код.
Роклен

Про RemoveServerHeaderModuleце не буде працювати у проекті WebApi.
крипру

32

Як описано в прихованні веб-програми ASP.NET MVC на IIS 7 , ви можете вимкнути заголовок X-AspNet-Version, застосувавши до розділу web.config такий розділ конфігурації:

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

та видаліть заголовок X-AspNetMvc-Version, змінивши ваш Global.asax.cs наступним чином:

protected void Application_Start() 
{ 
    MvcHandler.DisableMvcResponseHeader = true; 
}

Як описано у користувацьких заголовках Ви можете видалити заголовок "X-Powered-By", застосувавши до розділу web.config такий розділ конфігурації:

<system.webServer>
   <httpProtocol>
      <customHeaders>
         <clear />
      </customHeaders>
   </httpProtocol>
</system.webServer>

Немає простого способу видалення заголовка відповіді "Сервер" за допомогою конфігурації, але ви можете реалізувати HttpModuleдля видалення конкретних заголовків HTTP, як описано в Прихованні веб-додатка ASP.NET MVC на IIS 7 та в розділі " Як видалити сервер" x-aspnet-version-x-aspnetmvc-version-and-x-powered-by-from-the-response-header-in-iis7 .


За допомогою bkaid відповіді я можу видалити заголовок "Сервер". IIS 8.
tmorell

bkaid відповідь прекрасний, але він вимагає кодування, тому я знайшов рішення, яке я описав, як більш зручне, оскільки воно засноване на конфігурації.
RonyK

8

Як показано на Видаленні стандартних заголовків серверів на сторінці веб-сайтів Windows Azure , ви можете видалити заголовки за допомогою наступного:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <clear />
      </customHeaders>
    </httpProtocol>
    <security>
      <requestFiltering removeServerHeader="true"/>
    </security>
  </system.webServer>
  <system.web>
    <httpRuntime enableVersionHeader="false" />
  </system.web>
</configuration>

Це видаляє заголовок сервера та заголовки X.

Це працювало локально на моїх тестах у Visual Studio 2015.


6
Додавання removeServerHeader = "true" призвело до помилки 500 у моєму додатку ASP.NET 4.5.3
Rocklan

4
@LachlanB це було додано у IIS 10: IIS 10.0 додав атрибут removeServerHeader для придушення надсилання заголовка сервера HTTP віддаленим клієнтам. Джерело: iis.net/configreference/system.webserver/security/…
SynerCoder

1
Мені подобається, що сторінка Azure надає знімки екрана, а не блоки коду. Вони буквально роблять усе можливе, щоб видалити ці непотрібні та потенційно небезпечні мітки якомога складніше. Крім того, я не можу повірити, що я посилаюсь на трирічне питання ЗО, щоб виправити це питання, яке не показує жодних ознак його виправлення.
killa-byte

1
Я думаю, що цей Web.config не видаляє заголовок X-AspNetMvc-Version. Щоб видалити це, нам потрібно додати щось у Global.asax stackoverflow.com/a/20739875/1678525
H січня

8

У Asp.Net Core ви можете редагувати файли web.config так:

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

Ви можете видалити заголовок сервера в параметрах Kestrel:

            .UseKestrel(c =>
            {
                // removes the server header
                c.AddServerHeader = false;
            }) 

5

Перевірте цей блог Не використовуйте код для видалення заголовків. Відповідно до Microsoft, він нестабільний

Моє взяти на це:

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

4

Для повноти є ще один спосіб видалити Serverзаголовок, використовуючи regedit.

Дивіться цей блог MSDN .

Створіть запис DWORD під назвою DisableServerHeader у наступному ключі реєстру та встановіть значення 1.

HKLM \ SYSTEM \ CurrentControlSet \ Services \ HTTP \ Параметри

Я вважаю за краще знайти правильне рішення за допомогою Web.config, але використовувати <rewrite>це не добре, оскільки він вимагає встановлення модуля перезапису, і навіть тоді він не дійсно видалить заголовок, просто випорожнить його.


Якщо це працює, це здається гарним рішенням для моєї справи. У мене є 30 веб-сайтів у різних версіях .net, і тому знадобляться 3 різних способу видалення заголовків та оновлення коду на всіх цих сайтах. Я б швидше мав налаштування конфігурації чи реєстр, ніж міняти код.
Майк Нельсон

Я успішно застосував це два дні тому, чудово працює.
Rudey

2

Ви можете змінити будь-який заголовок або що - небудь в Application_EndRequest()спробувати це

protected void Application_EndRequest()
{
    // removing excessive headers. They don't need to see this.
    Response.Headers.Remove("header_name");
}

1

Заголовок X-Powered-By додається IIS до відповіді HTTP, тому ви можете видалити його навіть на рівні сервера через менеджер IIS:

Ви можете використовувати web.config безпосередньо:

<system.webServer>
   <httpProtocol>
     <customHeaders>
       <remove name="X-Powered-By" />
     </customHeaders>
   </httpProtocol>
</system.webServer>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.