したがって、XSS フィルタリングをテストするためのXSS チート シートがありますが、問題のないページの例以外に、UTF-8 コードが正しく動作しないデータを処理できることを確認するための悪質または不正な形式のテスト データを見つけることができません。
テストに使用できる良いデータはどこにありますか? または、トリッキーな文字列とは何ですか?
したがって、XSS フィルタリングをテストするためのXSS チート シートがありますが、問題のないページの例以外に、UTF-8 コードが正しく動作しないデータを処理できることを確認するための悪質または不正な形式のテスト データを見つけることができません。
テストに使用できる良いデータはどこにありますか? または、トリッキーな文字列とは何ですか?
MarkusKuhnのUTF-8デコーダーストレステストをチェックしてください
中国語の文字を含むファイルは、1 文字あたりの使用バイト数をどのように知るのですか?も参照してください。—間違いなく、他にも役立つSOの質問があります。
UTF-8 では、次の種類のバイトを取得します。
Binary Hex Comments
0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding
10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes)
110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding
1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding
11110xxx 0xF0..0xF4 First byte of a 4-byte character encoding
(最後の行は 0xF0..0xF7 を読み取る必要があるように見えますが、Unicode の 21 ビット範囲 (U+0000 - U+10FFFF) は、有効な最大値が 0xF4 であることを意味します。値 0xF5..0xF7 は、有効な UTF-8。)
特定のバイト シーケンスが有効な UTF-8 であるかどうかを調べるには、次のことを考慮する必要があります。
有効な UTF-8 では、バイト 0xF5..0xFF は発生しません。
一部の文字には、複数の可能な表現があります。たとえば、Unicode 文字 U+0000 (ASCII NUL) は次のように表すことができます。
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
ただし、Unicode 標準では、最後の 3 つの選択肢は最小限ではないため受け入れられないと明確に述べています。バイト 0xC0 と 0xC1 が有効な UTF-8 に表示されないことがあります。これは、これらのバイトでエンコードできる唯一の文字が、範囲 0x00..0x7F のシングルバイト文字として最小限にエンコードされているためです。
Basic Multi-lingual Plane (BMP) 内では、Unicode 値 U+D800 - U+DFFF は UTF-16 サロゲート用に予約されており、有効な UTF-8 でエンコードされているようには見えません。それらが UTF-8 で有効な場合 (強調しておきますが、そうではありません)、サロゲートは次のようにエンコードされます。
したがって、BAD データには、これらのさまざまな規定に違反するサンプルが含まれている必要があります。
バイト オーダー マーク (BOM) U+FEFF、別名ゼロ幅ノーブレーク スペース (ZWNBSP) は、UTF-8 でエンコードされていないと表示できないことに注意してください — バイト 0xFF と 0xFE は、有効な UTF-8 では許可されていません。エンコードされた ZWNBSP は、UTF-8 ファイルでは 0xEF 0xBB 0xBF として表示されますが、BOM は UTF-8 では完全に不要です。
Unicodeにはいくつかの非文字もあります。U+FFFE と U+FFFF は、そのような 2 つの非文字です (そして、各プレーンの最後の 2 つのコード ポイント、U+1FFFE、U+1FFFF、U+2FFFE、U+2FFFF、... U+10FFFE、U+10FFFF はその他です)。 )。これらは通常、データ交換用の Unicode データには表示されませんが、私的使用で表示される場合があります。Unicode の非文字のかなり複雑な歴史を含む、多くの卑劣な詳細については、Unicode FAQ リンクを参照してください。(正誤表 #9: 2013 年 1 月にリリースされた非文字についての明確化は、そのタイトルが示唆することを行います — 非文字の意味を明確にします。)
Jeffrey Bergamini のこの便利なオンライン ツールを使用して、任意のテキストをホモグリフの非常に奇妙な UTF8 文字列に変換できます。
典型的な
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labe et dolore magna aliqua.
このようになります:
ḽơᶉḽơᶉȋṕᶆḍỡḽǭᵳʂǐť、ĉṓɲṩḙċťᶒț、ĉṓɲṩḙċťᶒț șếᶑ șếᶑᶁⱺᶁⱺᶁⱺᶁⱺẽḭŭŝḿꝋẽḭŭŝḿꝋẽḭŭŝḿꝋỉỉỉỉỉỉ愛ḑȋᵭṵṷŧ
ウィキペディアの UTF-8 の記事には、どのバイト シーケンスが有効/無効であるかがよくまとめられています。読む価値のあるもう 1 つの記事は、W3C I18N FAQ: Multilingual Formsです。
私の頭の上から:
0xff と 0xfe
単一の上位ビット バイト
低バイト文字のマルチバイト表現 - 初期チェックを過ぎてヌルを密輸する良い方法
バイトオーダーマーク - 無視しますか?