2

我有一个请求,在浏览器地址栏中输入:

http://localhost:8888/cmens-tops-outwear/t-b-f-a-c-s-fLoose-p-g-e-i-o.htm?'"--></style></script><script>netsparker(0x0000E1)</script>=

Tomcat6.0.35我已经设定URIEncoding="UTF-8"

request.getQueryString()在 servlet 中使用:

如果chrome,我得到

'%22--%3E%3C/style%3E%3C/script%3E%3Cscript%3Enetsparker(0x0000E1)%3C/script%3E=

如果ie,我得到

'"--></style></script><script>netsparker(0x0000E1)</script>=

为什么?

额外的

我想request.getQueryString()创建一个uri

URI uri = URI.create(url)

如果即:

java.net.URISyntaxException: Illegal character in query at index 36: /cmens/t-b-f-a-c-s-f-p-g-e-i-o.htm?'"--></style></script><script>netsparker(0x0000E1)</script>
    at java.net.URI$Parser.fail(URI.java:2809)
    at java.net.URI$Parser.checkChars(URI.java:2982)
    at java.net.URI$Parser.parseHierarchical(URI.java:3072)
    at java.net.URI$Parser.parse(URI.java:3024)
    at java.net.URI.<init>(URI.java:578)
    at java.net.URI.create(URI.java:840)

如何判断queryString是否已经编码?

4

4 回答 4

5

根据HttpServletRequest#getQueryString()定义未解码。另见javadoc(重点是我的):

回报:

一个包含查询字符串的字符串,如果 URL 不包含查询字符串,则为 null。该值不被容器解码。

getParameterXxx()基本上,如果您出于某种原因想要手动解析它而不是使用方法(隐式解码参数!),您需要自己对其进行 URL 解码。

String decodedQueryString = URLDecoder.decode(request.getQueryString(), "UTF-8");

至于为什么 Chrome 发送它编码而 IE 不发送,那是因为 Chrome 在以安全/正确的方式处理 HTTP 请求方面做得更好。这是你无法控制的。如果您出于某种原因打算手动解析查询字符串,请始终自行对查询字符串进行 URL 解码。该URIEncoding="UTF-8"配置仅对getParameterXxx()GET 请求期间的方法有影响。

于 2013-02-21T14:29:23.400 回答
0

Chrome 版本是 URLEncoded,而 IE 字符串是解码的。

使用此工具比较 URLEncoded 和解码版本: http: //meyerweb.com/eric/tools/dencoder/

于 2013-02-21T14:24:57.093 回答
0

Chrome 使用的是 URL 编码方式,而 IE 使用的是字符串。

例如: " 在 URL 编码中是 %22。

< 是 %3E 并且 > 是 %3C

Chrome 正在以“正确的方式”做这件事,但 IE 不能像其他所有的那样做。

您可以在此处找到完整的 URL 字符列表:http: //www.w3schools.com/tags/ref_urlencode.asp

于 2013-02-21T14:28:32.810 回答
0

Chrome 发送编码后的 url。尝试使用解码查询字符串

URLDecoder.decode(queryString, "UTF-8");

如javadoc所述,查询字符串不被容器解码:

如果 URL 不包含查询字符串,则返回包含查询字符串的字符串或 null。该值不被容器解码。

文档

于 2013-02-21T14:29:37.043 回答