【发布时间】:2015-03-18 15:22:20
【问题描述】:
我有一个参数,我将其作为querystring 传递给页面URL。在将值作为querystring 传递之前,我正在加密该值。但是,加密值有时会在querystring 中包含+。我知道它在URL 中有特殊含义。所以我使用Server.UrlEncode(encryptedvalue) 来保证它的安全。但是,当我得到Querystring 时,只有+ 在解码URL 之前得到评估。
这是生成查询字符串的代码,
var result = Server.UrlEncode(this.UserSecurity.Encrypt<string>(value));
querystring(result) 的这个值是+ 之后变成%2b 符合预期
querystringvalue = "R3oQCPn%2bNVV4P0aL0LAZEL6Og1%2bQ2vOJJDJCSTY6WXE%3d"
我无法控制Encryption 方法,所以我不能在那里更改。
所以当我访问重定向页面时,
1) 当我不使用 UrlDecode 时,+ 变为
querystringvalue = "R3oQCPn NVV4P0aL0LAZEL6Og1 Q2vOJJDJCSTY6WXE="
2) 当我使用UrlDecode 时,+ 仍然变为
querystringvalue = "R3oQCPn NVV4P0aL0LAZEL6Og1 Q2vOJJDJCSTY6WXE="
3)当我在监视窗口中看到这里时,我看到了奇怪的东西,
如您所见,查询字符串中存在+,但它被解析为。
所以我的问题是,
1) 为什么%3d 没有解析为= 而%2b 解析为+?
2)我能做些什么来解决这个问题?因为%2b 解析为+,然后解析为,给了我错误的解密值和有时格式异常。
更新
生成 result 后,我直接将其附加到 URL,无需任何进一步处理,如 "page.aspx?taskid="+result
【问题讨论】:
-
在下一个请求之前你对
result做了什么? -
没什么,它作为查询字符串直接附加到 URL。
-
好的,我们能看到那个代码吗?以及如何将 URL 返回给客户端? (即,这是一个重定向,作为链接嵌入到页面中吗?)
-
您可以使用修改后的 Base64 编码,它不使用
+而不是UrlEncode。 -
答案中提到的 @CoderofCode
UrlTokenEncode看起来就是这样做的。
标签: c# asp.net query-string urlencode url-encoding