问题 是什么导致在Tomcat中使用EOF或isHexDigit消息的java.io.CharConversionException?


这个异常通过一个简单的'getParameter()'调用来加密我们的生产catalina日志。

警告:参数:字符解码失败。跳过参数。

java.io.CharConversionException:EOF
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:82)
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48)
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509)
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266)
    在org.apache.catalina.connector.Request.parseParameters(Request.java:2361)
    在org.apache.catalina.connector.Request.getParameter(Request.java:1005)
    在org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353)
    在javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)

或者有时:

java.io.CharConversionException:isHexDigit
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:87)
    at org.apache.tomcat.util.buf.UDecoder.convert(UDecoder.java:48)
    at org.apache.tomcat.util.http.Parameters.urlDecode(Parameters.java:411)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:393)
    at org.apache.tomcat.util.http.Parameters.processParameters(Parameters.java:509)
    at org.apache.tomcat.util.http.Parameters.handleQueryParameters(Parameters.java:266)
    在org.apache.catalina.connector.Request.parseParameters(Request.java:2361)
    在org.apache.catalina.connector.Request.getParameter(Request.java:1005)
    在org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:353)
    在javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:158)

2889
2017-09-19 20:55


起源



答案:


只是在这里假设。似乎参数的URL解码或其值失败(URL编码意味着使用%XX或%XXXX表示法编码某些字符,其中XX或XXXX是ISO-8859-1或Unicode中字符的十六进制代码)。在第一种情况下,可能会发生错误,因为%字符后面没有足够的十六进制字符。在第二种情况下,这可能会发生,因为%字符后面的字符不是十六进制。


5
2017-09-19 21:54



谢谢,我在我们的测试环境中确认了这种情况。值得注意的是,它不会影响整体请求(其他参数被解析为正常,请求像往常一样处理) - Peter
嗯......听起来像对Tomcat的日志文件执行DoS攻击的好方法...... - Alexander


答案:


只是在这里假设。似乎参数的URL解码或其值失败(URL编码意味着使用%XX或%XXXX表示法编码某些字符,其中XX或XXXX是ISO-8859-1或Unicode中字符的十六进制代码)。在第一种情况下,可能会发生错误,因为%字符后面没有足够的十六进制字符。在第二种情况下,这可能会发生,因为%字符后面的字符不是十六进制。


5
2017-09-19 21:54



谢谢,我在我们的测试环境中确认了这种情况。值得注意的是,它不会影响整体请求(其他参数被解析为正常,请求像往常一样处理) - Peter
嗯......听起来像对Tomcat的日志文件执行DoS攻击的好方法...... - Alexander


另一件需要调查的是你的URIEncoding Tomcat“连接器”配置。 如果链接在UTF-8编码页面中,它将使用UTF-8将URL编码为字节,然后URL编码需要它的任何字节。但是,默认情况下,Tomcat认为这些字节是ISO-8859-1,这可能会导致问题。

反之亦然:如果页面是ISO-8859-1,并且Tomcat的URIEncoding已设置为UTF-8,则可能导致类似的错误。

以下是关于该领域问题的有用讨论: JSP / Servlet容器中的Charset陷阱


2
2017-09-24 16:38





当用户通过ajax请求发送'%'时,我开始收到此错误。事实证明我在提出请求之前没有逃避参数。本文介绍了此场景和修复的完整说明 博客文章


2
2017-08-13 03:11





它也可能是这个(来自维基百科):

存在Unicode字符的非标准编码:%uxxxx,其中xxxx是表示为四个十六进制数字的Unicode值。任何RFC都未指定此行为,并且W3C已拒绝此行为。第三版ECMA-262仍然包含一个使用此语法的转义(字符串)函数,还包括一个encodeURI(uri)函数,它转换为UTF-8并对每个八位字节进行百分比编码。

所以你可以在Javascript中使用旧的转义函数,但由于Tomcat的后续版本对这些事情更加严格(5.5.17让这个编码幻灯片),现在才开始看到异常。


1
2018-04-10 15:57