代码之家  ›  专栏  ›  技术社区  ›  James Lawruk

当查询字符串在ASP.NET中被URLENCODED或具有百分号字符时,如何获取该字符串

  •  2
  • James Lawruk  · 技术社区  · 15 年前

    当querystring被urlencoded或在asp.net中有百分号字符时,如何从请求对象中获取实际的querystring?

    基本上,如果我有这样的网址: Default.aspx?p=%b4 ,如何获取用“%B4”填充的字符串?

    Request.QueryString["p"] 返回不可打印的字符。

    Request.RawUrl 返回default.aspx?P= %UFFD

    Request.Url.AbsoluteUri 返回default.aspx?P= %EF%BF%BD

    我如何才能取回“%B4”?

    4 回复  |  直到 10 年前
        1
  •  4
  •   Justin Grant    15 年前

    我进一步研究了这个问题,相信我知道是什么导致了这个问题:一个HTTP客户机正在向服务器提交一个未正确编码URL的URL。具体来说,URL中有一个无效字符。

    要重新打印,请将以下内容粘贴到IE8的URL末尾: default.aspx?p=´

    如果检查通过线路的字节(例如使用 Fiddler ,您将看到一个实际的十六进制B4字符正在从客户机发送到URL中的服务器。这是URL中的非法字符,因为URL被限制为0x80以下的字符代码(任何大于0x80的字符代码都必须进行百分比转义)。

    因此,您的客户机正在传入一个无效字符,而您的服务器正在(正确地)用%ef%bf%bd替换伪字符,该字符是 Unicode Replacement Character (U+0FFD) ,当遇到在本地编码中没有等效字符时会发生这种情况。

    afaik,这是IE中的一个bug。如果您在firefox中键入相同的URL,firefox将正确地对该URL进行编码(用%b4代替_)。请注意,同样是afaik,只有在手动将无效字符粘贴到IE的地址栏时才会出现问题——如果链接中存在相同的字符,则IE似乎正确编码了URL(至少在我测试的情况下)。

    所以你应该弄清楚是谁在向你发送这个伪造的URL,并告诉他们开始正确地编码他们的URL!

        2
  •  1
  •   Matthew    15 年前

    ASP.NET将在您请求时自动对内容进行URL解码。querystring[“key”]。你只需要重新编码。

    HttpUtility.UrlEncode(Request.QueryString["p"])
    
        3
  •  0
  •   Aaron    15 年前
    HttpContext.Current.Request.ServerVariables["QUERY_STRING"]
    

    将返回原始查询字符串

        4
  •  0
  •   combuilder    10 年前

    我也有同样的问题。我只是在构造查询字符串时添加了javascript“escape('text%text')”来解决这个问题!