IIS / ASP.NET 응답 헤더를 제거하는 방법


46

보안 요청에 따라 클라이언트 브라우저로 전송되는 몇 가지 응답 헤더를 제거하라는 IIS / 6.0 서버가 있습니다. 응답 헤더를 통해 플랫폼 정보를 공개하는 데 관심이 있습니다. 웹 사이트 (X-Powered-By 또는 일부 헤더)의 IIS 구성에서 모든 HTTP-HEADERS를 제거했습니다.

(개인적으로는이 정보가 숨겨져 있어도 쉽게 찾을 수 있지만 내 전화가 아니라는 것을 알고 있습니다.)

제거하려는 헤더 :

  • 서버 -Microsoft-IIS / 6.0
  • X-ASPNET-버전 - 2.0.50727

또한 ASP.NET MVC도 자체 헤더를 방출한다는 것을 알고 있습니다. 제거하는 방법을 알고 있다면 도움이 될 것입니다.

  • X-AspNetMvc- 버전 -1.0

답변:


32

보안 부서에서 서버 유형을 식별하기 어렵게하기 위해이 작업을 수행하려고합니다. 이로 인해 자동 해킹 도구의 사용이 줄어들고 사람들이 서버에 침입하기가 더 어려워 질 수 있습니다.

IIS 내에서 웹 사이트 속성을 연 다음 HTTP 헤더 탭으로 이동하십시오. 대부분의 X- 헤더는 여기에서 찾아서 제거 할 수 있습니다. 개별 사이트 나 전체 서버에 대해 수행 할 수 있습니다 (트리에서 웹 사이트 개체의 속성 수정).

서버 헤더의 경우 IIS6에서 Microsoft의 URLScan 도구를 사용하여 원격으로 할 수 있습니다 . Port 80 Software는 또한 ServerMask 라는 제품을 만들어 이를 훨씬 더 많이 처리합니다.

IIS7의 경우 사용자 지정 모듈을 사용하여 서버 헤더를 수정하는 방법에 대한 훌륭한 기사 가 있습니다.

Global.asax의 MVC 헤더 :

MvcHandler.DisableMvcResponseHeader = true;

2
허용 된 답변입니다. @squillman과 답변을 공유 할 수 있으면 좋겠습니다. X-AspNet- 버전을 수정하기위한 Web.config : <system.web> <httpRuntime enableVersionHeader = "false"/> </system.web>
Bryan Rehbein

X 헤더 제거는 이것을 web.config에 저장하므로 시간을 절약하십시오. <system.webServer> <httpProtocol> <customHeaders> <remove name = "X-Powered-By"/> </ customHeaders> </ httpProtocol> </system.webServer>
Broam 2009

Broam, 이것이 IIS7에 대한 정답입니다. 문제는 IIS6에 관한 것입니다. IIS6에는 영향을 미치지 않습니다.
Anthony

56

너무 많은 정보를 공개하는 모든 사용자 지정 헤더를 제거하려면 IIS 7의 방법이 다양합니다 (불행히도).

헤더 이름 : X-Powered-By

더하다:

<httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
  </customHeaders>
</httpProtocol>

<system.webServer>섹션을 참조하십시오.

헤더 이름 : 서버

PreSendRequestHeaders 이벤트에서 Response.Headers.Remove ( "Server")를 호출하여이 헤더를 제거하는 httpModule을 구현하십시오. 이에 대한 또 다른 리소스 : IIS 7에서 ASP.NET MVC 웹 응용 프로그램 클로킹

헤더 이름 : X-AspNet-Version

web.config의 httpRuntime 섹션에서 다음을 설정하십시오.

<httpRuntime enableVersionHeader="false" />

헤더 이름 : X-AspNetMvc-Version

global.asax의 Application_Start 이벤트에서 다음 코드 (C #)를 실행하십시오.

MvcHandler.DisableMvcResponseHeader = true;

나는 무언가를 정확하게하고 싶습니다.이 트릭의 대부분은 통합 파이프 라인 모드에서 IIS> = 7에서만 작동합니다. 클래식 모드에서는 아무 것도 수행하지 않거나 (web.config의 <remove> 행) 예외를 발생시킵니다 (글로벌을 제거하는 또 다른 솔루션 인 global.asax의 Response.Headers에 대한 직접 호출). 클래식 모드를 고수하는 웹 사이트에서 작업 중이지만 불행히도 이러한 헤더를 제거 할 수 없었습니다.
AFract

16

이것을 ASP.NET 응용 프로그램의 web.config 파일에 넣으면 X-AspNet-Version 헤더가 제거됩니다.

<system.web>
<httpRuntime enableVersionHeader="false" />
</system.web>

system.web 태그가 파일에 이미 존재해야합니다. 복제본을 만들지 말고 httpRuntime 태그를 추가하십시오. httpRuntime 태그가 이미 존재할 수도 있습니다. 그렇다면 속성을 추가하거나 이미 존재하는 경우 해당 값을 설정하십시오.


그러나 이것은 'powered by'헤더를 남깁니다.
UpTheCreek

그러나이 system.web웹 사이트 에이 줄 코드를 넣으면 다운됩니다. 왜 그런지 아십니까?
neda Derakhshesh 2016

5

현재 프로젝트에서 "강화"주기를 마쳤습니다. 다음 헤더를 제거하기위한 HTTPModule이 포함 된 접근 방식에 대해 블로그를 작성했습니다 .

서버,
X-AspNet 버전,
X-AspNetMvc 버전,
X 전원 공급

아래에 재현 된 관련 작품 :

그러나 구성을 통해 서버 응답 헤더를 쉽게 제거 할 수있는 방법은 없습니다. 다행히 IIS7에는 관리 가능한 플러그 가능 모듈 인프라가있어 기능을 쉽게 확장 할 수 있습니다. 다음은 지정된 HTTP 응답 헤더 목록을 제거하기위한 HttpModule의 소스입니다.

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>

2
구성에 의해 헤더 생성을 억제하면 헤더를 생성 한 다음 제거하는 것보다 훨씬 더 의미가있는 것 같습니다.
realMarkusSchmidt

1
그 링크는 이제 죽은 것 같습니다. :-(
Danny Schoemann

2

이 블로그를 확인하십시오 . 응답 헤더를 제거하기 위해 코드를 사용하지 마십시오. 마이크로 소프트 에 따르면 불안정하다

대신 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>

이것이 내 문제에 대한 해결책이었습니다. win2008 R2 (IIS 7.5) 사용
paqogomez

1

나는 다음 코드를 사용하고 나를 위해 일한다 .iis 7.5

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

3
코드 파이프 라인을 거치지 않는 이미지와 콘텐츠는 어떻습니까?
Mark Sowul

"서버"에 무엇을 넣었습니까? 이럴까요? Response.Headers.Remove ( "서버 : Microsoft-IIS / 7.0"); ? 아니면 서버입니까? 도와주세요
neda Derakhshesh 2016

나는 "서버"를 아무 것도 넣지 않았습니다. 헤더 이름이 다른 경우 다른 이름으로 시도해 볼 수 있습니다.
Nasir Mahmood
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.