97

したがって、XSS フィルタリングをテストするためのXSS チート シートがありますが、問題のないページの例以外に、UTF-8 コードが正しく動作しないデータを処理できることを確認するための悪質または不正な形式のテスト データを見つけることができません。

テストに使用できる良いデータはどこにありますか? または、トリッキーな文字列とは何ですか?

4

5 に答える 5

104

MarkusKuhnのUTF-8デコーダーストレステストをチェックしてください

于 2009-08-23T19:33:16.550 に答える
38

中国語の文字を含むファイルは、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-16 サロゲート

有効な 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 のシングルバイト文字として最小限にエンコードされているためです。

UTF-16 サロゲート

Basic Multi-lingual Plane (BMP) 内では、Unicode 値 U+D800 - U+DFFF は UTF-16 サロゲート用に予約されており、有効な UTF-8 でエンコードされているようには見えません。それらが UTF-8 で有効な場合 (強調しておきますが、そうではありません)、サロゲートは次のようにエンコードされます。

  • U+D800 — 0xED 0xA0 0x80 (最小の上位サロゲート)
  • U+DBFF — 0xED 0xAF 0xBF (最大の上位サロゲート)
  • U+DC00 — 0xED 0xB0 0x80 (最小の下位サロゲート)
  • U+DFFF — 0xED 0xBF 0xBF (最大の下位サロゲート)

不良データ

したがって、BAD データには、これらのさまざまな規定に違反するサンプルが含まれている必要があります。

  • 初期バイト値のいずれも前にない継続バイト
  • 複数文字の最初のバイトの後に十分な継続バイトが続かない
  • 非最小マルチバイト文字
  • UTF-16 サロゲート
  • 無効なバイト (0xC0、0xC1、0xF5..0xFF)。

バイト オーダー マーク (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 月にリリースされた非文字についての明確化は、そのタイトルが示唆することを行います — 非文字の意味を明確にします。)

于 2009-08-23T18:39:05.100 に答える
17

Jeffrey Bergamini のこの便利なオンライン ツールを使用して、任意のテキストをホモグリフの非常に奇妙な UTF8 文字列に変換できます。

典型的な

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labe et dolore magna aliqua.

このようになります:

ḽơᶉḽơᶉȋṕᶆḍỡḽǭᵳʂǐť、ĉṓɲṩḙċťᶒț、ĉṓɲṩḙċťᶒț șếᶑ șếᶑᶁⱺᶁⱺᶁⱺᶁⱺẽḭŭŝḿꝋẽḭŭŝḿꝋẽḭŭŝḿꝋỉỉỉỉỉỉ愛ḑȋᵭṵṷŧ

于 2016-12-15T15:08:17.097 に答える
4

ウィキペディアの UTF-8 の記事には、どのバイト シーケンスが有効/無効であるかがよくまとめられています。読む価値のあるもう 1 つの記事は、W3C I18N FAQ: Multilingual Formsです。

于 2009-08-23T17:09:07.420 に答える
2

私の頭の上から:

0xff と 0xfe

単一の上位ビット バイト

低バイト文字のマルチバイト表現 - 初期チェックを過ぎてヌルを密輸する良い方法

バイトオーダーマーク - 無視しますか?

NFC 対 NFD

于 2009-08-23T17:22:16.940 に答える