为什么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: |{ , and }

WARNING: Use of this option will expose the server to CVE-2016-6816.

If not specified, the default value of null will be used.

  • 问题来源

那么为什么之前接口不会出现异常呢?是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个符号认为是合法的。

  • 结论:
  1. tomcat.util.http.parser.HttpParser. requestTargetAllow 这个字段可以解决URL中存在 | { } 字符的问题。
  2. 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 异常排查)相关推荐

  1. java rfc3986_tomcat对URL合法字符的判断(RFC 7230 and RFC 3986 异常排查)

    起因 有一个数据上报接口,之前在物理机上部署,数据上报正常. 最近将项目迁移到 docker 中,结果出现了异常如下: Note: further occurrences of HTTP header ...

  2. tomcat历史版本新特性_tomcat升级后报错RFC 7230 and RFC 3986

    将皕杰报表demoserver中的演示项目report部署到tomcat8最新版本后,当访问报表的URL中含有中文时,访问报表报错如下: 十一月 11, 2019 2:38:58 下午 org.apa ...

  3. 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 ...

  4. 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义

    使用Tomcat8部署项目时,有接口会报400错误,后端提示在请求目标中找到无效字符.有效字符在RFC 7230和RFC 3986中定义 原因 在日志显示的请求地址中包含非法字符,出现400错误 to ...

  5. java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义

    org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别. ...

  6. Tomcat中出现“RFC 7230 and RFC 3986“错误的解决方法

    Tomcat中出现"RFC 7230 and RFC 3986"错误的解决方法 参考文章: (1)Tomcat中出现"RFC 7230 and RFC 3986" ...

  7. Tomcat:The valid characters are defined in RFC 7230 and RFC 3986 问题处理

    前段时间遇到这个问题: 包含json字符串类型的参数的http请求失败,返回状态码400,提示invalid character found in the request target. Tomcat ...

  8. The valid characters are defined in RFC 7230 and RFC 3986-Tomcat解决方案

    问题: 发生场景: Tomcat 从 7.0.57 升级到 8.5.65 之后, 应用程序访问出现. 请求URL地址中包含了JSON格式的参数. 原因及解析: 请求地址包含了无效字符, 有效字符的定义 ...

  9. The valid characters are defined in RFC 7230 and RFC 3986问题

    最近在ssm实践项目中遇到了The valid characters are defined in RFC 7230 and RFC 3986这个问题,折腾了两天时间终于搞定了,记录一下心得. 1.首 ...

最新文章

  1. php动画,(轻松学PHP-JS篇)jQuery学习-动画
  2. Red Hat Enterprise Linux Server release 6.3下ganglia监控系统的搭建
  3. Qt5.5.1移植到freescale imx6
  4. python进行数据分析,学习笔记 第8章(1)
  5. 如何将浮点型准确地转换成字符串
  6. java 多线程数量_java多线程之计算数量
  7. 【Mybatis】resultMap继承
  8. 光纤通道如何过渡到SAN
  9. Redis分布式锁—SETNX+Lua脚本实现篇
  10. java gps 距离计算_Java教程之地图中计算两个GPS坐标点的距离
  11. LeetCode--139. 单词拆分(动态规划)
  12. java代码实际_Java 8会给你的代码带来什么:一个实际的例子
  13. java coroutine类_Coroutines和Rxjava异步编程对比
  14. java字符串截取指定下标位置的字符串
  15. Ubuntu安装时,下载太慢怎么办
  16. reviewboard mysql_Ubuntu下ReviewBoard安装全过程_MySQL
  17. rust被禁播还能玩吗_被强制下架的5部剧,后2部因“尺度太大”被禁播,如今已恢复上架...
  18. 在html中对页面大小的设置吗,网页设计一般页面尺寸怎么设置呢?
  19. 股票的压力位和支撑位
  20. 屏幕尺寸、分辨率、视口笔记

热门文章

  1. shell命令获取按键值_linux shell获取键盘输入
  2. 计算机硬件系统的ppt,计算机硬件系统.ppt
  3. linux eclipse go插件,Eclipse的Go插件(goclipse)
  4. dbeaver导出表结构和数据_Oracle 导入导出表空间跟数据表通用操作笔记
  5. python matplotlib 饼图标签重叠_Python绘制饼图调节字体大小、防止标签重叠解决方法...
  6. ajax html例子,AJAX实例
  7. qt显示rgba8888 如何改 frame_Qt音视频开发2-vlc回调处理
  8. 机器视觉 · 工业镜头
  9. 【赠书】pandas创始人手把手教你利用Python进行数据分析
  10. openssl之EVP系列之1---算法封装