サーバー応答ヘッダー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依存してHttpContext.Currentいる場合、あなたはあなたがカッシーニであなたを見つけるかもしれません。このブログの投稿では、Cassiniのサポートがあなたにとって重要である場合に、それを回避する方法を示しています。
オーウェンブラッカー

49
@PsychoDadこれはASP.NETリクエストでのみ機能し、.cssや.jsなどの静的ファイルでは機能しません
Max Toro

1
MVCヘッダーを取り除くには、次のようにします。MvcHandler.DisableMvcResponseHeader = true;
ProVega 2014年

7
またはPreSendRequestHeadersを実装するクラスでを使用することはお勧めできません。私は、ストレス負荷の下でサーバー上のアプリがフリーズするイベントを目撃しました。イベントはレスポンスヘッダの変更を行うために動作するはずです。hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspxを参照してください。IHttpModuleGlobal.asaxBeginRequest
ドミトリー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開発サーバー
UpTheCreek

2
@UpTheCreek ASP.Net開発サーバー(Cassini)はそのコードを気に入らないでしょう。このブログ記事は、あなたがいることを確認する必要がある-が、それに対する解決策を持っているHttpApplicationHttpRequestHttpContext、およびHttpResponseでないnullだけでなく、チェックことHttpRequest.IsLocalですfalse
オーウェンブラッカー

2
のヘッダーを変更するとHttpCacheModule問題PreSendRequestHeaders発生する可能があるため、PostReleaseRequestState代わりに次のようなものを使用する必要があります。
Eirik H 2013

5
これはASP.NETパイプラインに到達しないため、IISが静的ファイル(css / less / imagesなど)の304 Not Modifiedヘッダーを送信するときにモジュールは呼び出されないため、この状況ではサーバー:Microsoft IIS / 7.5が引き続きレンダリングされます
Jano

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
これはServerヘッダーを空白にするだけで、削除するわけではないことに注意してください。
Nick Evans

無知で申し訳ありませんが、どの部分にこれを追加する必要がありますか?!<system.webServer>内に追加してみました
Vignesh Subramanian '15

1
ありがとう!IIS 8.5で動作します。これはとても簡単です。テキストエディターはありませんが、GUIは簡単に使用できます。名前は、サーバーだけではなく、RESPONSE_Serverにする必要があります(これが最初に失敗した場所です)。
Louis Matthijssen 2014


4
@vigneshこれはいくつかのUrlRewrite構成サブノードです。あなたはそれらをrewriteノードの下に置く必要がありますsystem.webServer。UrlRewriteがサーバーにインストールされていないと、サイトがクラッシュするので注意してください。そして、まずIIS構成コンソールを使用して、それらの構成ノードを書き留める方法を確認することをお勧めします。
フレデリック

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不能にするためのネットの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ノードに移動して設定します。arrResponseHeaderfalse。します。の後IISReset、それが考慮されます。
(私はこれをここで見つけましたが、この投稿が古いIIS 6.0の設定方法に関するものであることを除きます。)

アプリケーションコードによるソリューションは、静的コンテンツで生成されたヘッダーにはデフォルトで適用されないことを忘れないでください(runAllManagedModulesForAllRequests変更のためにをアクティブ化できますが、すべてのリクエストで.Netパイプラインが実行されます)。X-AspNetMvc-Version静的コンテンツには追加されないため、問題はありません(少なくとも静的リクエストが.Netパイプラインで実行されない場合)。

補足:目的が使用されているテクノロジーのクロークである場合は、標準の.Net Cookie名も変更する必要があります(.ASPXAUTHフォーム認証がアクティブ化されている場合(web.config nameformsタグの属性をASP.NET_SessionId使用)、(タグの<sessionState cookieName="yourName" />下のweb.configで使用system.web)、__RequestVerificationToken(変更を使用してコードで記述しますがAntiForgeryConfig.CookieName、残念ながら、このシステムがHTMLで生成する非表示の入力には適用されません)))。


18

