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
依存してHttpContext.Current
いる場合、あなたはあなたがカッシーニであなたを見つけるかもしれません。このブログの投稿では、Cassiniのサポートがあなたにとって重要である場合に、それを回避する方法を示しています。
PreSendRequestHeaders
を実装するクラスでを使用することはお勧めできません。私は、ストレス負荷の下でサーバー上のアプリがフリーズするイベントを目撃しました。イベントはレスポンスヘッダの変更を行うために動作するはずです。hanselman.com/blog/ChecklistWhatNOTToDoInASPNET.aspxを参照してください。IHttpModule
Global.asax
BeginRequest
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
不能にするためのネットの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 Cookie名も変更する必要があります(.ASPXAUTH
フォーム認証がアクティブ化されている場合(web.config name
でforms
タグの属性をASP.NET_SessionId
使用)、(タグの<sessionState cookieName="yourName" />
下のweb.configで使用system.web
)、__RequestVerificationToken
(変更を使用してコードで記述しますがAntiForgeryConfig.CookieName
、残念ながら、このシステムがHTMLで生成する非表示の入力には適用されません)))。
実際、上記のコード化されたモジュールとGlobal.asaxの例は、有効なリクエストに対してのみ機能します。
たとえば、URLの最後に<を追加すると、サーバーヘッダーが公開された「Bad request」ページが表示されます。多くの開発者はこれを見落としています。
示されているレジストリ設定も機能しません。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自体にエラー応答が残る場合があります。
PS 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とこのブログのおかげで、これは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を使用せずにこれらのヘッダーを無効にする最良の方法を示すこのリンクを参照してください。
ヘッダーを削除するだけの場合は、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
へのレジストリエントリREG_DWORD
のを1
。
OnPreSendRequestHeaders
イベントハンドラー(上記を参照)は、何らかの理由で起動しません。
URLScanはまた、使用して、サーバヘッダを除去することができるAlternateServerName=
の下で[options]
。
フォローアップeddiegroves'と答えたのURLScanのバージョンに応じて、あなたの代わりに好むかもしれRemoveServerHeader=1
下[options]
。
このオプションが追加されたURLScanのバージョンはわかりませんが、バージョン2.5以降で使用できます。
レジストリの編集と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
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が含まれます)。
私はこれを調査しましたが、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プロジェクトの一部の静的ファイルで "サーバー"ヘッダーが引き続き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ヘッダーを削除できます。デフォルトでは以下を削除します:
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
他のいくつかの方法とは異なり、これによってパフォーマンスが低下することはありません。ヘッダーは、内部エラーも含めて、すべてのリクエストから削除されます。