2

私は .NET 4.5 を使用しており、URI クエリ文字列をNameValueCollection. 正しい方法はHttpUtility.ParseQueryString(string query)、取得した文字列を取得しUri.Queryて a を返すを使用することNameValueCollectionです。Uri.QueryRFC 2396 に従ってエスケープされた文字列を返し、HttpUtility.ParseQueryString(string query)URL エンコードされた文字列を期待します。RFC 2396 と URL エンコーディングが同じものであると仮定すると、これは正常に機能するはずです。

ただし、「UTF8形式を使用してクエリ文字列を解析する」と主張するドキュメント。を受け取り、 UTF8 の代わりにそれを使用ParseQueryStringするオーバーロードされたメソッドもあります。System.Text.Encoding

私の質問は、エンコーディングとして UTF8 を使用するとはどういう意味ですか? 入力は astringで、定義上 (C# では) UTF-16 です。それはどのように UTF-8 として解釈されますか? この場合、エンコーディングとして UTF8 と UTF16 を使用することの違いは何ですか? 私の懸念は、私は任意のユーザー入力を受け入れているため、エンコーディングを失敗させると、セキュリティ上のリスクが生じる可能性があることです (つまり、ユーザーがスクリプトの悪用をすり抜けられる可能性があります)。

このトピックに関する以前の質問 ( How to parse a query string into a NameValueCollection in .NET ) がありますが、特にエンコーディングの問題には対応していません。

4

1 に答える 1

7

エンコードされた値を解析するとき、それらの値は UTF-8 として扱われます。たとえば、文字¢を取ります。UTF-8 エンコーディングは C2 A2 です。そのため、クエリ文字列にある場合は、%C2%A2 としてエンコードされます。

さて、ParseQueryStringがデコードするときは、どのエンコーディングを使用するかを知る必要があります。デフォルトは UTF-8 で、文字が正しくデコードされることを意味します。しかし、ユーザーはMicrosoft のキリル文字コード ページ (Windows-1251) を使用していた可能性があります。ここで、C2 と A2 は 2 つの異なる文字です。その場合、UTF-8 として解釈するとエラーになります。

これがユーザー インターフェイス アプリケーション (つまり、ユーザーがデータを直接入力するアプリケーション) である場合は、現在の UI カルチャに対して定義されているエンコーディングを使用することをお勧めします。この情報を Web ページから取得する場合は、そのページで使用されているエンコードを使用する必要があります。また、Web サービスを作成している場合は、入力を UTF-8 でエンコードする必要があることをユーザーに伝えることができます。

于 2012-04-19T16:09:27.460 に答える