Beispiel ungültiger utf8-String?

96

Ich teste, wie ein Teil meines Codes mit fehlerhaften Daten umgeht, und ich benötige einige Byteserien, die ungültig sind. UTF-8.

Können Sie einige und im Idealfall eine Erklärung veröffentlichen, warum sie schlecht sind / woher Sie sie haben?

twk
quelle
4
Mögliches Duplikat von wirklich guten, schlechten UTF-8-Beispieltestdaten
Claudiu

Antworten:

50

In PHP:

$examples = array(
    'Valid ASCII' => "a",
    'Valid 2 Octet Sequence' => "\xc3\xb1",
    'Invalid 2 Octet Sequence' => "\xc3\x28",
    'Invalid Sequence Identifier' => "\xa0\xa1",
    'Valid 3 Octet Sequence' => "\xe2\x82\xa1",
    'Invalid 3 Octet Sequence (in 2nd Octet)' => "\xe2\x28\xa1",
    'Invalid 3 Octet Sequence (in 3rd Octet)' => "\xe2\x82\x28",
    'Valid 4 Octet Sequence' => "\xf0\x90\x8c\xbc",
    'Invalid 4 Octet Sequence (in 2nd Octet)' => "\xf0\x28\x8c\xbc",
    'Invalid 4 Octet Sequence (in 3rd Octet)' => "\xf0\x90\x28\xbc",
    'Invalid 4 Octet Sequence (in 4th Octet)' => "\xf0\x28\x8c\x28",
    'Valid 5 Octet Sequence (but not Unicode!)' => "\xf8\xa1\xa1\xa1\xa1",
    'Valid 6 Octet Sequence (but not Unicode!)' => "\xfc\xa1\xa1\xa1\xa1\xa1",
);

Von http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php#54805

Philfreo
quelle
4

, ̆ war besonders böse. Ich sehe es als auf Ubuntu kombiniert.

Komma-Breve

user1015281
quelle
3

Die Idee von Mustern schlecht gebildeter Byte-Sequenzen kann aus der Tabelle gut geformter Byte-Sequenzen entnommen werden. Siehe " Tabelle 3-7. Gut geformte UTF-8-Byte-Sequenzen " im Unicode-Standard 6.2.

    Code Points    First Byte Second Byte Third Byte Fourth Byte
  U+0000 -   U+007F   00 - 7F
  U+0080 -   U+07FF   C2 - DF    80 - BF
  U+0800 -   U+0FFF   E0         A0 - BF     80 - BF
  U+1000 -   U+CFFF   E1 - EC    80 - BF     80 - BF
  U+D000 -   U+D7FF   ED         80 - 9F     80 - BF
  U+E000 -   U+FFFF   EE - EF    80 - BF     80 - BF
 U+10000 -  U+3FFFF   F0         90 - BF     80 - BF    80 - BF
 U+40000 -  U+FFFFF   F1 - F3    80 - BF     80 - BF    80 - BF
U+100000 - U+10FFFF   F4         80 - 8F     80 - BF    80 - BF

Hier sind die aus U + 24B62 generierten Beispiele. Ich habe sie für einen Fehlerbericht verwendet: Fehler # 65045 mb_convert_encoding bricht einen wohlgeformten Charakter

// U+24B62: "\xF0\xA4\xAD\xA2"
"\xF0\xA4\xAD"    ."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"
"\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD"

Die übermäßige Vereinfachung des Bereichs nachfolgender Bytes ([0x80, 0xBF]) ist in den verschiedenen Bibliotheken zu sehen.

// U+0800 - U+0FFF
\xE0\x80\x80

// U+D000 - U+D7FF
\xED\xBF\xBF

// U+10000 -  U+3FFFF
\xF0\x80\x80\x80

// U+100000 - U+10FFFF
\xF4\xBF\xBF\xBF
masakielastisch
quelle
-6

Fuzz Testing - Generieren Sie eine zufällige Folge von Oktetten. Höchstwahrscheinlich erhalten Sie früher als später einige illegale Sequenzen.

shoosh
quelle
7
Es gibt nichts Schlimmeres als Heisenbugs oder Eisentests. Tests bestehen 10 Mal, Sie geben das Produkt frei, Test schlägt fehl.
Eric Duminil
@EricDuminil jemals von srand () gehört?
Shoosh
4
Meinetwegen. Könnten Sie es bitte in der Antwort erwähnen, damit ich meine Ablehnung zurücksetzen kann?
Eric Duminil
2
Ah ah. Nun, es gibt immer etwas Neues zu lernen, deshalb komme ich überhaupt zu SO. Ich denke, Ihr srand()Rat ist eine gute Idee, er könnte anderen Menschen hier helfen.
Eric Duminil
Wir können die ungültigen Zeichenfolgen direkt erstellen. Wir brauchen keine Zufälligkeit, um sie schließlich zu finden, obwohl die Bibliotheken für die Zeichenfolgenverarbeitung (wahrscheinlich!) Für alle Fälle vom Fuzzing profitieren würden.
Galva