서버 응답 헤더 IIS7 제거


107

IIS7에서 "서버"응답 헤더를 제거하는 방법이 있습니까? HttpModules를 사용하여 동일한 결과를 얻을 수 있음을 보여주는 기사가 있습니다. 서버에 대한 관리자 권한이없는 경우 유용합니다. 또한 ISAPI 필터를 작성하고 싶지 않습니다.

내 서버에 대한 관리자 권한이 있습니다. 그래서 저는 위의 것들을하고 싶지 않습니다. 그러니 저도 그렇게하도록 도와주세요.


답변:


111

이것을 global.asax.cs에 추가하십시오.

protected void Application_PreSendRequestHeaders()
{
    Response.Headers.Remove("Server");
    Response.Headers.Remove("X-AspNet-Version");
    Response.Headers.Remove("X-AspNetMvc-Version");
}

11
는 HTTP 모듈의 대답은 이것보다 높은 이유를 알고하지 마십시오,이 훨씬 쉽습니다
jjxtra

2
NullReferenceException의존한다면 Cassini에서 얻을 수 있습니다 HttpContext.Current. 이 블로그 게시물 은 중요한 경우 Cassini 지원 중단을 방지하면서 그렇게하는 방법을 보여줍니다.
Owen Blacker 2012 년

49
ASP.NET이 아닌 정적 .CSS 같은 파일은 .js를 들어, 요청 만이 작품을 @PsychoDad
최대 토로

1
MVC 헤더를 제거하려면 다음을 수행 할 수 있습니다. MvcHandler.DisableMvcResponseHeader = true;
ProVega 2014 년

7
를 사용하는 것은 좋지 않습니다 PreSendRequestHeaders클래스 그 구현에 IHttpModuleGlobal.asax. 스트레스 부하로 인해 서버에서 앱이 중단되는 이벤트를 목격했습니다. BeginRequest이벤트는 응답 헤더의 변경을 작동합니다. hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspx를 참조하십시오 .
Dmitry S.

77

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>

훌륭합니다. 서버 팜에서 ETag 헤더를 제거하기 위해이를 조정할 수도 있습니다.
devstuff

이로 인해 casini에서 런타임 오류가 발생합니다 ... / ASP.NET Dev 서버
UpTheCreek

2
@UpTheCreek ASP.Net 개발 서버 (Cassini)는 그 코드를 좋아하지 않을 것입니다. 이 블로그 게시물은 당신이 있는지 확인해야합니다 -하지만, 그것에 대한 해결책을 가지고 HttpApplicationHttpRequestHttpContext, 그리고 HttpResponse하지 null뿐만 아니라 검사하는 HttpRequest.IsLocal것입니다 false.
Owen Blacker 2012 년

2
에서 헤더를 수정하면 HttpCacheModule에 문제PreSendRequestHeaders발생할있으므로PostReleaseRequestState 대신 비슷한 것을 사용해야 합니다.
Eirik H

5
이 모듈은 IIS가 정적 파일 (css / less / images 등)에 대해 304 Not Modified 헤더를 보낼 때 호출되지 않습니다. 이것은 ASP.NET 파이프 라인에 도달하지 않기 때문입니다.
따라서이

42

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>

11
이것은 서버 헤더 만 비우고 제거하지는 않습니다.
Nick Evans

무지해서 미안하지만 어느 부분에 이것을 추가해야합니까?! 나는 <의 system.webServer> 내부를 추가하는 시도
인 Vignesh Subramanian

1
감사! IIS 8.5에서 작동하므로 매우 쉽습니다. 나는 텍스트 편집기가 없지만 GUI를 쉽게 사용할 수 있습니다. 이름은 Server뿐만 아니라 RESPONSE_Server 여야합니다 (처음에는 실패했습니다).
Louis Matthijssen 2014 년


4
@vignesh 이것은 일부 UrlRewrite 구성 하위 노드입니다. .NET의 rewrite노드 아래에 배치해야합니다 system.webServer. UrlRewrite가 서버에 설치되어 있지 않으면 사이트가 충돌합니다. 그리고 먼저 IIS 구성 콘솔을 사용하여 해당 구성 노드를 기록하는 방법을 확인하는 것이 좋습니다.
Frédéric

36

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-VersionX-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에서 생성하는 숨겨진 입력에는 적용되지 않습니다)).


18

실제로 위에 표시된 코딩 된 모듈과 Global.asax 예제는 유효한 요청에 대해서만 작동합니다.

예를 들어, URL 끝에 <를 추가하면 여전히 서버 헤더를 노출하는 "잘못된 요청"페이지가 표시됩니다. 많은 개발자들이 이것을 간과합니다.

표시된 레지스트리 설정도 작동하지 않습니다. URLScan은 "서버"헤더를 제거하는 유일한 방법입니다 (적어도 IIS 7.5에서는).


나쁜 요청에서도 코드화 된 모듈 (web.config에 추가됨)으로 작동합니다.) global.asax에서는 실제로 작동하지 않습니다 (예 : 정적 파일 등)
kapsiR

요청 유효성 검사가 켜져 있기를 바랍니다.
Dan Ware

1
누구든지 IIS 8+ 용 urlscan에 대한 대안이 있습니까?
herostwist

최소한 IIS10 +에는 작동하는 솔루션이 있습니다. stackoverflow.com/a/53222967/1671558
Ilya Chernomordik

