Ответ 1
Вы можете заставить все запросы пройти через управляемый код, добавив это в свой webconfig:
<modules runAllManagedModulesForAllRequests="true">
Тогда даже статические файлы должны придерживаться ваших правил заголовка.
В целях повышения безопасности нашего API и сайта я удаляю заголовки, которые утечки информации о том, что сайт работает.
Пример перед снятием заголовков:
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 05 Jun 2013 00:27:54 GMT
Content-Length: 3687
Web.config:
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
Global.asax.cs:
protected void Application_PreSendRequestHeaders() {
Response.Headers.Remove("Server");
Response.Headers.Remove("X-AspNet-Version");
Response.Headers.Remove("X-AspNetMvc-Version");
Response.AddHeader("Strict-Transport-Security", "max-age=300");
Response.AddHeader("X-Frame-Options", "SAMEORIGIN");
}
И после этого все обращения к сайту и API возвращают более безопасные заголовки, например:
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Wed, 05 Jun 2013 00:27:54 GMT
Content-Length: 3687
До сих пор так хорошо. Тем не менее, я заметил в Firebug, что если вы посмотрите на статический контент (например, load.gif), он по-прежнему содержит заголовок сервера.
HTTP/1.1 304 Not Modified
Cache-Control: no-cache
Accept-Ranges: bytes
Etag: "a3f2a35bdf45ce1:0"
Server: Microsoft-IIS/8.0
Date: Tue, 25 Jun 2013 18:33:16 GMT
Я предполагаю, что это как-то обрабатывается IIS, но не может найти нигде, чтобы удалить этот заголовок. Я попытался добавить:
<remove name="Server" />
в раздел httpProtocol/customHeaders в Web.config, как упоминалось выше. Я также попытался войти в раздел заголовков HTTP-ответов диспетчера IIS и добавить пару поддельных имен/значений для заголовка сервера. В обоих случаях он все равно возвращает
Server: Microsoft-IIS/8.0
при загрузке любых изображений, CSS или JS. Где/что мне нужно, чтобы установить что-то, чтобы исправить это?
Вы можете заставить все запросы пройти через управляемый код, добавив это в свой webconfig:
<modules runAllManagedModulesForAllRequests="true">
Тогда даже статические файлы должны придерживаться ваших правил заголовка.
Точно так же, как в этом ответе, а в этот веб-сайт:, вы должны использовать следующие шаги:
С#:
namespace MvcExtensions.Infrastructure
{
public class CustomServerName : 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="CustomHeaderModule" type="MvcExtensions.Infrastructure.CustomServerName" />
</modules>
</system.webServer>
К сожалению, управляемые модули кода работают только для кода, проходящего через конвейер ASP.NET, в то время как другие правильно предположили, что можно заставить все запросы через управляемый код, я лично считаю, что это менее желательно.
Чтобы удалить заголовки из всех запросов, включая статический контент, который по умолчанию обслуживается напрямую, а не через управляемый код, можно использовать модуль Native-Code. К сожалению, модули Native-Code немного сложнее писать, поскольку они используют API-интерфейсы win32, а не ASP.NET, однако по моему опыту они гораздо более подходят для удаления заголовков.
Следующая ссылка имеет двоичные файлы и исходный код для модуля Native-Code, который можно использовать для удаления заголовков. Он не требует дополнительной настройки для удаления заголовков "Сервер", но другие заголовки для удаления могут быть добавлены в конфигурацию IIS.
http://www.dionach.com/blog/easily-remove-unwanted-http-headers-in-iis-70-to-85
Единственным решением без простого перечисленного решения был заголовок "Сервер". Мне удалось удалить его локально в IIS и на веб-сайте Azure, добавив его в файл web.config.
<system.webServer>
<security>
<requestFiltering removeServerHeader="true" />
</security>
</system.webServer>
Используйте IIS UrlRewrite 2.0 для гашения заголовка ответа сервера. Добавьте следующий код в файл Web.config
<system.webServer>
<rewrite>
<outboundRules>
<rule name="Remove RESPONSE_Server" >
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
Ни одно из решений здесь не работает должным образом для меня.
Моим простым решением было добавить это в мой файл web.config
:
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="Server" />
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>