【问题标题】:.Net Uri Encoding RFC 2396 vs RFC 3986.Net Uri 编码 RFC 2396 与 RFC 3986
【发布时间】:2011-10-25 10:34:34
【问题描述】:

首先,简要介绍一下背景... 作为与第三方供应商集成的一部分,我有一个 C# .Net Web 应用程序,它接收一个 URL,其中包含查询字符串中的一堆信息。该 URL 使用 MD5 哈希和共享密钥进行签名。基本上,我拉入查询字符串,删除它们的哈希,对剩余的查询字符串执行我自己的哈希,并确保我的与提供的匹配。

我正在通过以下方式检索 Uri...

Uri uriFromVendor = new Uri(Request.Url.ToString());
string queryFromVendor = uriFromVendor.Query.Substring(1); //Substring to remove question mark

我的问题源于包含特殊字符(如变音符号 (ü))的查询字符串。供应商正在根据 RFC 2396 表示形式(%FC)计算其哈希值。我的 C# .Net 应用程序正在根据 RFC 3986 表示形式(%C3%BC)计算它的哈希值。不用说,我们的哈希值不匹配,我抛出了我的错误。

奇怪的是,documentation for the Uri class in .Net 表示它应该遵循 RFC 2396,除非另有设置为 RFC 3986,但我的web.config 文件中没有他们说此行为所需的条目。

如何强制 Uri 构造函数使用 RFC 2396 约定?

如果做不到这一点,是否有一种简单的方法可以将 RFC 3986 八位字节对转换为 RFC 2396 八位字节?

【问题讨论】:

  • 与你的问题无关,但你为什么要在这里创建一个新的 Uri?你可以做string queryFromVendor = Request.Url.Query.Substring(1);
  • 您使用的是哪个版本的 .NET?
  • 我使用的是 .Net 4.0。另外,奇怪的是,当我尝试使用 Request.Url.Query 时,变音符号以 %ufffd 的形式出现,这是 � 字符。

标签: asp.net uri url-encoding rfc3986 rfc2396


【解决方案1】:

我想知道这是否有点牵强:

我这样说是因为 FC 是带有变音符号的 u 的 UTF16 表示; C2BC 是 UTF8 表示。

我想知道将源数据转换为普通 .Net 字符串的 System.Text.Encoding 方法之一是否有帮助。

这个问题可能也很有趣:Encode and Decode rfc2396 URLs

【讨论】:

    【解决方案2】:

    我不知道 Uri 构造函数的标准编码,但如果其他一切都失败了,你总是可以自己解码 URL 并以你喜欢的任何编码对其进行编码。

    HttpUtility-Class 有一个UrlDecode()UrlEncode() 方法,可以让您指定System.Text.Encoding 作为第二个参数。

    例如:

    string decodedQueryString = HttpUtility.UrlDecode(Request.Url.Query.Substring(1));
    string encodedQueryString = HttpUtility.UrlEncode(decodedQueryString, System.Text.Encoding.GetEncoding("utf-16"));
    // calc hash here
    

    【讨论】:

    • 看起来 UrlEncode 方法有点过分了。输出已编码字符串中的所有内容... c%00o%00n%00f%00i%00r%00m%00a%00t%00i%00o%00...
    • 注意:它确实设法将变音符号转换回%FC。有没有办法更有选择性,所以它不会对 & 符号、加号和 %00 进行编码?
    • 好的,首先:%00结果是utf-16编码的结果,我这里只是作为例子。用你想要的任何编码替换它。如果你想把ü转换成%FC,也许你正在寻找latin1:System.Text.Encoding.GetEncoding("latin1")
    • 您的问题现在似乎已经解决了,只是为了完整起见:您可以通过拆分查询字符串、编码每个部分并将其重新组合来绕过 & 和 = 字符的编码。但正如我所说,整个答案只是解决问题的方法。
    【解决方案3】:

    与你的问题无关,但你为什么要在这里创建一个新的 Uri?你可以做string queryFromVendor = Request.Url.Query.Substring(1); – 阁楼

    +1 阁楼!我回去尝试删除我正在创建的无关 Uri,突然间,字符串的变音符号编码为 UTF-8 而不是 UTF-16。

    起初,我认为这行不通。在某个地方,我曾尝试使用Request.QueryString 检索网址,但这导致变音符号以%ufffd 的形式出现,即�字符。为了换个角度,我尝试了 atticae 的建议,结果奏效了。

    我很确定答案与something I read here 有关。

    C# 在其所有字符串中使用 UTF-16,并在处理流和文件时使用编码工具将我们带到...

    ASP.NET 默认使用 UTF-8,很难想到它不是一个好的选择...

    我的问题源于这里...

    Uri uriFromVendor = new Uri(Request.Url.ToString());
    

    通过获取 Request.Url uri 并创建另一个 uri,它被编码为 C# 标准 UTF-16。通过使用原始 uri,它保留在 .Net 标准 UTF-8 中。

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 2018-01-01
      • 2019-08-31
      • 1970-01-01
      • 2019-06-14
      相关资源
      最近更新 更多