在Jetty 9中删除HTTP服务器头信息

25

这是如何在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);

我知道禁用发送服务器版本并不理想,但我有一个特定的场景,目前无法避免它。 - Jay
3
为什么“发送服务器版本信息不理想”?我的意思是任何客户端都不应该以任何方式使用它,并且它可能具有安全隐患。在我看来,它应该默认禁用,或者我缺少什么信息吗? - Tim Büthe
1
服务器头部信息绝对是必须使用的,它可能会影响您的搜索排名,并且还用于创建技术/浏览器流行度图表,这些图表经常被某些类型的人用来做技术决策。 - Jay
3
明白了,出于统计目的考虑,这很有道理。但是,为什么会影响搜索排名呢? - Tim Büthe
@Trejkaz 如果你只是把所有东西都扔到服务器上,希望有些东西能起作用(虽然这是一个有效的计划),但你触发安全套件的风险比尝试基于已知服务器版本的较小子集的漏洞要大。 - Zalán Meggyesi
显示剩余3条评论
7个回答

37

在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 } );

6
你应该添加最后一步:server.setConnectors(new Connector[] {httpConnector}); - Costi Ciudatu
3
设置新连接器端口的重要部分是这个:httpConnector.setPort(port);。由于默认连接器被替换,传递给Server构造函数的端口不会被使用。 - Ben

30

我编写了一些代码,似乎可以正常工作。不确定它是否正确,但至少它可以工作(:

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

1
这仅在 server.start() 之前起作用,因为在启动期间配置会传播到许多其他组件。此时对连接器的更改不再产生影响。 - Joakim Erdfelt

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

3

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));

1
请注意,只有在 server.start() 之前使用才有效。 - Joakim Erdfelt

2
现在有一个具有该设置的 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


2
我看到了这个,但问题是我没有使用Jetty的XML文件,而是嵌入式启动Jetty。 - Jay
把下面这个东西翻译成相应的Java调用就行了。 - jesse mcconnell
2
我已经查看了Javadoc并进行了谷歌搜索... HttpConfiguration类没有关于如何使用它的文档。 - Jay
2
jetty.xml 只是覆盖在 Java 上的一层薄薄的 XML,它在 Java 中的工作方式与 XML 中的完全相同......我想我们将不得不向嵌入式示例项目添加一个示例。 - jesse mcconnell

1
一些安全分析软件会将在响应头中发送服务器版本标记为问题。如果您的Jetty部署使用server.ini文件,则可以简单地设置jetty.send.server.version=false来解决嵌入式的问题。

0
jetty9.2 中,将 start.ini 中的此配置更改为 false
# should jetty send the server version header?
jetty.send.server.version=true

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接