我正在尝试通过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编码。
答案 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.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(" ", "+");
然后它正常工作。真奇怪。
答案 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)
,则会忽略+
。此方法仅应用于像您这样的情况,在客户端或服务器上使用某种传统方法对字符串进行编码时。
答案 9 :(得分:0)
我绝不是C#开发人员,但看起来您需要在将其作为网址发送之前将其编入ENCODE您的Base64字符串。
答案 10 :(得分:0)
难道你不能假设空格是+并替换它吗?
Request.QueryString["VLTrap"].Replace(" ", "+");
)