代码之家  ›  专栏  ›  技术社区  ›  pdavis

URLDecode后的QueryString格式错误

  •  15
  • pdavis  · 技术社区  · 16 年前

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

    例子:

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

    生产:

    VkxUcmFwIHNldCB0byAiRkRTQT8 PE0iIHBsdXMgb3IgbWludXMgNSBwZXJjZW50Lg==
    

    人们建议对查询字符串进行URL编码:

    System.Web.HttpUtility.UrlEncode(yourString) 
    

    我无法做到这一点,因为我无法控制调用例程(它在其他语言中运行良好)。

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

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

    我有这个想法,但我担心的是,我不知道是什么 别的 除了加号之外,字符的格式也可能不正确。

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

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

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

    11 回复  |  直到 16 年前
        1
  •  14
  •   Tim Farley    16 年前

    建议的解决方案:

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

    应该工作得很好。关于您的担忧:

    我有过这样的想法,但我担心的是,除了加号之外,我不知道还有什么其他字符可能是畸形的。

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

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

    所以我认为你应该没事。

        2
  •  11
  •   Troels Thomsen    16 年前

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

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

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

        3
  •  4
  •   Tim Cooper    13 年前

    我也遇到了同样的问题,除了我可以控制我的网址 Server.URLDecode Server.URLEncode 它不会将其转换回a + 即使我的查询字符串看起来如下:

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

    当我执行以下操作时。

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

    它仍然无法转换 %2b 回到a + 签名。相反,我必须执行以下操作:

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

    然后它就正常工作了。真的很奇怪。

        4
  •  2
  •   Roman Lazunin    13 年前

    我对一个包含Base64值的参数也有类似的问题,当它带有“+”时。 只有请求。QueryString[“VLTrap”]。替换(“”、“+”);对我来说工作得很好; 没有UrlEncode或其他编码帮助,因为即使您自己在页面上显示编码为“%2b”的“+”的编码链接,当它显示时,浏览器也会首先将其更改为“+”,当您单击它时,浏览器会将它更改为空白。所以,即使你自己显示链接,也无法像原始海报所说的那样控制它。即使在html电子邮件中,这种链接也是如此。

        5
  •  2
  •   Jacob VanScoy    11 年前

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

        6
  •  1
  •   Nir    16 年前

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

        7
  •  1
  •   AviD    16 年前

    显然,在将Base64字符串URLEncoded发送到服务器之前,您应该对其进行编码。
    如果你不能做到这一点,我建议简单地将任何嵌入式空格替换回+;由于b64字符串不允许有空格,因此这是一种合法的策略。..

        8
  •  1
  •   henriksen    16 年前

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

        9
  •  1
  •   Alexander    16 年前

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

        10
  •  0
  •   Ryan White    16 年前

    我绝不是C#开发人员,但看起来你需要在将Base64字符串作为url发送之前对其进行url ENCODE。

        11
  •  0
  •   Jason Bunting    16 年前

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

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

    ;)