处理加密的HttpUtility.UrlEncode参数

时间:2011-03-02 15:20:38

标签: asp.net encryption urlencode

在应用HttpUtility.UrlEncodeUrlDecode时处理加密的网址参数时遇到问题。

对于给定的网址字符串

?fid=7kqguwhYMNw=&uid=YCRSGG71+58= 作为uid加密数据一部分的PLUS符号被删除并替换为空格,因此我尝试解密它失败。

好的,所以我知道+是QUERYSTRING(RFC 1630)中空间的保留缩写,但由于我对加密返回的值没有太多控制权,我怎么能解决这个问题呢。 p>

修改 好的,提出这么好的一点。忽略问题的UrlEncode / UrlDecode部分。当我将它传递给我的解密方法时,Request.QueryString([“uid”])仍然会从中删除加号。

3 个答案:

答案 0 :(得分:1)

Base-64编码值在放入URL之前需要进行URL编码。如果我HttpUtility.UrlEncode("YCRSGG71+58="),那么我会得到YCRSGG71%2b58%3d - 没有加号,并且可以正确解码。

换句话说,在URL上放置base-64值而不首先对其进行编码的代码是错误的。如果您控制该代码,则应更改它。如果您不控制该代码,那么请不要尝试解码首先没有进行网址编码的内容。

答案 1 :(得分:1)

我建议添加代码以删除=字符,将+替换为 - ,并替换/ with。

s = s.Replace("=", "").Replace("+", "-").Replace("/", ".")

如果您需要处理结果字符串,则可以执行相反的操作:

s = s.Replace(".", "/").Replace("-", "+")

(没有理由放回=字符......它们只是填充)。

这样您就不必担心URL编码和解码,并避免不必要的字符串扩展。如果他们最终看到URL,它对用户来说看起来也更专业...... URL中的百分号是丑陋的,几乎总是不必要的......每当我看到它时,它就会尖叫“业余”。

答案 2 :(得分:0)

作为旁注,您应该使用HttpUtility.UrlEncodeHttpUtility.UrlDecode来完成此类工作。但是,即使这些也不会帮助您,因为无论如何URL都是错误的。

所以,不要使用任何东西!既然它没有编码,为什么要解码?