Exemple de chaîne utf8 invalide?

96

Je teste comment une partie de mon code gère les mauvaises données, et j'ai besoin de quelques séries d'octets UTF-8 invalides.

Pouvez-vous en publier, et idéalement, une explication de la raison pour laquelle ils sont mauvais / où vous les avez obtenus?

twk
la source

Réponses:

50

En 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",
);

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

philfreo
la source
4

, ̆ était particulièrement mauvais. Je le vois comme combiné sur ubuntu.

virgule

user1015281
la source
3

L'idée de modèles de séquences d'octets mal formées peut être obtenue à partir du tableau des séquences d'octets bien formées. Voir « Tableau 3-7. Séquences d'octets UTF-8 bien formées » dans la norme Unicode 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

Voici les exemples générés à partir de U + 24B62. Je les ai utilisés pour un rapport de bogue: le bogue # 65045 mb_convert_encoding casse un caractère bien formé

// 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"

La simplification excessive de la plage d'octets de fin ([0x80, 0xBF]) peut être vue dans les différentes bibliothèques.

// 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
masakielastic
la source
-6

Fuzz Testing - génère une séquence aléatoire d'octets. Très probablement, vous obtiendrez des séquences illégales tôt ou tard.

shoosh
la source
7
Il n'y a rien de pire que d'avoir des heisenbugs ou des eisentests. Les tests réussissent 10 fois, vous libérez le produit, le test échoue.
Eric Duminil
@EricDuminil a déjà entendu parler de srand ()?
shoosh
4
C'est suffisant. Pourriez-vous le mentionner dans la réponse pour que je puisse revenir sur mon vote défavorable?
Eric Duminil
2
Ah ah. Eh bien, il y a toujours quelque chose de nouveau à apprendre, c'est pourquoi j'en viens à SO en premier lieu. Je pense que votre srand()conseil est une bonne idée, cela pourrait aider d'autres personnes ici.
Eric Duminil
Nous pouvons créer les chaînes non valides directement, nous n'avons pas besoin du hasard pour essayer de les trouver, bien que les bibliothèques de traitement de chaînes bénéficieraient (probablement!) Du fuzzing au cas où.
galva