15

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

例子:

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

产生:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==

人们建议对查询字符串进行 URLEncoding:

System.Web.HttpUtility.UrlEncode(yourString) 

我不能这样做,因为我无法控制调用例程(它可以与其他语言一起正常工作)。

还有用加号替换空格的建议:

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

我有这个想法,但我对此感到担忧,我应该首先提到这一点,我不知道除了加号之外还有哪些其他字符可能格式不正确。

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

为此,我尝试查看 Request.QueryString.toString() 但这包含相同的格式错误的信息。有什么方法可以在URLDecoded之前查看原始 QueryString 吗?

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

4

11 回答 11

14

建议的解决方案:

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

应该工作得很好。至于你的担心:

我有这个想法,但我对此感到担忧,我应该首先提到这一点,我不知道除了加号之外还有哪些其他字符可能格式不正确。

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

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

所以我觉得你应该没问题。

于 2008-10-16T08:09:35.840 回答
11

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

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

如果您不控制入站 URL,则首选第一个选项,因为这样可以避免大多数错误。

于 2008-09-23T21:29:48.013 回答
4

除了我可以控制我的网址外,我遇到了完全相同的问题。即使使用Server.URLDecode并且Server.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(" ", "+");

然后它可以正常工作。真的很奇怪。

于 2011-01-26T10:52:35.607 回答
2

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

于 2012-01-20T11:01:08.163 回答
2

如果您使用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

于 2014-04-01T17:35:12.280 回答
1

如果您在将字符串添加到 URL 之前对字符串进行 URLEncode,您将不会遇到任何这些问题(自动 URLDecode 会将其返回到原始状态)。

于 2008-09-23T21:26:21.750 回答
1

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

于 2008-09-23T21:29:00.090 回答
1

System.Web.HttpUtility.UrlEncode(yourString)会成功的。

于 2008-09-23T21:31:35.200 回答
1

作为一种快速破解,您可以在 base64 解码之前用加号替换空格。

于 2008-09-23T21:34:21.823 回答
0

我绝不是 C# 开发人员,但看起来您需要先对您的 Base64 字符串进行 url 编码,然后再将其作为 url 发送。

于 2008-09-23T21:27:34.117 回答
0

你不能假设一个空格是一个 + 并替换它吗?

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

;)

于 2008-09-23T21:27:34.913 回答