在URLDecode之后,QueryString格式错误

时间:2008-09-23 21:24:09

标签: c# asp.net url

我正在尝试通过QueryString将Base64字符串传递到C#.Net Web应用程序。当字符串到达​​时,“+”(加号)符号将被空格替换。似乎自动URLDecode进程正在执行此操作。我无法控制通过QueryString传递的内容。有没有办法处理这个服务器端?

示例:

http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

产地:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

人们建议URLEncoding the querystring:

System.Web.HttpUtility.UrlEncode(yourString) 

我无法做到这一点,因为我无法控制调用例程(对其他语言工作正常)。

还有建议用加号代替空格:

Request.QueryString["VLTrap"].Replace(" ", "+");

虽然我有这个,但我对它的关注,我应该提到这一点,我不知道除了加号之外其他字符可能会出错。

我的主要目标是在通过解码器运行之前拦截QueryString。

为此,我尝试查看Request.QueryString.toString(),但这包含相同的格式错误的信息。有没有办法在之前查看原始的QueryString 是否为URLDecoded?

经过进一步测试后,似乎.Net希望QuerString中的所有内容都能进行URL编码,但浏览器不会自动对GET请求进行URL编码。

11 个答案:

答案 0 :(得分:14)

建议的解决方案:

Request.QueryString["VLTrap"].Replace(" ", "+");

应该工作得很好。至于你的关注:

  

虽然我有这个,但我对它的关注,我本来应该提到这一点,是因为我不知道除了加号之外还有哪些其他字符可能会出错。

这很容易通过reading about base64来缓解。现代base64中唯一合法的非字母数字字符是“/”,“+”和“=”(仅用于填充)。

其中,“+”是唯一具有特殊含义的URL作为转义表示。虽然其他两个在URL(路径分隔符和查询字符串分隔符)中具有特殊含义,但它们不应构成问题。

所以我认为你应该没事。

答案 1 :(得分:11)

您可以手动替换值(argument.Replace(' ', '+'))或咨询HttpRequest.ServerVariables["QUERY_STRING"](更好的是HttpRequest.Url.Query)并自行解析。

但是,您应该尝试解决URL给出的问题;加号需要在URL中编码为“%2B”,因为加号表示空格。

如果您不控制入站网址,则首选该选项,因为您可以通过这种方式避免大多数错误。

答案 2 :(得分:4)

我有完全相同的问题,除了我可以控制我的网址。即使使用Server.URLDecodeServer.URLEncode,它也不会将其转换回+符号,即使我的查询字符串如下所示:

http://localhost/childapp/default.aspx?TokenID=0XU%2fKUTLau%2bnSWR7%2b5Z7DbZrhKZMyeqStyTPonw1OdI%3d

当我执行以下操作时。

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);

它仍然无法将%2b转换回+符号。相反,我必须做以下事情:

string tokenID = Server.UrlDecode(Request.QueryString["TokenID"]);
tokenID = tokenID.Replace(" ", "+");

然后它正常工作。真奇怪。

答案 3 :(得分:2)

我遇到类似的问题,包含Base64值的参数以及带有'+'的参数。 只有Request.QueryString [“VLTrap”]。替换(“”,“+”);为我工作得很好; 没有UrlEncode或其他编码有帮助,因为即使您在页面上显示编码链接,并且'+'编码为'%2b',它的浏览器会在显示时将其更改为'+',当您单击它时,浏览器会更改它是空的空间。即使您自己显示链接,也无法像原始海报那样控制它。即使在HTML电子邮件中,这些链接也是如此。

答案 4 :(得分:1)

如果在将字符串添加到URL之前对字符串进行URLEncode,则不会出现任何问题(自动URLDecode会将其恢复为原始状态)。

答案 5 :(得分:1)

嗯,显然你应该在将Base64字符串URLEncoded发送到服务器之前使用它 如果你不能做到这一点,我建议简单地将任何嵌入的空格替换回+;因为b64字符串没有空格,所以它是一种合法的策略......

答案 6 :(得分:1)

System.Web.HttpUtility.UrlEncode(yourString)可以解决问题。

答案 7 :(得分:1)

作为快速黑客,您可以在base64解码之前用plus字符替换空格。

答案 8 :(得分:1)

如果您使用System.Uri.UnescapeDataString(yourString),则会忽略+。此方法仅应用于像您这样的情况,在客户端或服务器上使用某种传统方法对字符串进行编码时。

查看此博文: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx

答案 9 :(得分:0)

我绝不是C#开发人员,但看起来您需要在将其作为网址发送之前将其编入ENCODE您的Base64字符串。

答案 10 :(得分:0)

难道你不能假设空格是+并替换它吗?

Request.QueryString["VLTrap"].Replace(" ", "+");