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
相关产品推荐
相关产品推荐