実際、上記のコード化されたモジュールとGlobal.asaxの例は、有効なリクエストに対してのみ機能します。

たとえば、URLの最後に<を追加すると、サーバーヘッダーが公開された「Bad request」ページが表示されます。多くの開発者はこれを見落としています。

示されているレジストリ設定も機能しません。URLScanは、「サーバー」ヘッダーを削除する唯一の方法です(少なくともIIS 7.5では)。


不正なリクエストでも、コード化されたモジュール(web.configに追加)を使用すると機能します;)global.asaxで実際には機能していません(たとえば、静的ファイルなど)
kapsiR

リクエストの検証がまだオンになっているといいのですが。
Dan Ware

1
IIS 8以降でurlscanに代わるものはありますか?
herostwist 2017

少なくともIIS10 +で働いて解決策があります:stackoverflow.com/a/53222967/1671558
イリヤ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 2015年

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自体にエラー応答が残る場合があります。

PS 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のバージョンい
アギー

1
あなたがこの上のヘルプ私を喜ばマイクロソフト-IIS / 7.5の代わりにvalue.Canの:上記の修正は、500内部サーバーエラーが発生した場合、それはサーバを示しています画像/アイコン用のWeb pages.Butのために正常に動作している
ravithejag

11

Server:ヘッダーを削除するには、に移動しGlobal.asaxApplication_PreSendRequestHeadersイベントを検索/作成し、次のように行を追加します(BKこのブログのおかげで、これはCassini /ローカル開発でも失敗しません):

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/…–
ジュリ

5

設定してみてくださいHKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeaderへのレジストリエントリREG_DWORDのを1


このレジストリ設定が、IIS6とIIS7の両方で使用しているすべてのOS(W2K8、W2K3)で機能する唯一の変更であると思われるサーバーファームで奇妙な状況に遭遇しました。
jerhewet

2
イライラして、仮想マシンを再起動した後でも、これは私にとって何の違いもありません。Windows Server 2008 R2 Standard、「バージョン6.1(ビルド7601:Service Pack 1)」でIIS 7.5を実行しています。同様に、私のOnPreSendRequestHeadersイベントハンドラー(上記を参照)は、何らかの理由で起動しません。
Owen Blacker 2013年

3
残念ながら、レジストリキーはIIS 7.5では機能しないようです
Andrew Csontos 2013年


2

フォローアップeddiegroves'と答えたのURLScanのバージョンに応じて、あなたの代わりに好むかもしれRemoveServerHeader=1[options]

このオプションが追加されたURLScanのバージョンはわかりませんが、バージョン2.5以降で使用できます。


2

レジストリの編集とUrlScanなどのツールの両方を使用してIISで適切に設定する必要がある理由を説明する記事を見つけました。私は私たちのサーバーでそれを追跡し、それは動作します: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ツールを使用しての一般的なpitfalsは以下のとおりです。http://msdn.microsoft.com/en-us/library/ff648552.aspx#ht_urlscan_008


2
Stack Overflowにコードを投稿してください。リンクは変更されたり壊れたりする可能性があるため、コードを投稿するほうがはるかに役立ちます
Blundering Philosopher

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:Webアプリ内のすべての応答はこれによって影響を受けます(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-Version
  • X-AspNetMvc-Version

これらを自分の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プロジェクトの一部の静的ファイルで "サーバー"ヘッダーが引き続きswaggerで取得されていました。

私は最終的に発見し、このソリューションを適用し、現在すべてでは不要なヘッダーはなくなりました:

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モジュールです。値を空にするだけでなく、Serverヘッダーを削除できます。デフォルトでは以下を削除します:

  • サーバ
  • X-Powered-By
  • X-Aspnet-Version
  • サーバー:Microsoft-HTTPAPI / 2.0-「リクエストがIISに渡されなかった」場合に返されます

-1

IIS 7.5以降のバージョンには、ヘッダーテキストが格納されています iiscore.dll

16進エディタを使用して、文字列と53 65 72 76 65 72その後の「サーバー」という単語を見つけ、それらをnullバイトに置き換えます。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.