The valid characters are defined in RFC 7230 and RFC 3986
发布日期:2021-06-30 17:38:27 浏览次数:2 分类:技术文章

本文共 4303 字,大约阅读时间需要 14 分钟。

 

问题分析:

问题出现的原因是URL中包含了非法字符,这个问题可能是由于升级tomcat版本导致

解决方案:

1、降级Tomcat版本

tomcat7及以下可以。

2、规范代码,URL编码

encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|")> http://localhost:8080/app/handleResponse?msg=name%7Cid%7C关键代码encodeURIComponent("msg=name|id|")

3、Tomat增加配置

这些设置不好使。。。

#这个是解决URL中包含%2F的问题 org.apache.tomcat.util.buf.UDecoder.ALLOW_ENC_ENCODED_SLASH=true  #这个是解决URL中包含%5C的问题 org.apache.catalina.connector.CoyoteAdapter.ALLOW_BAC_BACKSLASH=true #=号后面加可以过滤的字符tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

需要注意的是修改了配置参数会触发XSS漏洞

最后在这里找到答案

down voteWe found the same issue . After analyzing the issue , found the solution . Below are the details for issue and solution.Issue: Tomcat (7.0.88) is throwing below exception which leads to 400 – Bad Request. java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986. This issue is occurring most of the tomcat versions from 7.0.88 onwards.Solution: (Suggested by Apache team):Tomcat increased their security and no longer allows raw square brackets in the query string. In the request we have [,] (Square brackets) so hotel request is not processing by server.As a solution below are the steps needs to be incorporate to make it work as expected. 1. We need to add relaxedQueryChars attribute under tag under server.xml (%TOMCAT_HOME%/conf)          
If application needs more special characters which is not supported by tomcat by default then we need add those special characters in relaxedQueryChars attribute with comma separated as above.
relaxedQueryChars="[,]"

这个是关键的配置,"[,]"表示过滤“[”和"]",如果还有别的符号需要过滤,逗号隔开即可,tomcat8.0.53测试通过。

RFC 3986 文档规定,Url中只允许包含

英文字母(a-z,A-Z)、数字(0-9)、- _ . ~ 4个特殊字符保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ]

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

典型的有:

 

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

转义

如果要在url里使用不安全字符,就需要使用转义。
附上ASCII字符与URL编码的对照表,如下:
 

ASCII字符   URL编码  空格     %20  !     %21  "    %22  #   %23  $    %24  %   %25  &    %26  '     %27  (    %28  )    %29  *    %2A  +   %2B  ,     %2C  -     %2D  .     %2E  /    %2F  0    %30  1    %31  2    %32  3    %33  4    %34  5    %35  6    %36  7    %37  8    %38  9    %39  :     %3A  ;     %3B  <   %3C =   %3D >   %3E  ?    %3F  @   %40  A    %41  B    %42  C    %43  D    %44  E    %45  F    %46  G    %47  H    %48  I    %49  J    %4A  K    %4B  L    %4C  M   %4D  N    %4E  O   %4F  P    %50  Q   %51  R    %52  S    %53  T    %54  U    %55  V    %56  W   %57  X    %58  Y    %59  Z    %5A  [    %5B  \    %5C  ]    %5D  ^   %5E  _    %5F  `    %60  a    %61  b    %62  c    %63  d    %64  e    %65  f     %66  g    %67  h    %68  i     %69  j     %6A  k    %6B  l     %6C  m   %6D  n    %6E  o    %6F  p    %70  q    %71  r     %72  s    %73  t     %74  u    %75  v    %76  w   %77  x    %78  y    %79  z    %7A  {    %7B  |    %7C  }    %7D  ~   %7E  %7F  €    %80  %81  ‚    %82  ƒ    %83  „    %84  …   %85  †    %86  ‡    %87  ˆ    %88  ‰  %89  Š    %8A  ‹     %8B  Œ   %8C  %8D  Ž    %8E  %8F  %90  ‘   %91  ’   %92  “   %93  ”   %94  •    %95  –    %96  —  %97  ˜    %98  ™   %99  š    %9A  ›     %9B  œ   %9C  %9D  ž    %9E  Ÿ    %9F  %A0  ¡     %A1  ¢    %A2  £    %A3  %A4  ¥    %A5  |    %A6  §    %A7  ¨    %A8  ©   %A9  ª    %AA  «    %AB  ¬   %AC  ¯    %AD  ®   %AE  ¯    %AF  °    %B0  ±   %B1  ²    %B2  ³    %B3  ´     %B4  µ    %B5  ¶    %B6  ·     %B7  ¸     %B8  ¹    %B9  º    %BA  »    %BB  ¼   %BC  ½   %BD  ¾   %BE  ¿    %BF  À    %C0  Á    %C1      %C2  à    %C3  Ä    %C4  Å    %C5  Æ   %C6  Ç    %C7  È    %C8  É    %C9  Ê    %CA  Ë    %CB  Ì    %CC  Í    %CD  Î    %CE  Ï    %CF  Ð   %D0  Ñ    %D1  Ò   %D2  Ó   %D3  Ô   %D4  Õ   %D5  Ö   %D6  %D7  Ø   %D8  Ù    %D9  Ú    %DA  Û    %DB  Ü    %DC  Ý    %DD  Þ    %DE  ß    %DF  à    %E0  á    %E1  â    %E2  ã    %E3  ä    %E4  å    %E5  æ   %E6  ç    %E7  è    %E8  é    %E9  ê    %EA  ë    %EB  ì     %EC  í     %ED  î     %EE  ï     %EF  ð    %F0  ñ    %F1  ò    %F2  ó    %F3  ô    %F4  õ    %F5  ö    %F6  ÷   %F7  ø    %F8  ù    %F9  ú    %FA  û    %FB  ü    %FC  ý    %FD  þ    %FE  ÿ    %FF

在线验证工具

转载地址:https://lemonstone.blog.csdn.net/article/details/83151518 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java日志框架-logback的介绍及配置使用方法(纯Java工程)
下一篇:Webstorm React Nodejs 整合

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月30日 02时50分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章