Ответ 1
Добавьте это в свой global.asax.cs:
protected void Application_PreSendRequestHeaders()
{
Response.Headers.Remove("Server");
Response.Headers.Remove("X-AspNet-Version");
Response.Headers.Remove("X-AspNetMvc-Version");
}
Есть ли способ удалить заголовок ответа "Сервер" из IIS7? Есть несколько статей, показывающих, что с помощью HttpModules мы можем достичь того же. Это будет полезно, если у нас нет права администратора на сервер. Также я не хочу писать фильтр ISAPI.
У меня есть права администратора на моем сервере. Поэтому я не хочу заниматься этим. Поэтому, пожалуйста, помогите мне сделать то же самое.
Добавьте это в свой global.asax.cs:
protected void Application_PreSendRequestHeaders()
{
Response.Headers.Remove("Server");
Response.Headers.Remove("X-AspNet-Version");
Response.Headers.Remove("X-AspNetMvc-Version");
}
В 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>
При включенной версии 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>
Скотт Митчелл предоставляет в своем блоге решения для удаления ненужных заголовков.
Как уже говорилось здесь в других ответах, для заголовка 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)).
На самом деле кодированные модули и примеры Global.asax, показанные выше, работают только для действительных запросов.
Например, add < в конце вашего URL-адреса, и вы получите страницу "Плохой запрос", которая все еще предоставляет заголовок сервера. Многие разработчики не замечают этого.
Показанные параметры реестра также не работают. URLScan - это единственный способ удалить заголовок "server" (по крайней мере, в IIS 7.5).
Или добавьте в 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>
Дополнение к ответу перезаписи 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>
Чтобы удалить заголовок 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.
Эта настройка 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 должен быть обновлен.
Если вы просто хотите удалить заголовок, вы можете использовать сокращенную версию 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>
Попробуйте установить запись реестра HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader
в REG_DWORD
из 1
.
UrlScan также может удалить заголовок сервера, используя AlternateServerName=
под [options]
.
В ответ на ответ eddiegroves в зависимости от версии URLScan вы можете вместо RemoveServerHeader=1
выбрать RemoveServerHeader=1
в [options]
.
Я не уверен, в какой версии URLScan этот параметр был добавлен, но он был доступен в версии 2.5 и более поздних версиях.
Я нашел статью, которая объясняет, почему нам нужно сделать как редактирование реестра, так и использовать такой инструмент, как 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
В 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>
Я перепробовал все это здесь и на нескольких других похожих потоках.
Я немного повесил трубку, потому что забыл очистить кеш браузера после внесения изменений в конфигурацию. Если вы этого не сделаете, и файл находится в вашем локальном кэше, он вернет его вам с оригинальными заголовками (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. Он может удалить заголовок сервера, а не просто убрать значение. По умолчанию он удаляет:
Я исследовал это, и метод 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"
Вы можете добавить код ниже в файле Global.asax.cs
protected void Application_PreSendRequestHeaders()
{
Response.Headers.Remove("Server");
}
В 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
В отличие от некоторых других методов, это не приводит к снижению производительности. Заголовок также удаляется из всех запросов, даже внутренних ошибок.