从 URL 检索编码值

Posted

技术标签:

【中文标题】从 URL 检索编码值【英文标题】:Retreiveing Encoded Value from URL 【发布时间】:2012-09-17 22:25:46 【问题描述】:

我在 URL 中传递了一个编码的 SSO 令牌...所以 URL 看起来像

 http://127.0.0.1:7101/CRMOD_UCM-Sankalp-context-root/BrowseFile.jsp?token=%246%24zhxjx%2fpz6dVucl9cgG43ii2Tr4qVnNbeqJg8jCy6Jj7vRvXN4%3d%3b%246%24GlRGp%2fxfEM308NZGmY%2fhjHav2yjHSvbww1l0%2fCcCtcVjzl%2bCQFlQPdBRKO0t1XUmF0I6xLmfQ%2fnb7VgJeSYnvrAb9YUQQ3tvr%2fBZ%2bIRZiBAGU2%2fZg%3d

但是当我检索变量的值并使用打印它时 out.println("SSO Token:"+request.getParameter("token")); 它打印

$ 6 $ zhxjx / pz6dVucl9cgG43ii2Tr4qVnNbeqJg8jCy6Jj7vRvXN4 =; $ 6 $ GlRGp / xfEM308NZGmY / hjHav2yjHSvbww1l0 / CcCtcVjzl + CQFlQPdBRKO0t1XUmF0I6xLmfQ / nb7VgJeSYnvrAb9YUQQ3tvr / BZ + IRZiBAGU2 / ZG = P>

正确的令牌存在于 URL 中,为什么我在打印中得到如此不同的值...

请帮助......

【问题讨论】:

【参考方案1】:

request.getParameter("token") 解码参数值,因此打印的值是 URL 中参数值的解码版本。

更多信息请参见Java EE, accent in url, request.getParameter wrong value。

【讨论】:

那么这是一个很大的安全威胁,因为拥有 URL 的neone 可以简单地使用来解码令牌,你能告诉我如何避免这种情况【参考方案2】:

如果要解码,您将获得编码值,然后使用以下代码。默认情况下,系统会为我们解码,但在您的情况下,它不会被解码,您必须显式解码 request.getParameter("token") 的值。

String token = request.getParameter("token").toString();
// To decode url
String decodedtoken = URLDecoder.decode(token , "UTF-8");
System.out.println("Decoded token value "+ decodedtoken);

// To encode url 
String encodedtoken = URLEncoder.encode(token , "UTF-8"); 
System.out.println("Encoded token value "+ encodedtoken);

【讨论】:

【参考方案3】:

在 URL 中,令牌是 URL encoded。这是必要的,因为某些字符在 URL 中具有特殊含义。

通过对值进行 URL 编码,这些特殊字符将替换为 %nn 代码,其中 nn 是特殊字符的字符代码。

Java 会自动为您解码,以便您在调用 request.getParameter("token") 时获得实际值,而不是 URL 编码的值。

【讨论】:

实际上 %nn 代表一个字节,它取决于 Web 服务器配置,使用哪个字节字符映射。 Tomcat 以 ISO-8859-1 为例,但我不知道它是否改变了。因此,当您对该值进行编码并使用相同的编码时,您必须小心。 那么这是一个很大的安全威胁,因为拥有 URL 的neone 可以简单地使用来解码令牌,你能告诉我如何避免这种情况

以上是关于从 URL 检索编码值的主要内容,如果未能解决你的问题,请参考以下文章

URL中的特殊字符处理

URL中%2F,%2B等特殊字符

URL传参中不能带特殊的字符以及处理方案

http get请求时参数被转码的问题

URL中的特殊字符

URL中的特殊字符