tomcat对URL合法字符的判断(RFC 7230 and RFC 3986 异常排查)
为什么80%的码农都做不了架构师?>>>
- 起因
有一个数据上报接口,之前在物理机上部署,数据上报正常。
最近将项目迁移到 docker 中,结果出现了异常如下:
Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:192)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:745)
- 问题原因
问题排查过程:略
原因:请求中出现了字符"{"(示例请求)
https://127.0.0.1:8080/metric?data=[{%22app
在不更改接口数据的前提下,解决方案为:在tomcat的cataline.properties追加配置
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
官方文档链接:http://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html#Other
tomcat.util.http.parser.HttpParser. requestTargetAllow
|
A string comprised of characters the server should allow even when they are not encoded. These characters would normally result in a 400 status. The acceptable characters for this property are: WARNING: Use of this option will expose the server to CVE-2016-6816. If not specified, the default value of |
- 问题来源
那么为什么之前接口不会出现异常呢?是tomcat版本不同导致的。
查看源码后发现:org.apache.tomcat.util.http.parser.HttpParser
tomcat 8.2.3 版本及 tomcat 7.0.82 ,都有如下代码,读取配置
String prop = System.getProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow");
if (prop != null) {for (int i = 0; i < prop.length(); i++) {char c = prop.charAt(i);if (c == '{' || c == '}' || c == '|') {REQUEST_TARGET_ALLOW[c] = true;} else {log.warn(sm.getString("httpparser.invalidRequestTargetCharacter",Character.valueOf(c)));}}
}
而tomcat 8.0.14 版本中并没有读取配置,对 |
{
}
的处理,而是默认为合法字符。
static {// Setup the flag arraysfor (int i = 0; i < 128; i++) {if (i < 32) {isToken[i] = false;} else if (i == '(' || i == ')' || i == '<' || i == '>' || i == '@' ||i == ',' || i == ';' || i == ':' || i == '\\' || i == '\"' ||i == '/' || i == '[' || i == ']' || i == '?' || i == '=' ||i == '{' || i == '}' || i == ' ' || i == '\t') {isToken[i] = false;} else {isToken[i] = true;}if (i >= '0' && i <= '9' || i >= 'A' && i <= 'F' ||i >= 'a' && i <= 'f') {isHex[i] = true;} else {isHex[i] = false;}}
}
虽然没有进行全面的比对,但可以看出在 8.0.x 左右的一些版本中,tomcat.util.http.parser.HttpParser. requestTargetAllow
这个配置是没有生效的,即 |
{
}
这3个符号认为是合法的。
- 结论:
tomcat.util.http.parser.HttpParser. requestTargetAllow
这个字段可以解决URL中存在|
{
}
字符的问题。- tomcat自tomcat 8.0.35版本之后对URL参数做了比较规范的限制,必须遵循RFC 7230 and RFC 3986规范,对于非保留字字符(json格式的请求参数)必须做转义操作。
转载于:https://my.oschina.net/pding/blog/1794176
tomcat对URL合法字符的判断(RFC 7230 and RFC 3986 异常排查)相关推荐
- java rfc3986_tomcat对URL合法字符的判断(RFC 7230 and RFC 3986 异常排查)
起因 有一个数据上报接口,之前在物理机上部署,数据上报正常. 最近将项目迁移到 docker 中,结果出现了异常如下: Note: further occurrences of HTTP header ...
- tomcat历史版本新特性_tomcat升级后报错RFC 7230 and RFC 3986
将皕杰报表demoserver中的演示项目report部署到tomcat8最新版本后,当访问报表的URL中含有中文时,访问报表报错如下: 十一月 11, 2019 2:38:58 下午 org.apa ...
- Tomcat 报 The valid characters are defined in RFC 7230 and RFC 3986
问题 24-Mar-2017 23:43:21.300 INFO [http-apr-8001-exec-77] org.apache.coyote.http11.AbstractHttp11Proc ...
- 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
使用Tomcat8部署项目时,有接口会报400错误,后端提示在请求目标中找到无效字符.有效字符在RFC 7230和RFC 3986中定义 原因 在日志显示的请求地址中包含非法字符,出现400错误 to ...
- java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别. ...
- Tomcat中出现“RFC 7230 and RFC 3986“错误的解决方法
Tomcat中出现"RFC 7230 and RFC 3986"错误的解决方法 参考文章: (1)Tomcat中出现"RFC 7230 and RFC 3986" ...
- Tomcat:The valid characters are defined in RFC 7230 and RFC 3986 问题处理
前段时间遇到这个问题: 包含json字符串类型的参数的http请求失败,返回状态码400,提示invalid character found in the request target. Tomcat ...
- The valid characters are defined in RFC 7230 and RFC 3986-Tomcat解决方案
问题: 发生场景: Tomcat 从 7.0.57 升级到 8.5.65 之后, 应用程序访问出现. 请求URL地址中包含了JSON格式的参数. 原因及解析: 请求地址包含了无效字符, 有效字符的定义 ...
- The valid characters are defined in RFC 7230 and RFC 3986问题
最近在ssm实践项目中遇到了The valid characters are defined in RFC 7230 and RFC 3986这个问题,折腾了两天时间终于搞定了,记录一下心得. 1.首 ...
最新文章
- php动画,(轻松学PHP-JS篇)jQuery学习-动画
- Red Hat Enterprise Linux Server release 6.3下ganglia监控系统的搭建
- Qt5.5.1移植到freescale imx6
- python进行数据分析,学习笔记 第8章(1)
- 如何将浮点型准确地转换成字符串
- java 多线程数量_java多线程之计算数量
- 【Mybatis】resultMap继承
- 光纤通道如何过渡到SAN
- Redis分布式锁—SETNX+Lua脚本实现篇
- java gps 距离计算_Java教程之地图中计算两个GPS坐标点的距离
- LeetCode--139. 单词拆分(动态规划)
- java代码实际_Java 8会给你的代码带来什么:一个实际的例子
- java coroutine类_Coroutines和Rxjava异步编程对比
- java字符串截取指定下标位置的字符串
- Ubuntu安装时,下载太慢怎么办
- reviewboard mysql_Ubuntu下ReviewBoard安装全过程_MySQL
- rust被禁播还能玩吗_被强制下架的5部剧,后2部因“尺度太大”被禁播,如今已恢复上架...
- 在html中对页面大小的设置吗,网页设计一般页面尺寸怎么设置呢?
- 股票的压力位和支撑位
- 屏幕尺寸、分辨率、视口笔记
热门文章
- shell命令获取按键值_linux shell获取键盘输入
- 计算机硬件系统的ppt,计算机硬件系统.ppt
- linux eclipse go插件,Eclipse的Go插件(goclipse)
- dbeaver导出表结构和数据_Oracle 导入导出表空间跟数据表通用操作笔记
- python matplotlib 饼图标签重叠_Python绘制饼图调节字体大小、防止标签重叠解决方法...
- ajax html例子,AJAX实例
- qt显示rgba8888 如何改 frame_Qt音视频开发2-vlc回调处理
- 机器视觉 · 工业镜头
- 【赠书】pandas创始人手把手教你利用Python进行数据分析
- openssl之EVP系列之1---算法封装