4

セキュリティで保護する必要がある IIS 7.5 で実行されている、インターネットに公開された WCF サービスがあります。HTTP 応答の「サーバー」ヘッダーを削除したいと考えています。

次のコードで IDispatchMessageInspector を実装しました。

public void BeforeSendReply(ref Message reply, object correlationState)
{
    var context = WebOperationContext.Current;
    if (context != null)
    {
        context.OutgoingResponse.Headers.Remove(
            HttpResponseHeader.Server);
    }
}

ただし、サーバー ヘッダーはまだ応答に含まれています。デバッグ時に、 にOutgoingResponse.Headersが含まれていないHttpResonseHead.Serverことがわかります。独自の値を記述すると、IIS パイプラインのさらに下にある何かによって明らかに上書きされています。

編集 1

以下を試してみましたが、どちらも良くありません

public class SecureServerHeaderModule : IHttpModule
{
    #region Implementation of IHttpModule

    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += OnPreSendRequestHeaders;
    }

    public void Dispose() { }

    #endregion

    private static void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        var context = HttpContext.Current;
        if (context != null)
        {
            context.Response.Headers.Remove("Server");                
        }
    }
}

<system.web>
  <httpModules>
    <add "snip" />
  </httpModlules>
</system.web>
<system.webServer>
  <modules>
    <add "snip" />
  </modlules>
</system.webServer>

編集 2

また、動作しませんでした。

public void BeforeSendReply(ref Message reply, object correlationState)
{
    var context = OperationContext.Current;
    if (context != null)
    {
        context.OutgoingMessageProperties.Remove(
            HttpResponseHeader.Server.ToString());
        context.OutgoingMessageProperties.Add(
            HttpResponseHeader.CacheControl.ToString(), "no-store");
    }
}
4

6 に答える 6

4

これはIDispatchMessageInspector

public class SecureBehaviour : IDispatchMessageInspector
{
    public object AfterReceiveRequest(ref Message request,
        IClientChannel channel, InstanceContext instanceContext)
    {
        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {

        var httpCtx = HttpContext.Current;
        if (httpCtx != null)
        {
            httpCtx.Response.Headers.Remove(
                HttpResponseHeader.Server.ToString());
        }
    }
}
于 2012-11-06T14:07:07.347 に答える
3

web.config を編集して、system.webServerの下のcustomHeadersタグを使用してみましたか。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name="Server" />
        <remove name="X-Powered-By" />
        <remove name="X-AspNet-Version" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
</configuration>

これにより、私の C# ASP.NET アプリケーションには次の応答ヘッダーしかありません。

HTTP/1.1 200 OK
Cache-Control: max-age=3600, public
Content-Length: 20992
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Last-Modified: Tue, 15 May 2012 18:01:11 GMT
ETag: "HHktEL5IWA6rspl4Bg2ZxNmnV3gTUCLt2cTldSsl05A="
Vary: Accept-Encoding
Date: Tue, 17 Jul 2012 21:38:38 GMT

「Server」ヘッダーで試したことがないことは認めますが、このアプローチはうまくいくようです。「サーバー」ヘッダーで試していない理由は、IHttpModule の次のコードが正常に機能するためです。

    void PreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        if(HttpRuntime.UsingIntegratedPipeline)
        {
            application.Response.Headers.Remove("Server");
            application.Response.Headers.Remove("Expires");
            application.Response.Headers.Remove("Cache-Control");
            application.Response.AddHeader("Cache-Control", "max-age=3600, public");
        }
    }
于 2012-07-17T21:40:17.800 に答える
0

レジストリにアクセスできますか? もしそうなら、あなたは試すことができます

HKLM\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\DisableServerHeader
于 2012-07-12T15:40:18.543 に答える
0

進行中の作業。

このブログ エントリでは、さまざまなパイプラインと、ASP.NET モジュールがうまく機能しない理由について、もう少し詳しく説明しています。

さらに続きます。

于 2012-07-16T11:02:39.360 に答える
0

私の自己ホスト型 WCF サービスでは、M Afifi からの回答が機能しません。空のヘッダーを設定する必要があります:

httpCtx.OutgoingResponse.Headers.Add(HttpResponseHeader.Server.ToString(), string.Empty);

これにより、応答からヘッダーが削除されます。

access-control-allow-headers →Content-Type, Authorization, Accept
access-control-allow-methods →GET, POST
access-control-allow-origin →*
content-type →application/json; charset=utf-8
date →Mon, 03 Jul 2017 07:22:17 GMT
status →200
于 2017-07-03T07:24:57.590 に答える