版本: jetty-9.4.38.v20210224,日志Slf4jLog,SpringBoot2.4.4,Spring5.3.5。
在我们的代码中执行了一个pentest,在使用cUrl发送了格式错误的报头之后,我们可以获得以下响应,揭示了Stacktrace并暴露了它使用的是Jetty:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 400 Bad header value for X-Forwarded-Port</title>
</head>
<body><h2>HTTP ERROR 400 Bad header value for X-Forwarded-Port</h2>
<table>
<tr><th>URI:</th><td>/</td></tr>
<tr><th>STATUS:</th><td>400</td></tr>
<tr><th>MESSAGE:</th><td>Bad header value for X-Forwarded-Port</td></tr>
<tr><th>SERVLET:</th><td>-</td></tr>
<tr><th>CAUSED BY:</th><td>org.eclipse.jetty.http.BadMessageException: 400: Bad header value for X-Forwarded-Port</td></tr>
<tr><th>CAUSED BY:</th><td>java.lang.NumberFormatException: For input string: "zwrtxqvas9lm4kzkw0"</td></tr>
</table>
<h3>Caused by:</h3><pre>org.eclipse.jetty.http.BadMessageException: 400: Bad header value for X-Forwarded-Port
at org.eclipse.jetty.server.ForwardedRequestCustomizer.onError(ForwardedRequestCustomizer.java:550)
at org.eclipse.jetty.server.ForwardedRequestCustomizer.customize(ForwardedRequestCustomizer.java:478)
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:384)
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:633)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:380)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:279)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:383)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:882)
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1036)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NumberFormatException: For input string: "zwrtxqvas9lm4kzkw0"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at org.eclipse.jetty.util.HostPort.parsePort(HostPort.java:171)
at org.eclipse.jetty.server.ForwardedRequestCustomizer$Forwarded.handleForwardedPort(ForwardedRequestCustomizer.java:856)
at org.eclipse.jetty.server.ForwardedRequestCustomizer.customize(ForwardedRequestCustomizer.java:473)
... 15 more
</pre>
</body>
</html>以前,为了不暴露Jetty版本,我禁用了SendServerVersion,但无法确定禁用堆栈跟踪的任何配置。
@Configuration
public class JettyConfiguration implements WebServerFactoryCustomizer<JettyServletWebServerFactory> {
@Override
public void customize(JettyServletWebServerFactory factory) {
factory.addServerCustomizers(server -> {
/* StatisticsHandler needed for graceful shutdown */
StatisticsHandler statisticsHandler = new StatisticsHandler();
statisticsHandler.setHandler(server.getHandler());
server.setHandler(statisticsHandler);
/* Autoforwarded Configuration */
for (Connector connector : server.getConnectors()) {
ConnectionFactory connectionFactory = connector.getDefaultConnectionFactory();
if (connectionFactory instanceof HttpConnectionFactory) {
HttpConnectionFactory defaultConnectionFactory = (HttpConnectionFactory) connectionFactory;
HttpConfiguration httpConfiguration = defaultConnectionFactory.getHttpConfiguration();
httpConfiguration.setSendServerVersion(false);
httpConfiguration.addCustomizer(new ForwardedRequestCustomizer());
}
}
});
}
}禁用堆栈跟踪的最佳方法是什么?提亚
发布于 2021-04-07 05:00:02
Jetty作为大多数web服务器都会提供一个默认的异常处理程序。如果您不喜欢默认异常处理程序,请注册您的异常处理程序。
只需提供RunntimeException的ExceptionHandler和一般错误即可。例如后端失败,请稍后重试,状态为500。
有很多关于如何在spring中实现异常处理程序的文章。我加了一个只是为了参考。
发布于 2021-04-12 22:37:12
首先尝试通过使用@ControllerAdvice实现一个GlobalExceptionHandler来解决这个问题,不幸的是,这似乎没有被触发,我相信这与它意味着由MVC抛出异常的事实有关。
笔式测试器制作的请求使用了格式错误的头部,所以错误是由ErrorHandler抛出的,我最终创建了自己的ErrorHandler并覆盖了handle方法。
这看起来很管用,但可能太严格了,我担心这会使以后的调试变得困难。有什么建议或改进吗?谢谢
import org.eclipse.jetty.server.*;
import org.eclipse.jetty.server.handler.ErrorHandler;
import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer;
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Configuration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Configuration
public class JettyConfiguration implements WebServerFactoryCustomizer<JettyServletWebServerFactory> {
@Override
public void customize(JettyServletWebServerFactory factory) {
JettyServerCustomizer customizer = server -> {
MyErrorHandler myErrorHandler = new MyErrorHandler();
myErrorHandler.setShowStacks(false);
myErrorHandler.setShowMessageInTitle(false);
myErrorHandler.setShowServlet(false);
server.setErrorHandler(myErrorHandler);
};
factory.addServerCustomizers(customizer);
factory.addServerCustomizers(server -> {
/* Autoforwarded Configuration */
for (Connector connector : server.getConnectors()) {
ConnectionFactory connectionFactory = connector.getDefaultConnectionFactory();
if (connectionFactory instanceof HttpConnectionFactory) {
HttpConnectionFactory defaultConnectionFactory = (HttpConnectionFactory) connectionFactory;
HttpConfiguration httpConfiguration = defaultConnectionFactory.getHttpConfiguration();
httpConfiguration.setSendServerVersion(false);
httpConfiguration.addCustomizer(new ForwardedRequestCustomizer());
}
}
});
}
static class MyErrorHandler extends ErrorHandler {
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
//doError(target, baseRequest, request, response);
}
}
}https://stackoverflow.com/questions/66974799
复制相似问题