【问题标题】:Remove "Server" header from ASP.NET Core 2.1 application从 ASP.NET Core 2.1 应用程序中删除“服务器”标头
【发布时间】:2019-02-26 08:43:17
【问题描述】:

是否可以删除 ASP.NET Core 2.1 应用程序中的 Server 响应标头(在带有 IIS 10 的 Server 2016 上运行)?

我尝试将以下内容放入 web.config:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="X-Frame-Options" value="sameorigin" />
            <add name="X-XSS-Protection" value="1; mode=block" />
            <add name="X-Content-Type-Options" value="nosniff" />
            <remove name="X-Powered-By" />
            <remove name="Server" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

对 Response 的前四次更改运行良好,但 Server 标头没有被删除。我仍然看到“红隼”

【问题讨论】:

    标签: asp.net-core web-config asp.net-core-2.1 kestrel-http-server


    【解决方案1】:

    此解决方案适用于 IIS 10+ 版本,并允许删除服务器响应中的 x-powered-byserver 标头。

    在 IIS 10 中添加了一个新属性:removeServerHeader

    我们需要在asp.net核心应用程序中创建web.config文件,内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.webServer>
        <security>
          <requestFiltering removeServerHeader="true" />
        </security>
        <httpProtocol>
          <customHeaders>
            <remove name="X-Powered-By" />
          </customHeaders>
        </httpProtocol>
      </system.webServer>
    </configuration>
    

    然后在 IIS 上发布应用并重启站点。

    【讨论】:

    • 好收获。我花了几个小时试图删除 IIS 的服务器标头。我也会试试你的解决方案。
    • Visual Studio 抱怨 removeServerHeader 属性是不允许的。
    • @hvaughan3 我也注意到了 - Visual Studio 确实说“不允许使用 'removeServerHeader' 属性”,通过用不稳定的绿线突出显示它来强调它,但它确实按建议工作。谢谢@user3172616!
    • 我可以在我的代码中写一些东西,以便在发布时在 web.config 中自动生成它吗?
    • 这对我有用,我的 api 托管在 IIS 10 上,它删除了“Server”标头。
    【解决方案2】:

    Kestrel 服务器标头在请求管道中添加得太晚。因此无法通过 web.config 或中间件删除它。

    您可以通过在KestrelServerOptions 上将AddServerHeader property 设置为false 来移除Server 标头,这可以在Program.cs 中完成。

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseKestrel(options => options.AddServerHeader = false)
                .UseStartup<Startup>();
    

    【讨论】:

    • 这不会删除标题。 kestrel 对 IIS 做出响应,并且 iis 添加此标头。要删除此标头,您必须配置 web.config 文件
    • 你必须做所有的事情来删除这个标题。此设置停止设置,但红隼并不是唯一希望黑客知道您的服务器正在运行什么技术的地方。也覆盖网络配置(根据下一个答案),你是金子。
    【解决方案3】:

    对于 Dotnet Core 3.1,UseKestrelConfigureWebHostDefaults 的一部分,而不是早期版本中的 CreateDefaultBuilder

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                          .UseKestrel(options => options.AddServerHeader = false);
            });
    

    【讨论】:

    • 这行得通。值得一提的是,如果您使用此修复程序,您将无法在 Visual Studio 中使用 IISExpress 运行应用程序。你会得到这个错误:System.InvalidOperationException: 'Application is running inside IIS process but is not configured to use IIS server.'
    • 同样的事情发生在我身上。 UseKestrel 将无法在 IIS 服务器中运行您的应用程序
    • 有什么办法可以删除 Kestrel 添加的“Content-Length”标头?
    【解决方案4】:

    【讨论】:

    • 嗯,ConfigureKestrel(x =&gt; x.AddServerHeader = false) 对我没有影响。标题仍然存在
    • @user3172616 您是从 Visual Studio 还是从拥有自己的服务器的测试环境运行应用程序?
    • 应用程序正在远程生产服务器 IIS10(不是 Kestrel)上运行。无论如何,我找到了另一个解决方案并发布在此线程中。
    • @user3172616 请注意,Kestrel 的配置仅影响 kestrel 本身设置的 HTTP 响应标头。通常,当您运行 ASP.NET 核心应用程序时,您会使用位于应用程序前面的反向代理服务器。这意味着反向代理有机会添加 ITS 自己的响应标头。例如,如果您使用 IIS(甚至 IIS express),您会发现 IIS 添加的 Server 标头
    • @user3172616 在我上面提到的情况下,您必须配置放在 asp.net 核心应用程序前面的反向代理服务器,以便剥离它自己的服务器标头。扩展方法ConfigureKestrel(x =&gt; x.AddServerHeader = false)只影响Kestrel的头文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2019-09-29
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多