从 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 检索编码值的主要内容,如果未能解决你的问题,请参考以下文章