web-dev-qa-db-ja.com

本当に良い、悪いUTF-8サンプルテストデータ

したがって、XSSフィルタリングをテストするための XSSチートシート がありますが、 良性ページの例 UTF-8コードは、動作不良のデータを処理できます。

どこで良い、そして悪いデータを見つけることができますか?または、文字のトリッキーなシーケンスとは何ですか?

79
Xeoncross
91
zildjohn01

中国語の文字を含むファイルは、文字ごとに使用するバイト数をどのように知るのですか? —間違いなく、他にも役立つ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リンクを参照してください。( Corrigendum#9:Clarification About Noncharacters 2013年1月、そのタイトルが示唆することを行います-非キャラクターの意味を明確にします。)

33

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

典型的な

Lorem ipsum dolor sit amet、consectetur adipiscing elit、sed do eiusmod tempor incididunt ut Labore et dolore magna aliqua。

このようになる:

Ḽơᶉëᶆȋṕšᶙṁḍỡḽǭᵳӓṁệẗӓṁệẗ、ĉṓɲṩḙċťᶒțûɾấɖḯƥĭṩčįɳġḝłįʈ、șếᶑᶁⱺẽḭŭŝḿꝋďṫĕᶆᶈṓɍỉñḉīḑȋᵭṵńťṷŧḹẩḇőꝛếéȶđꝍꞎôꝛȇᵯáꞡᶇāąⱡîɋṹẵ。

13
Shebuka

WikipediaのUTF-8記事 は、どのバイトシーケンスが有効/無効であるかについての適切な概要を示しています。読む価値のある別の記事は W3C I18N FAQ:Multilingual Forms です。

5
Gumbo

私の頭の上から:

0xffおよび0xfe

単一の高ビットバイト

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

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

NFC対NFD

2
Douglas Leeder