设为首页 收藏本站
查看: 1217|回复: 0

[经验分享] 【Tomcat】Invalid character found in the request target

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-12-26 07:35:27 | 显示全部楼层 |阅读模式
  Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
  Tomcat的coyote-connector解析到请求中包含了不合法的字符,比如  { }  ( )  ^ ` \  | #  \\
  这是典型的400错误,不合法的请求,根据RFC (Request Format Comment)文档的规定,以上字符不能被用在Request Header,也就是request的URI中。
  我遇到这个问题是两个tomcat应用之间通讯时发送了一个请求,这个请求包含片段.*\.(css|js|jpg|jpeg|png|gif|ico|woff)$,
  很显然,这个请求中包含 \ ( | 这三个不合法的字符;转义是不能解决问题的;因为tomcat会对请求中每个字符都进行检查;
  我的解决办法就是 .*\.(css|js|jpg|jpeg|png|gif|ico|woff)$ 换成 .*tpl$,.*css$,.*js$,.*jpg$,.*jpeg$,.*bmp$,.*png$,.*gif$,.*ico$,.*woff$
  查看tomcat源码
  apache-tomcat-7.0.73-src\java\org\apache\coyote\http11\InternalInputBuffer.java
  

public>  ....省略/**  * Read the request line. This function is meant to be used during the
  * HTTP request header parsing. Do NOT attempt to read the request body
  * using it.
  *
  *
@throws IOException If an exception occurs during the underlying socket  * read operations, or if the given buffer is not big enough to accommodate
  * the whole line.
*/  @Override
public boolean parseRequestLine(boolean useAvailableDataOnly)throws IOException {  ...省略
//  // Reading the URI
  //
  boolean eol = false;
  while (!space) {
  // Read new bytes if needed
  if (pos >= lastValid) {
  if (!fill())
  throw new EOFException(sm.getString("iib.eof.error"));
  }
  // Spec says single SP but it also says be tolerant of HT
  if (buf[pos] == Constants.SP || buf[pos] == Constants.HT) {
  space = true;
  end = pos;
  }else if (HttpParser.isNotRequestTarget(buf[pos])) {  
  //如果请求参数中的字符不是被允许的字符,则抛异常  HttpParser这个类 看下面代码片
  throw new IllegalArgumentException(sm.getString("iib.invalidRequestTarget"));
  }
  pos++;
  }
  ... 省略
  return true;
  }
  
}
  

  apache-tomcat-7.0.73-src\java\org\apache\tomcat\util\http\parser\HttpParser.java
  

private static final int ARRAY_SIZE = 128;  private static final boolean[] IS_NOT_REQUEST_TARGET = new boolean[ARRAY_SIZE];
  static {
  // Digest field types.for (int i = 0; i < ARRAY_SIZE; i++) {
  // Control> 0-31, 127
  if (i < 32 || i == 127) {
  IS_CONTROL = true;
  }// Not valid for request target.
  // Combination of multiple rules from RFC7230 and RFC 3986. Must be
  // ASCII, no controls plus a few additional characters excluded
  
       // 不合法的字符在这里都会导致请求不合法而抛异常 请求失败
  if (IS_CONTROL || i > 127 ||
  i == ' ' || i == '\"' || i == '#' || i == '<' || i == '>' || i == '\\' ||
  i == '^' || i == '`'  || i == '{' || i == '|' || i == '}') {
  IS_NOT_REQUEST_TARGET = true;
  }
  }
  }
  

  HTTP协议只是一个OSI应用层通讯的标准,在tomcat源码中对HTTP进行了实现,可能在一些Tomcat版本中没有实现对请求字符的限制,可以预见,在Tomcat7.0.64之后的版本以及 Tomcat8、9都会对请求头的字符进行限制。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-428101-1-1.html 上篇帖子: Tomcat内部结构及工作原理学习 下篇帖子: linux下tomcat 重启和查看日志
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表