【问题标题】:Remove the HTTP Server header in Jetty 9删除 Jetty 9 中的 HTTP Server 标头
【发布时间】:2017-11-03 15:24:35
【问题描述】:

这是在 Jetty 8 中隐藏服务器版本的方式:

Server server = new Server(port);
server.setSendServerVersion(false);

您如何在 Jetty 9 中做到这一点?那么现在它应该看起来像这样?

HttpConfiguration config = new HttpConfiguration();
config.setSendServerVersion(false);
//TODO: Associate config with server???
Server server = new Server(port);

【问题讨论】:

  • 我知道禁用发送服务器版本并不理想,但我有一个特定的场景,我暂时无法避免。
  • 为什么发送服务器版本不理想?我的意思是任何客户都不应该使用它,它可能会产生安全隐患。在我看来,它应该默认禁用还是我遗漏了什么?
  • 服务器标头肯定是用的,它可能会影响你的搜索排名,也用于创建技术/浏览器流行度图表,这些图表经常被某些类型的人用来做技术决策。
  • 哦,我明白了,出于统计目的,是的,这是有道理的。但是,为什么它会影响搜索排名?
  • 我知道发送服务器版本没什么意义,但隐藏它似乎也没什么意义。我看到的唯一论点是“为了安全”,但攻击者不会像对待任何其他攻击一样尝试所有已知的漏洞利用吗?

标签: java jetty


【解决方案1】:

在 Jetty 9 中,需要在 HttpConfiguration 上进行配置:

HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSendServerVersion( false );
HttpConnectionFactory httpFactory = new HttpConnectionFactory( httpConfig );
ServerConnector httpConnector = new ServerConnector( server,httpFactory );
server.setConnectors( new Connector[] { httpConnector } );

【讨论】:

  • 你应该添加最后一步:server.setConnectors(new Connector[] {httpConnector});
  • 为新连接器设置端口的重要一点是:httpConnector.setPort(port);。由于正在替换默认连接器,因此未使用传递给 Server 构造函数的端口。
【解决方案2】:

如果制定了一些似乎有效的代码。不确定它是否正确,但至少它有效(:

Server server = new Server(port);
for(Connector y : server.getConnectors()) {
    for(ConnectionFactory x  : y.getConnectionFactories()) {
        if(x instanceof HttpConnectionFactory) {
            ((HttpConnectionFactory)x).getHttpConfiguration().setSendServerVersion(false);
        }
    }
}

【讨论】:

  • 这仅在server.start() 之前有效,因为配置会在启动期间传播到许多其他组件。此时对连接器的更改不再产生影响。
【解决方案3】:

如果您使用 jetty9 作为独立服务器,您可以通过在文件 start.ini 中设置 jetty.httpConfig.sendServerVersion=false 来禁用服务器签名。

【讨论】:

    【解决方案4】:

    Jacob 解决方案的 Lambda 样式变体(对我有用):

    final Server server = new Server(port);
    Stream.of(server.getConnectors()).flatMap(connector -> connector.getConnectionFactories().stream())
                .filter(connFactory -> connFactory instanceof HttpConnectionFactory)
                .forEach(httpConnFactory -> ((HttpConnectionFactory)httpConnFactory).getHttpConfiguration().setSendServerVersion(false));
    

    【讨论】:

    • 另外注意,只有在server.start()之前使用才有效。
    【解决方案5】:

    现在有一个带有该设置的 HttpConfiguration 对象。

    org.eclipse.jetty.server.HttpConfiguration

    查看 jetty.xml 中有关 http 配置部分的部分,该部分显示如何设置对象,然后查看 jetty-http.xml 文件,该文件显示如何使用该配置。请记住,jetty xml 文件实际上只是 java 的一个薄皮,工作原理基本相同。

    http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-server/src/main/config/etc/jetty.xml

    http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-server/src/main/config/etc/jetty-http.xml

    【讨论】:

    • 我已经看到了,但问题是我没有使用码头 xml 文件,我正在启动嵌入式码头。
    • 同理,只是翻译成相关的java调用
    • 我已经查看了 javadoc 并用谷歌搜索了它...HttpConfiguration 类没有关于如何使用它的文档。
    • jetty.xml 只不过是 java 本身的 xml 薄薄的一层,它在 java 中的工作方式与它在 xml 中的工作方式完全相同......我们将不得不向嵌入式添加一个示例我猜的示例项目
    【解决方案6】:

    某些安全分析软件会将在响应标头中发送服务器版本标记为问题。

    OP 正在寻找嵌入式解决方案,但如果您的 Jetty 部署使用 server.ini 文件,您可以简单地设置 jetty.send.server.version=false

    【讨论】:

      【解决方案7】:

      jetty9.2,将此配置更改为falsestart.ini

      # should jetty send the server version header?
      jetty.send.server.version=true
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-28
        • 2011-05-26
        • 2018-04-24
        • 1970-01-01
        • 2014-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多