16

또는 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>

3
이 방법은 'Server'헤더를 제거하지 않습니다. 나머지는 제거됩니다.
Pure.Krome 2014 년

서버 수준의 응답 헤더 구성에서 X-Powered-By를 제거 할 수 있습니다.
Snowburnt 2014 년

1
경우가 있는지 모르겠어요 경우 이런 식으로 제거합니다 X-AspNet-VersionX-AspNetMvc-Version헤더. 내가 아는 것은이 방법이 항상 작동하지는 않는다는 것입니다 (작동하는 경우). 더 안정적인 제거 방법은 @Frederic 답변을 참조하십시오.
TheBlueSky

이제 IIS10 +에서 서버 헤더를 제거하는 방법이 있습니다. stackoverflow.com/a/53222946/1671558
Ilya Chernomordik

14

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를 업데이트해야합니다.


12

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>

URL 재 작성


해커에서 모든 IIS 및 ASP 버전을 제거합니까?
aggie

1
위의 수정은 웹 페이지에서 올바르게 작동합니다.하지만 이미지 / 아이콘의 경우 500 내부 서버 오류가 발생하면 값 대신 서버 : Microsoft-IIS / 7.5가 표시됩니다.이 문제에 대해 도와 주시겠습니까
ravithejag

11

제거하려면 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을 사용하지 않고 이러한 헤더를 비활성화하는 가장 좋은 방법을 보여주는 이 링크를 참조 하세요 .


9

헤더를 제거하고 싶다면 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>

1
이는 css / js와 같은 리소스에 서버 헤더가없고 구성없이 서버에서 서버로 포팅되며 서버 응답 헤더가 비어 있지 않고 전송되지 않기 때문에 가장 적합합니다.
Adam Caviness

runAllManagedModulesForAllRequests = "true"로 인해 앱 속도가 느려지고 권장되지 않는다는 댓글을 보았습니다. 대신 urlrewrite 모듈 outboundRules를 사용하여 정적 파일의 서버 값도 지울 수 있습니다. britishdeveloper.co.uk/2010/06/…
Juri

5

, 설정 시도 HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeaderA와 레지스트리 항목 REG_DWORD의를 1.


이 레지스트리 설정이 IIS6 및 IIS7 모두에 대해 사용중인 모든 OS (W2K8, W2K3)에서 작동하는 유일한 변경 인 것처럼 보이는 서버 팜에서 이상한 상황이 발생했습니다.
jerhewet

2
실망스럽게도 이것은 가상 머신을 재부팅 한 후에도 아무런 차이가 없습니다. Windows Server 2008 R2 Standard, "버전 6.1 (빌드 7601 : 서비스 팩 1)"에서 IIS 7.5를 실행하고 있습니다. 마찬가지로, 내 OnPreSendRequestHeaders이벤트 핸들러 (위 참조)는 어떤 이유로 든 절대로 실행되지 않습니다.
Owen Blacker 2013 년

3
불행하게도 레지스트리 키는 IIS 7.5에서 작동하지 않는 것
앤드류 Csontos

4

UrlScanAlternateServerName=under 를 사용하여 서버 헤더를 제거 할 수도 있습니다 [options].


2

위로 다음 eddiegroves '대답 URLScan은 버전에 따라, 대신 선호 할 수 있습니다 RemoveServerHeader=1에서[options] .

이 옵션이 추가 된 URLScan 버전은 확실하지 않지만 버전 2.5 이상에서 사용할 수 있습니다.


2

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


2
Stack Overflow에 코드를 게시하세요. 게시 코드가 훨씬 더 도움이 될 수 있도록 링크, 변경 및 중단 할 수 있습니다
실수하는 철학자

2

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 포함).


1

나는 이것을 조사했고 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"


1

위에서 제안한 솔루션은 다음과 같이 변경되었습니다. 여기에 시나리오와 솔루션을 게시하고 있습니다.

나를 위해 다음 헤더를 제거하고 싶었습니다.

  • 섬기는 사람
  • X-Powered-By
  • X-AspNet- 버전
  • X-AspNetMvc- 버전

내 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>

도움이 되었기를 바랍니다.


0

나는 여기에 모든 것을 시도했고 다른 유사한 스택 오버플로 스레드에서 시도했습니다.

구성 변경 후 브라우저 캐시를 지우는 것을 잊었 기 때문에 잠시 전화를 끊었습니다. 그렇게하지 않고 파일이 로컬 캐시에 있으면 원래 헤더 (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 모듈입니다. 값을 비울뿐만 아니라 서버 헤더 를 제거 할 수 있습니다. 기본적으로 다음을 제거합니다.

  • 섬기는 사람
  • X-Powered-By
  • X-Aspnet- 버전
  • 서버 : Microsoft-HTTPAPI / 2.0- "요청이 IIS로 전달되지 않는 경우"반환됩니다.

-1

IIS 7.5 및 최신 버전에는 헤더 텍스트가 iiscore.dll

16 진 편집기를 사용하여 문자열과 그 53 65 72 76 65 72뒤 의 단어 "Server" 를 찾아 널 바이트로 바꿉니다. 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 

다른 방법과 달리 이것은 성능 저하를 초래하지 않습니다. 헤더는 내부 오류를 포함하여 모든 요청에서도 제거됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.