【问题标题】:How do I correctly parse a URI query string into a name-value collection in C#?如何正确地将 URI 查询字符串解析为 C# 中的名称-值集合?
【发布时间】:2012-05-01 04:49:41
【问题描述】:

我正在使用 .NET 4.5,我正在尝试将 URI 查询字符串解析为 NameValueCollection。正确的方法似乎是使用HttpUtility.ParseQueryString(string query),它采用从Uri.Query 获得的字符串并返回NameValueCollectionUri.Query 返回一个根据 RFC 2396 转义的字符串,HttpUtility.ParseQueryString(string query) 需要一个 URL 编码的字符串。假设 RFC 2396 和 URL 编码是一回事,这应该可以正常工作。

但是,the documentation for ParseQueryString 声称它“使用 UTF8 格式来解析查询字符串”。还有一个重载方法采用System.Text.Encoding,然后使用它而不是UTF8。

我的问题是:使用 UTF8 作为编码意味着什么? 输入是 string,根据定义(在 C# 中)是 UTF-16。那如何解释为 UTF-8?在这种情况下,使用 UTF8 和 UTF16 作为编码有什么区别?我担心的是,由于我接受任意用户输入,如果我搞砸了编码,可能会带来一些安全风险(即用户可能会通过一些脚本漏洞利用)。

关于这个主题有一个先前的问题 (How to parse a query string into a NameValueCollection in .NET),但它没有专门解决编码问题。

【问题讨论】:

    标签: c#


    【解决方案1】:

    在解析 编码 值时,它会将这些值视为 UTF-8。以字符 ¢ 为例。 UTF-8 编码是 C2 A2。因此,如果它在查询字符串中,它将被编码为 %C2%A2。

    现在,当ParseQueryString 解码时,它需要知道使用什么编码。默认值为 UTF-8,这意味着字符将被正确解码。但也许用户正在使用Microsoft's Cyrillic 代码页 (Windows-1251),其中 C2 和 A2 是两个不同的字符。在这种情况下,将其解释为 UTF-8 将是错误的。

    如果这是一个用户界面应用程序(即用户直接输入数据),那么您可能希望使用为当前 UI 文化定义的任何编码。如果您从 Web 页面获取此信息,那么您将希望使用页面使用的任何编码。如果你正在编写一个 Web 服务,那么你可以告诉用户他们的输入必须是 UTF-8 编码的。

    【讨论】:

    • 完美答案。谢谢。我现在发现这在相关的 RFC 第 2.1 节:"URI and non-ASCII characters" 中有解释。总而言之,没有办法知道客户端(用户)想要什么编码,服务器也没有办法在 URI 中传达预期的编码。此信息必须带外提供。
    猜你喜欢
    • 2012-11-15
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多