在URLDecode之后,QueryString格式错误

pda*_*vis 15 c# asp.net url

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

例:

http://localhost:3399/Base64.aspx?VLTrap=VkxUcmFwIHNldCB0byAiRkRTQT8+PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==
Run Code Online (Sandbox Code Playgroud)

生产:

VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==
Run Code Online (Sandbox Code Playgroud)

人们建议URLEncoding查询字符串:

System.Web.HttpUtility.UrlEncode(yourString) 
Run Code Online (Sandbox Code Playgroud)

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

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

Request.QueryString["VLTrap"].Replace(" ", "+");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Tim*_*ley 14

建议的解决方案:

Request.QueryString["VLTrap"].Replace(" ", "+");
Run Code Online (Sandbox Code Playgroud)

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

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

通过阅读base64可以轻松解决这个问题.现代base64中唯一合法的非字母数字字符是"/","+"和"="(仅用于填充).

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

所以我认为你应该没事.


Tro*_*sen 11

你可以手动替换值(argument.Replace(' ', '+'))或咨询HttpRequest.ServerVariables["QUERY_STRING"](甚至更好的HttpRequest.Url.Query)并自己解析它.

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

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

  • 最简单的方法是使用Uri.EscapeDataString/Uri.UnescapeDataString. (3认同)