美文网首页
The valid characters are defined

The valid characters are defined

作者: 俯瞰show | 来源:发表于2018-01-02 13:19 被阅读0次

    前言

    网上有很多关于tomcat版本过高导致的协议问题的解决方式,但是jar版本(例如spring boot内置的)的很少,特此总结了一下,如果只想看spring boot的解决方式,跳到最后一行

    RFC 3986规范

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

    不安全字符

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

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

    解决方式

    转义

    将请求值URL编码(但是spring boot默认只会URL解码一次,二次解码需要另行添加)

    更换版本

    更换Tomcat为较低版本(提示:同样的问题也存在于 >=8.0.39和>=9.0.0.M12)

    使用POST

    使用POST提交数据内容(body中)

    修改配置

    1.tomcat解压版/安装版

    1.~/conf/catalina.properties中,找到最后注释掉的一行 #tomcat.util.http.parser.HttpParser.requestTargetAllow选项,改成tomcat.util.http.parser.HttpParser.requestTargetAllow=|{},选项是按照字符分隔为一个数组,表示放行["|","{","}"]
    2.或者你可以在~/conf/catalina.properties最后一行添加org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

    2.内置版(spring boot等内置的tomcat)

    在启动时加入tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
    实例:# java -jar -Dtomcat.util.http.parser.HttpParser.requestTargetAllow=|{} demo-0.0.1-SNAPSHOT.jar

    相关文章

      网友评论

          本文标题:The valid characters are defined

          本文链接:https://www.haomeiwen.com/subject/uldfnxtx.html