4

我有一个在 IIS 7.5 上运行的 Internet 公开 WCF 服务,我需要保护它。我想删除 HTTP 响应中的“服务器”标头。

我已经使用如下代码实现了 IDispatchMessageInspector。

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

但是,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 回答
1

由于您在 IIS 中托管您的服务并且已经启动了一个 HttpModule,因此请尝试设置 ASP.NET 兼容模式,以便您可以访问 HttpContext.Current。您将需要进行以下更改:

修改您的 web.config 并将以下内容添加到 System.ServiceModel

<system.serviceModel>
  ...
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

使用此属性装饰您的服务类:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

再给 HttpModule 一个机会,你应该有更好的运气。

于 2012-07-12T20:59:05.210 回答
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 回答