IIS7에서 "서버"응답 헤더를 제거하는 방법이 있습니까? HttpModules를 사용하여 동일한 결과를 얻을 수 있음을 보여주는 기사가 있습니다. 서버에 대한 관리자 권한이없는 경우 유용합니다. 또한 ISAPI 필터를 작성하고 싶지 않습니다.
내 서버에 대한 관리자 권한이 있습니다. 그래서 저는 위의 것들을하고 싶지 않습니다. 그러니 저도 그렇게하도록 도와주세요.
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");
}
NullReferenceException
의존한다면 Cassini에서 얻을 수 있습니다 HttpContext.Current
. 이 블로그 게시물 은 중요한 경우 Cassini 지원 중단을 방지하면서 그렇게하는 방법을 보여줍니다.
PreSendRequestHeaders
클래스 그 구현에 IHttpModule
나 Global.asax
. 스트레스 부하로 인해 서버에서 앱이 중단되는 이벤트를 목격했습니다. BeginRequest
이벤트는 응답 헤더의 변경을 작동합니다. hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx를 참조하십시오 .
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>
HttpApplication
는 HttpRequest
의 HttpContext
, 그리고 HttpResponse
하지 null
뿐만 아니라 검사하는 HttpRequest.IsLocal
것입니다 false
.
PreSendRequestHeaders
가 발생할 수 있으므로PostReleaseRequestState
대신 비슷한 것을 사용해야 합니다.
IIS 용 URL 재 작성 모듈 버전 2.0 (UrlRewrite)이 활성화 된 상태에서 구성 섹션에서 <configuration>
➡ <system.webServer>
➡ <rewrite>
아웃 바운드 규칙을 추가합니다.
<outboundRules>
<rule name="Remove RESPONSE_Server" >
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
rewrite
노드 아래에 배치해야합니다 system.webServer
. UrlRewrite가 서버에 설치되어 있지 않으면 사이트가 충돌합니다. 그리고 먼저 IIS 구성 콘솔을 사용하여 해당 구성 노드를 기록하는 방법을 확인하는 것이 좋습니다.
Scott Mitchell은 블로그 게시물에서 불필요한 헤더 를 제거하는 솔루션을 제공합니다 .
다른 답변에서 이미 언급했듯이 Server
헤더의 경우 http 모듈 솔루션 또는 IIS 10+ 용 web.config 솔루션이 있거나 URLRewrite 대신 공백을 사용할 수 있습니다 .
최신 (IIS 10 이상) 설정을위한 가장 실용적인 솔루션 removeServerHeader
은 web.config에서 사용하는 것 입니다.
<system.webServer>
...
<security>
<requestFiltering removeServerHeader="true" />
</security>
...
</system.webServer>
의 경우 X-AspNet-Version
와 X-AspNetMvc-Version
단순히 모든 그들을 생성 : 그는 각 응답에 그들을 제거하는 것보다 더 나은 방법을 제공합니다.
web.config에서 enableVersionHeader
비활성화에 사용X-AspNet-Version
<system.web>
...
<httpRuntime enableVersionHeader="false" />
...
</system.web>
MvcHandler.DisableMvcResponseHeader
비활성화를 위해 .Net Application_Start 이벤트에서 사용X-AspNetMvc-Version
MvcHandler.DisableMvcResponseHeader = true;
마지막으로 IIS 구성 X-Powered-By
에서 web.config 의 사용자 지정 헤더를 제거 합니다.
<system.webServer>
...
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
...
</system.webServer>
ARR (Application Request Routing)이있는 경우 X-Powered-By
사용자 정의 헤더 설정으로 제거되지 않는 자체를 추가합니다 . 이것은 IIS 관리자, IIS 루트 (사이트가 아님)의 편집기 구성을 통해 제거 해야 합니다. system.webServer/proxy
노드 로 이동하여로 설정 arrResponseHeader
합니다 false
. 뒤에는 IISReset
고려됩니다.
( 이 게시물은 이전 IIS 6.0 구성 방법에 대한 것 외에는 여기 에서 찾았 습니다.)
애플리케이션 코드 별 솔루션은 기본적으로 정적 콘텐츠에서 생성 된 헤더에 적용되지 않는다는 점을 잊지 마십시오 ( runAllManagedModulesForAllRequests
이를 변경 하기 위해 활성화 할 수 있지만 모든 요청이 .Net 파이프 라인을 실행하게 함). X-AspNetMvc-Version
정적 콘텐츠에 추가되지 않기 때문에 문제 가되지 않습니다 (적어도 정적 요청이 .Net 파이프 라인에서 실행되지 않는 경우).
참고 : 사용 된 기술을 숨기는 것이 목표 인 경우 표준 .Net 쿠키 이름도 변경해야합니다 ( .ASPXAUTH
양식 인증이 활성화 된 경우 ( web.config의 태그에 name
속성 사용 forms
), ASP.NET_SessionId
( 태그 <sessionState cookieName="yourName" />
아래의 web.config에서 사용 system.web
), __RequestVerificationToken
(변경 를 사용하는 코드에 의해 AntiForgeryConfig.CookieName
, 그러나 안타깝게도이 시스템이 html에서 생성하는 숨겨진 입력에는 적용되지 않습니다)).
실제로 위에 표시된 코딩 된 모듈과 Global.asax 예제는 유효한 요청에 대해서만 작동합니다.
예를 들어, URL 끝에 <를 추가하면 여전히 서버 헤더를 노출하는 "잘못된 요청"페이지가 표시됩니다. 많은 개발자들이 이것을 간과합니다.
표시된 레지스트리 설정도 작동하지 않습니다. URLScan은 "서버"헤더를 제거하는 유일한 방법입니다 (적어도 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>
X-AspNet-Version
및 X-AspNetMvc-Version
헤더. 내가 아는 것은이 방법이 항상 작동하지는 않는다는 것입니다 (작동하는 경우). 더 안정적인 제거 방법은 @Frederic 답변을 참조하십시오.
이 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 자체에 오류 응답을 남길 수 있습니다.
추신 IIS 10에는 올바른 구성으로도 서버 헤더가 표시 되는 버그 가 있습니다 . 지금까지 수정되어야하지만 IIS / Windows를 업데이트해야합니다.
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 와 이 블로그 이 또한 카시니 / 지역 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을 사용하지 않고 이러한 헤더를 비활성화하는 가장 좋은 방법을 보여주는 이 링크를 참조 하세요 .
헤더를 제거하고 싶다면 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
A와 레지스트리 항목 REG_DWORD
의를 1
.
OnPreSendRequestHeaders
이벤트 핸들러 (위 참조)는 어떤 이유로 든 절대로 실행되지 않습니다.
UrlScan 은 AlternateServerName=
under 를 사용하여 서버 헤더를 제거 할 수도 있습니다 [options]
.
위로 다음 eddiegroves '대답 URLScan은 버전에 따라, 대신 선호 할 수 있습니다 RemoveServerHeader=1
에서[options]
.
이 옵션이 추가 된 URLScan 버전은 확실하지 않지만 버전 2.5 이상에서 사용할 수 있습니다.
IIS에서 올바르게 설정하기 위해 레지스트리 편집과 UrlScan과 같은 도구를 사용해야하는 이유를 설명하는 기사를 찾았습니다. 나는 우리 서버에서 그것을 따랐고 작동합니다 : http://blogs.msdn.com/b/varunm/archive/2013/04/23/remove-unwanted-http-response-headers.aspx . UrlScan 만 사용하고 레지스트리를 변경하지 않으면 World Wide Publishing Service를 중지하는 동안 서버가 HTTP.sys 파일에서 서버 http 응답을 반환합니다. 또한 다음은 UrlScan 도구를 사용하는 일반적인 실수입니다. http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008
IIS 10에서는 Drew의 접근 방식과 유사한 솔루션을 사용합니다.
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>
중요 참고 1 :이 솔루션에는 통합 된 애플리케이션 풀 세트가 필요합니다.
중요 참고 2 : 웹 앱 내의 모든 응답이 이에 영향을받습니다 (css 및 js 포함).
나는 이것을 조사했고 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");
}
위에서 제안한 솔루션은 다음과 같이 변경되었습니다. 여기에 시나리오와 솔루션을 게시하고 있습니다.
나를 위해 다음 헤더를 제거하고 싶었습니다.
내 global.asax에 추가했습니다.
<%@ Application Language="C#" %>
<script runat="server">
protected void Application_PreSendRequestHeaders()
{
Response.Headers.Remove("Server");
Response.Headers.Remove("X-Powered-By");
Response.Headers.Remove("X-AspNet-Version");
Response.Headers.Remove("X-AspNetMvc-Version");
}
</script>
위의 이벤트가 트리거되지 않았으므로 web.config에 다음을 추가하면 작동했습니다.
<modules runAllManagedModulesForAllRequests="true" />
버전 헤더를 제거하기 위해 web.config에 다음을 추가했습니다.
<httpRuntime enableVersionHeader="false" />
web.config의 변경 사항 :
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>
</configuration>
도움이 되었기를 바랍니다.
나는 여기에 모든 것을 시도했고 다른 유사한 스택 오버플로 스레드에서 시도했습니다.
구성 변경 후 브라우저 캐시를 지우는 것을 잊었 기 때문에 잠시 전화를 끊었습니다. 그렇게하지 않고 파일이 로컬 캐시에 있으면 원래 헤더 (duh)와 함께 다시 제공됩니다.
runAllManagedModulesForAllRequests 를 제거 하여 주로 작동합니다 .
<modules runAllManagedModulesForAllRequests="true">
이로 인해 대부분 의 정적 파일 에서 불필요한 헤더가 제거 되었지만 WebAPI 프로젝트의 일부 정적 파일에 "서버"헤더가 계속 표시됩니다.
드디어 발견하고이 솔루션을 적용 이제 모든 원치 않는 헤더가 사라졌습니다.
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 모듈입니다. 값을 비울뿐만 아니라 서버 헤더 를 제거 할 수 있습니다. 기본적으로 다음을 제거합니다.