专栏首页Java技术栈Java程序员注意:Tomcat Get请求的巨坑!

Java程序员注意:Tomcat Get请求的巨坑!

Tomcat8.5,当Get请求中包含了未经编码的中文字符时,会报以下错误,请求未到应用程序在Tomcat层就被拦截了。

Tomcat报错:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

返回400错误:

Transfer-Encoding--->[chunked] null--->[HTTP/1.1 400 Bad Request] Server--->[Apache-Coyote/1.1] C onnection--->[close] Date--->[Wed, 07 Feb 2018 03:19:04 GMT]

根据错误找到了Tomcat最新的源码:

org/apache/coyote/http11/LocalStrings.properties

iib.invalidRequestTarget=Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

org/apache/coyote/http11/Http11InputBuffer.java

boolean parseRequestLine(boolean keptAlive) throws IOException {

...

    } else if (HttpParser.isNotRequestTarget(chr)) {
        throw new IllegalArgumentException(sm.getString("iib.invalidRequestTarget"));
    }

...

}

java/org/apache/tomcat/util/http/parser/HttpParser.java

public static boolean isNotRequestTarget(int c) {
    // Fast for valid request target characters, slower for some incorrect
    // ones
    try {
        return IS_NOT_REQUEST_TARGET[c];
    } catch (ArrayIndexOutOfBoundsException ex) {
        return true;
    }
}

查源码发现在Tomcat7.0.73就已经添加了RFC 3986这个规范。

RFC 3986文档对Url的编解码问题做出了详细的建议,指出了哪些字符需要被编码才不会引起Url语义的转变,以及对为什么这些字符需要编码做出了相应的解释。

RFC 3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(! * ' ( ) ; : @ & = + $ , / ? # [ ])。

还有一些字符当直接放在Url中的时候,可能会引起解析程序的歧义,这些字符被视为不安全字符。

  • 空格:Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉。
  • 引号以及<>:引号和尖括号通常用于在普通文本中起到分隔Url的作用
  • #:通常用于表示书签或者锚点
  • %:百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
  • {}|\^[]`~:某一些网关或者传输代理会篡改这些字符

对于此问题,有以下几种解决方案。

1、切换版本到7.0.73以下,这个不实际。

2、修改Tomcat源码,这个也不实际。

3、前端请求对URL编码。

4、修改Get方法为Post方法。

5、因{}是不安全字符,默认被 tomcat拦截。如果需要在URL中传输json数据,在catalina.properties中添加支持。

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

总结

如果Get请求在合作方,而合作方不愿意修改代码,那1、2种方法可以尝试。如果Get请求在自己,可以尝试3、4种方法。仅需要在URL上传输json数据,使用第5种方法即可。

本文分享自微信公众号 - Java技术栈(javastack),作者:爱你们的

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 最新 Java 后端系列干货,都在这了!

    以下是Java技术栈微信公众号发布的所有关于 Java Web 技术干货,会从以下几个方面汇总,本文会长期更新。

    Java技术栈
  • java开发者linux入门

    在入门linux的时候感觉大部分很糟糕的,尤其是java开发者来说,对于非运维人员可能刚开始会对linux有很大的抵触性,可能还是更多喜欢桌面操作。或者在之前...

    bigsai
  • 记一次对某企业的渗透测试实战

    顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscr...

    小老鼠
  • javaWeb项目(SSH框架+AJAX+百度地图API+Oracle数据库+MyEclipse+Tomcat)之一 基础Struts框架搭建篇

    即将开始着手写这个项目,所以希望通过这篇博客来记录自己学习的过程 今天开学第一天,就上了软件工程实践课,自己也开始着手做这个大作业了。首先我的项目名称叫做智能班...

    ShenduCC
  • windoes服务器搭建Jenkins和部署war项目

    背景介绍:由于工作原因,小编申请新的服务器环境需要搭建Jenkin环境部署项目,新的服务器上项目部署用的环境和依赖基本上为零,小编没有求助运维的帮助,想尝试一下...

    沁溪源
  • 东南亚的招聘骗局,程序员请注意!

    总有些我认为是常识的事情,在别人看来都是第一次接触。很多骗局都是如此,圈内人不上当,圈外人不警惕。毕竟骗子吃的就是信息不对称的生意。关于东南亚的招聘骗局,便是如...

    良月柒
  • 东南亚的招聘骗局,程序员请注意!

    总有些我认为是常识的事情,在别人看来都是第一次接触。很多骗局都是如此,圈内人不上当,圈外人不警惕。毕竟骗子吃的就是信息不对称的生意。关于东南亚的招聘骗局,便是如...

    良月柒
  • 01 . Tomcat简介及多实例部署

    这里的nginx即做静态页面的响应又完成反向代理的功能 client Nginx代理 tomcat tomcat

    常见_youmen
  • Fdog系列(二):html写完注册页面之后怎么办,用java写后台响应呀。

    目录 Fdog系列(一):思来想去,不如写一个聊天软件,那就从仿QQ注册页面开始吧。

    花狗Fdog
  • 如何在Ubuntu 16.04上安装Apache Tomcat 8

    Apache Tomcat是一个Web服务器和servlet容器,用于为Java应用程序提供服务。Tomcat是Apache Software Foundati...

    穿鞋跑得快
  • 如何部署 Tomcat 站点

    Tomcat 是 Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由 Apache、Su...

    Mr.Crypto
  • web服务器与HTTP协议

    Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源。 l Internet上供外界访问的Web资源分为:...

    Java帮帮
  • jsp课程笔记(一)

    2.在Eclipse中创建的Web项目:浏览器可以直接访问 WebContent中的文件,

    兮动人
  • SpringMVC知识点梳理—够你面试掰活的(超详细)

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进...

    本人秃顶程序员
  • Servlet必须掌握的知识(最全 精美版)

    (3) 启动tomcat,在浏览器输入http://localhost:8080/工程名/访问服务器的路径

    CaesarChang张旭
  • SpringMVC常见面试题总结(超详细回答)

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进...

    程序员小强
  • 超详细的Fastjson<=1.2.47反序列化漏洞复现

    fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON...

    Timeline Sec
  • 云上构建高可用实例——应用负载均衡

      作为云行业的新人,把在云上构建系统的一点一滴记录下来,有坑填坑,没坑挖坑再填平,同时也希望能给看到此文章的人提供一定的实操及经验指南。  下文中所有云中操作...

    王录华
  • 芋道 Spring Boot SpringMVC 入门

    如果胖友接触 Java Web 开发比较早,那么可能会了解到如下 Web MVC 框架,当年是 Struts2 与 SpringMVC 双雄争霸的年代。甚至说,...

    芋道源码

扫码关注云+社区

领取腾讯云代金券