【问题标题】:Sparkjava Error: org.eclipse.jetty.http.HttpParser - Header is too large >8192Sparkjava 错误:org.eclipse.jetty.http.HttpParser - 标头太大 >8192
【发布时间】:2020-01-10 04:03:16
【问题描述】:

我们正在开发一个基于sparkjava框架的内部web组件,为了方便,使用的是HTTP GET而不是POST。

请求URL包含大数据(大于8K)时返回错误如下: org.eclipse.jetty.http.HttpParser - Header is too large >8192.

如何解决?

【问题讨论】:

    标签: jetty spark-java


    【解决方案1】:

    Sparkjava 在嵌入式 Jetty 服务器上运行,但大多数 Jetty 配置在 sparkjava 框架中默认是硬编码的。

    一种解决方案是自定义 EmbeddedServerFactory:

        static Server server = null;
    
        private static void startup() {
            EmbeddedServers.add(EmbeddedServers.Identifiers.JETTY, createEmbeddedServerFactory());
    
            awaitInitialization();
    
            Stream.of(server.getConnectors()).map(Connector::getConnectionFactories).flatMap(Collection::stream)
                            .filter(t -> t.getClass().isAssignableFrom(HttpConnectionFactory.class))
                            .map(t -> ((HttpConnectionFactory) t).getHttpConfiguration()).forEach(t -> {
                                t.setRequestHeaderSize(512 * 1024 * 1024);
                                t.setSendServerVersion(false);
                                t.setSendDateHeader(false);
                            });
        }
    
        private static EmbeddedServerFactory createEmbeddedServerFactory() {
            return new EmbeddedJettyFactory(new JettyServerFactory() {
                @Override
                public Server create(int maxThreads, int minThreads, int threadTimeoutMillis) {
                    return create(maxThreads <= 0 ? null
                                    : new QueuedThreadPool(maxThreads, minThreads, threadTimeoutMillis));
                }
    
                @Override
                public Server create(ThreadPool threadPool) {
                    return server = new Server(threadPool);
                }
    
            });
        }
    

    【讨论】:

    • 这是一个过大的标头大小配置,您现在会遇到与默认限制可防止的标头冲突相关的各种旧 CVE。用户发出 1 个请求是微不足道的,导致 100% CPU 直到使用该配置的连接空闲超时。 - 见ocert.org/advisories/ocert-2011-003.html
    • 如果您过度使用 URI 查询,请考虑改用 POST 正文形式。如果您使用较大的标头(大小超过 4k),例如 Cookie,那么请知道您的应用程序只能与自定义客户端一起使用。大多数浏览器和许多代理都不支持过多的请求。
    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多