APIとサイトをより安全にするための取り組みの一環として、サイトが実行しているものに関する情報をリークするヘッダーを削除します。
ヘッダーを取り除く前の例:
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 05 Jun 2013 00:27:54 GMT
Content-Length: 3687
Web.config:
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
Global.asax.cs:
protected void Application_PreSendRequestHeaders() {
Response.Headers.Remove("Server");
Response.Headers.Remove("X-AspNet-Version");
Response.Headers.Remove("X-AspNetMvc-Version");
Response.AddHeader("Strict-Transport-Security", "max-age=300");
Response.AddHeader("X-Frame-Options", "SAMEORIGIN");
}
その後、サイトとAPIへのすべての呼び出しは、次のように、より安全なヘッダーを返します。
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Wed, 05 Jun 2013 00:27:54 GMT
Content-Length: 3687
ここまでは順調ですね。ただし、Firebugで、静的コンテンツ(loading.gifなど)を見ると、サーバーヘッダーが含まれていることに気付きました。
HTTP/1.1 304 Not Modified
Cache-Control: no-cache
Accept-Ranges: bytes
Etag: "a3f2a35bdf45ce1:0"
Server: Microsoft-IIS/8.0
Date: Tue, 25 Jun 2013 18:33:16 GMT
これはIISによって処理されていると思いますが、そのヘッダーを削除するための場所が見つかりません。追加してみました:
<remove name="Server" />
上記のように、Web.configのhttpProtocol/customHeadersセクションに追加します。また、IIS ManagerのHTTP Response Headersセクションに移動して、Serverヘッダーに偽の名前/値のペアを追加しました。どちらの場合でも、
Server: Microsoft-IIS/8.0
画像、CSS、またはJSをロードするとき。これを修正するためにどこに/何を設定する必要がありますか?
これをwebconfigに追加することで、すべてのリクエストがマネージコードを通過するように強制できるはずです。
<modules runAllManagedModulesForAllRequests="true">
そうすれば、静的ファイルでさえ、ヘッダールールに準拠する必要があります。
this answer 、および this website: と同じように、次の手順を使用する必要があります。
C#:
namespace MvcExtensions.Infrastructure
{
public class CustomServerName : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += OnPreSendRequestHeaders;
}
public void Dispose() { }
void OnPreSendRequestHeaders(object sender, EventArgs e)
{
HttpContext.Current.Response.Headers.Remove("Server");
}
}
}
Web.config:
<system.webServer>
<modules>
<add name="CustomHeaderModule" type="MvcExtensions.Infrastructure.CustomServerName" />
</modules>
</system.webServer>
残念ながら、マネージコードモジュールはASP.NETパイプラインを通過するコードに対してのみ機能しますが、マネージコードを介してすべての要求を強制することは可能であると他の人が正しく示唆していますが、個人的にはこれは望ましくないと感じています。
静的コンテンツを含むすべてのリクエストからヘッダーを削除するために、デフォルトではマネージコードではなく直接提供されるため、Native-Codeモジュールを使用できます。残念ながら、Native-CodeモジュールはASP.NETではなくwin32 APIを使用しているため、作成が少し難しいですが、私の経験では、ヘッダーの削除に適しています。
次のリンクには、ヘッダーの削除に使用できるNative-Codeモジュールのバイナリとソースコードがあります。 "Server"ヘッダーを削除するために追加の構成は必要ありませんが、削除する他のヘッダーをIIS構成に追加できます。
http://www.dionach.com/blog/easily-remove-unwanted-http-headers-in-iis-70-to-85
簡単にリストされた解決策がない唯一のものは「サーバー」ヘッダーでした。 IISおよびAzure Webサイトでこれをweb.configに追加することで、ローカルで削除できました。
<system.webServer>
<security>
<requestFiltering removeServerHeader="true" />
</security>
</system.webServer>
IIS UrlRewrite 2.0を使用してサーバー応答ヘッダーを空白にします。Web.configファイルに次のコードを追加します
<system.webServer>
<rewrite>
<outboundRules>
<rule name="Remove RESPONSE_Server" >
<match serverVariable="RESPONSE_Server" pattern=".+" />
<action type="Rewrite" value="" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
ここでの解決策はどれも私にとって適切に機能しませんでした。
私の簡単な解決策は、これをweb.config
ファイルに追加することでした:
<system.webServer>
<httpProtocol>
<customHeaders>
<remove name="Server" />
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>