Как удалить заголовки 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 Извините, вы тоже нашли способ удалить имя сервера? Принятый ответ не удаляет Сервер
неда Дерахшеш

Ответы:

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");
}
RedFilter
источник
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");
 }
bkaid
источник
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. Благодаря другим комментариям в этой теме. Мне удалось удалить все нежелательные заголовки, за исключением «Сервер», который является худшим случаем.
Фархад,
2
Работает ли это с вашими файлами содержимого / изображениями / и т. Д., Которые не проходят путь кода?
Марк Соул
что ты положил в "Сервер"? должно ли быть так? Response.Headers.Remove («Сервер: Microsoft-IIS / 7.0»); ? или это должен быть "Сервер"? пожалуйста, помогите
неда Дерахшеш
кому-то еще странно, что 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>

Обновление : Кроме того, у Троя Ханта есть статья под названием Shhh ... не позволяйте заголовкам ваших ответов говорить слишком громко с подробными шагами по удалению этих заголовков, а также ссылкой на его инструмент ASafaWeb для сканирования их и других настроек безопасности.

Кевин Хакансон
источник
5
Лучший вариант, но требует iis7 + Вам не нужно <clear /> их ... достаточно удалить ... также вы можете добавить это в system.webserver, чтобы удалить другую уязвимость: code <security> <requestFiltering> <verbs> <add verb = «ОПЦИИ» позволили = «ложь» /> </ verbs> </ requestFiltering> </ security>code
felickz
Я думаю, что элемент <clear /> очищает все заголовки, включая 'X-Powererd-By', поэтому элемент <remove /> является избыточным.
Янв
33

.NET Core

Чтобы удалить заголовок сервера , в файле Program.cs добавьте следующую опцию:

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

Для dot net core 1, добавьте опцию внутри вызова .UseKestrel (). Для dot net core 2 добавьте строку после UseStartup ().

Чтобы удалить заголовок X-Powered-By , если он развернут в IIS, отредактируйте ваш web.config и добавьте следующий раздел в тег 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);
                        }
                    }
                }
            });
        }

    }

Pre .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 добавьте следующий раздел <modules>:

<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 по всему миру ...

Rocklan
источник
3
В наше время это считается «наихудшей практикой», и трудно поверить, что Microsoft по-прежнему делает «небезопасным» значение по умолчанию и так сложно выбрать «безопасный». Это напоминает мне о том, как Windows скрывает общие расширения файлов по умолчанию, поэтому ничего не подозревающие пользователи будут нажимать на вирусы. Кажется, я вспоминаю, как Билл Гейтс в 2003 году объявил «безопасным по умолчанию» - что случилось с этой идеей?
Майк
2
@mikenelson, если вам от этого легче, пытаться удалить тег Server в nginx так же сложно - мне пришлось взломать сам исходный код.
Rocklan
О , RemoveServerHeaderModuleэто не сработает в проекте WebAPI.
krypru
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 .

RonyK
источник
Используя ответ bkaid, я могу удалить заголовок «Сервер». IIS 8.
Тормор
Ответ 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 есть скриншоты, а не блоки кода. Они буквально делают все возможное, чтобы сделать удаление этих ненужных и потенциально опасных тегов как можно сложнее. Кроме того, я не могу поверить, что я ссылаюсь на трехлетний вопрос SO, чтобы исправить эту проблему, которая не показывает никаких признаков исправления.
килобайт
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;
            }) 
Darxtar
источник
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 \ Parameters

Я бы предпочел найти правильное решение, используя Web.config, но использовать <rewrite>его нехорошо, потому что он требует установки модуля перезаписи, и даже тогда он не удалит заголовок, просто опустошит его.

Rudey
источник
Если это работает, это звучит как хорошее решение для моего случая. У меня есть 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>
Махеш Сдсраю
источник