У меня есть пара серверов IIS / 6.0, безопасность которых просит меня удалить пару заголовков ответов, которые отправляются клиентским браузерам по запросам. Их беспокоит разглашение информации о платформе через заголовки ответов. Я удалил все HTTP-HEADERS из конфигурации IIS для веб-сайта (X-Powered-By или какой-то другой заголовок).
(Я лично знаю, что эту информацию можно легко узнать, даже если она скрыта, но это не мое призвание.)
Заголовки, которые я хочу удалить:
Я также знаю, что ASP.NET MVC также генерирует свой собственный заголовок, если вы знаете, как его удалить, это было бы полезно.
Чтобы удалить все настраиваемые заголовки, раскрывающие слишком много информации - методы различны (к сожалению) для IIS 7:
Название заголовка: X-Powered-By
Добавить:
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
в <system.webServer>
раздел.
Название заголовка: Сервер
Реализуйте httpModule, который удаляет этот заголовок, вызывая Response.Headers.Remove ("Server") из события PreSendRequestHeaders. Еще один ресурс для этого: Маскировка веб-приложения ASP.NET MVC на IIS 7
Название заголовка: X-AspNet-Версия
В разделе httpRuntime файла web.config задайте:
<httpRuntime enableVersionHeader="false" />
Название заголовка: X-AspNetMvc-Версия
Из события Application_Start в global.asax - выполнить следующий код (C #):
MvcHandler.DisableMvcResponseHeader = true;
Ваш отдел безопасности хочет, чтобы вы сделали это, чтобы тип сервера было труднее идентифицировать. Это может уменьшить наплыв автоматизированных инструментов взлома и затруднить взлом сервера.
В IIS откройте свойства веб-сайта, затем перейдите на вкладку HTTP-заголовки. Здесь можно найти и удалить большинство X-заголовков. Это можно сделать для отдельных сайтов или для всего сервера (измените свойства объекта «Веб-сайты» в дереве).
В качестве заголовка сервера в IIS6 вы можете использовать Microsoft URLScan инструмент для удаления этого. Port 80 Software также производит продукт под названием ServerMask это позаботится об этом и многом другом за вас.
Для IIS7 (и выше) вы можете использовать Модуль перезаписи URL чтобы переписать заголовок сервера или очистить его значение. В web.config (на сайте или на сервере в целом) добавьте это содержимое после установки модуля перезаписи URL:
<rewrite>
<outboundRules rewriteBeforeCache="true">
<rule name="Remove Server header">
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
</rewrite>
При желании вы можете указать собственное значение в действии перезаписи. Этот образец взят из Эта статья который также содержит другую полезную информацию.
Для заголовка MVC в Global.asax:
MvcHandler.DisableMvcResponseHeader = true;
Отредактировано 11-12-2019 для обновления информации IIS7, поскольку ссылка на блог TechNet больше не действительна.
Поместив это в файл web.config приложения ASP.NET, вы избавитесь от заголовка X-AspNet-Version:
<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>
Обратите внимание, что тег system.web уже должен существовать в файле. Не создавайте дубликатов, просто добавьте тег httpRuntime. Тег httpRuntime также может уже существовать. Если да, просто добавьте атрибут или установите его значение, если оно уже есть.
Пройдя цикл «закалки» в моем текущем проекте - Я написал в блоге о нашем подходе, который включает HTTPModule для удаления следующих заголовков:
Сервер,
X-AspNet-Версия,
X-AspNetMvc-Version,
X-Powered-By
Соответствующие части воспроизведены ниже:
Но нет простого способа удалить заголовок ответа сервера через конфигурацию. К счастью, в IIS7 есть управляемая инфраструктура подключаемых модулей, которая позволяет легко расширять его функциональность. Ниже приведен источник HttpModule для удаления указанного списка заголовков ответов HTTP:
namespace Zen.Core.Web.CloakIIS
{
#region Using Directives
using System;
using System.Collections.Generic;
using System.Web;
#endregion
/// <summary>
/// Custom HTTP Module for Cloaking IIS7 Server Settings to allow anonymity
/// </summary>
public class CloakHttpHeaderModule : IHttpModule
{
/// <summary>
/// List of Headers to remove
/// </summary>
private List<string> headersToCloak;
/// <summary>
/// Initializes a new instance of the <see cref="CloakHttpHeaderModule"/> class.
/// </summary>
public CloakHttpHeaderModule()
{
this.headersToCloak = new List<string>
{
"Server",
"X-AspNet-Version",
"X-AspNetMvc-Version",
"X-Powered-By",
};
}
/// <summary>
/// Dispose the Custom HttpModule.
/// </summary>
public void Dispose()
{
}
/// <summary>
/// Handles the current request.
/// </summary>
/// <param name="context">
/// The HttpApplication context.
/// </param>
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += this.OnPreSendRequestHeaders;
}
/// <summary>
/// Remove all headers from the HTTP Response.
/// </summary>
/// <param name="sender">
/// The object raising the event
/// </param>
/// <param name="e">
/// The event data.
/// </param>
private void OnPreSendRequestHeaders(object sender, EventArgs e)
{
this.headersToCloak.ForEach(h => HttpContext.Current.Response.Headers.Remove(h));
}
}
}
Убедитесь, что вы подписали сборку, затем вы можете установить ее в GAC своих веб-серверов и просто внести следующие изменения в файл web.config вашего приложения (или, если вы хотите, чтобы он применялся глобально, в machine.config):
<configuration>
<system.webServer>
<modules>
<add name="CloakHttpHeaderModule"
type="Zen.Core.Web.CloakIIS.CloakHttpHeaderModule, Zen.Core.Web.CloakIIS,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=<YOUR TOKEN HERE>" />
</modules>
</system.webServer>
</configuration>
Проверьте этот блог. Не используйте код для удаления заголовков ответов. Это нестабильно по Microsoft
Вместо этого используйте раздел настраиваемых заголовков Web.config:
<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>
Я использую следующий код и у меня работает iis 7.5
protected void Application_PreSendRequestHeaders()
{
Response.Headers.Remove("Server");
Response.Headers.Remove("X-AspNet-Version");
Response.Headers.Remove("X-AspNetMvc-Version");
}
Я использую комбинацию Web.config
и Global.asax.cs
чтобы избавиться от всех настраиваемых заголовков, включая следующие заголовки:
Web.config:
<system.web>
<httpRuntime enableVersionHeader="false"/>
</system.web>
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
</customHeaders>
</httpProtocol>
</system.webServer>
Global.asax.cs:
protected void Application_Start()
{
MvcHandler.DisableMvcResponseHeader = true;
}