You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring处理HTTP请求头解析错误:方法名含非法字符

问题描述

用Spring框架开发的网站本地运行一切正常,但部署到公网服务器后偶尔出现奇怪的错误日志,推测是有人尝试攻击网站。错误日志如下:

2022-11-17 13:44:28.935  INFO 17736 --- [nio-9000-exec-3] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x010x000xee0x010x000x000xea0x030x030xfa!"0xbe,0x14`0x860xc00x0e0xd2k0xed0x840x100xb6;0xc84?zh0x1by0xc6y0x7fiz(0xa2= ]. HTTP method names must be tokens
        at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:419) ~[tomcat-embed-core-9.0.65.jar!/:na]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:271) ~[tomcat-embed-core-9.0.65.jar!/:na]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.65.jar!/:na]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890) ~[tomcat-embed-core-9.0.65.jar!/:na]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) ~[tomcat-embed-core-9.0.65.jar!/:na]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.65.jar!/:na]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.65.jar!/:na]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.65.jar!/:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.65.jar!/:na]
        at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

本地仅个人访问时无此问题,攻击未成功,但错误日志十分恼人,求解决办法。

解决方案

这类错误源于请求不符合HTTP规范,基本是扫描工具或恶意请求导致的,可通过以下方式处理:

  • 调低Tomcat日志级别:
    日志已提示后续解析错误会以DEBUG级别记录,在Spring Boot配置文件(application.properties/application.yml)中添加:

    logging.level.org.apache.coyote.http11=DEBUG
    

    这样INFO级别的错误日志不再频繁输出,仅保留DEBUG级记录,减少干扰。

  • 配置Tomcat拦截非法请求:
    自定义Tomcat配置,直接拒绝非法请求,避免生成错误日志。创建配置类:

    import org.apache.coyote.http11.Http11NioProtocol;
    import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
    import org.springframework.boot.web.server.WebServerFactoryCustomizer;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class TomcatConfig {
        @Bean
        public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
            return factory -> factory.addConnectorCustomizers(connector -> {
                Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
                // 开启非法请求拒绝
                protocol.setRejectIllegalHeader(true);
                // 限制允许的HTTP方法
                protocol.setAllowedMethods("GET,POST,PUT,DELETE,OPTIONS");
            });
        }
    }
    
  • 反向代理层拦截:
    若前端有Nginx等反向代理,在代理层提前过滤非法请求。示例Nginx配置:

    server {
        # 其他配置
        if ($request_method !~ ^(GET|POST|PUT|DELETE|OPTIONS)$ ) {
            return 405;
        }
        # 过滤请求行中的非法字符
        if ($request_uri ~* "[^a-zA-Z0-9/\?&=\-_.]") {
            return 400;
        }
    }
    

    从入口拦截恶意请求,避免Tomcat处理此类请求。

  • 日志框架过滤特定日志:
    用Logback等日志框架忽略该类错误日志,在logback-spring.xml中添加:

    <logger name="org.apache.coyote.http11.Http11Processor" level="DEBUG" additivity="false">
        <appender-ref ref="YOUR_APPENDER_NAME"/>
    </logger>
    

    或直接将该类日志级别设为DEBUG,减少INFO级别的干扰。

内容的提问来源于stack exchange,提问作者RobinP2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:46:02