QueryString在URLDecode之后格式错误

时间:2020-03-06 14:37:43  来源:igfitidea点击:

我正在尝试通过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(),但其中包含相同的格式错误的信息。有没有办法在URLDecode之前查看原始QueryString?

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

解决方案

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

我绝不是Cdeveloper,但看起来我们需要先对URL编码ENBASE Base64字符串,然后再将其作为URL发送。

我们不能只是假设空格是+并替换它吗?

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

;)

好吧,很明显,在将其发送到服务器之前,应该已经对Base64字符串URLEncoded进行了编码。
如果我们不能做到这一点,我建议我们简单地将所有嵌入的空格替换为+;由于b64字符串不应该有空格,因此这是一种合理的策略...

我们可以手动替换值(argument.Replace('','+'))或者查询HttpRequest.ServerVariables [" QUERY_STRING"](甚至更好的HttpRequest.Url.Query)并自行解析。

但是,我们应该尝试解决给出URL的问题。 URL中的加号需要被编码为"%2B",因为加号否则表示空格。

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

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

作为一种快速技巧,我们可以在base64解码之前用加号替换空格。

建议的解决方案:

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

应该工作正常。至于关注:

I had though of this but my concern with it, and I should have mentioned this to start, is that I don't know what other characters might be malformed in addition to the plus sign.

通过阅读有关base64的信息,可以轻松缓解这种情况。在现代base64中合法的唯一非字母数字字符是" /"," +"和" ="(仅用于填充)。

其中," +"是唯一具有特殊含义的URL中的转义表示形式。尽管其他两个在URL中具有特殊含义(路径分隔符和查询字符串分隔符),但它们应该不会造成问题。

所以我认为你应该没事。