102 votes

Vraiment bien, mauvais exemple de données de test UTF-8

Nous avons donc la feuille de triche XSS pour tester notre filtrage XSS - mais à part un exemple de page bénigne, je ne peux trouver aucune donnée de test mal ou mal formée pour être sûr que mon code UTF-8 peut gérer des données erronées.

Où puis-je trouver de bonnes données euh .. mauvaises à tester? Ou qu'est-ce qu'une séquence de caractères délicate?

102voto

zildjohn01 Points 6173

41voto

Jonathan Leffler Points 299946

Voir aussi Comment un fichier avec des caractères Chinois connaître le nombre d'octets à utiliser par caractère? - sans doute, il y a d'autres DONC des questions qui pourraient également aider.

En UTF-8, vous obtenez les types suivants d'octets:

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation characters (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

(La dernière ligne semble que si il faut lire 0xF0..0xF7; cependant, le 21 bits gamme d'Unicode (U+0000 À U+10FFFF) signifie que le maximum de la valeur valide est 0xF4; les valeurs 0xF5..0xF7 ne peut pas se produire en UTF-8 valide.)

Cherchez à savoir si une séquence particulière d'octets UTF-8 valide signifie que vous devez penser:

  • Continuation octets apparaissant là où ne l'attend pas
  • Non-poursuite octets apparaissant où une suite d'octets qui est attendu
  • Incomplet des personnages à la fin de la chaîne (la variation de la suite 'octet attendu")
  • Non-minimale séquences
  • UTF-16 mères porteuses

En UTF-8 valide, les octets 0xF5..0xFF ne peut pas se produire.

Non-minimale séquences

Il y a plusieurs représentations possibles pour certains personnages. Par exemple, le caractère Unicode U+0000 (ASCII NUL) peut être représenté par:

0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80

Cependant, le standard Unicode stipule clairement que les trois dernières options ne sont pas acceptables parce qu'elles ne sont pas minimes. Il se trouve que les octets 0xC0 et 0xC1 ne peut jamais apparaître en UTF-8 valide parce que les seuls caractères qui peut être codé par ceux qui sont peu codé comme un octet dans la gamme 0x00..0x7F.

UTF-16 mères porteuses

Au sein de la Base multilingue Plane (BMP), les valeurs Unicode U+D800 - U+DFFF sont réservés pour l'UTF-16 de mères porteuses et ne peut pas apparaître encodé en UTF-8 valide.

Les Données De Mauvaise Qualité

Donc, votre MAUVAISE de données doit contenir des échantillons de violation de ces différentes prescriptions.

  • La poursuite de l'octet non précédé de l'une des premières valeurs d'octets
  • Multi-caractère initial d'octets n'est pas suivie par un nombre suffisant de poursuite octets
  • Non-minimal de caractères multi-octets
  • UTF-16 mères porteuses
  • Non valide octets (0xC0, 0xC1, 0xF5..0xFF).

Notez qu'une marque d'ordre d'octet ne peut pas apparaître non encodée en UTF-8 - les octets 0xFF et 0xFE ne sont pas autorisés en UTF-8 valide. Une codé zéro-largeur de l'espace insécable (U+FFFE) peuvent apparaître dans un fichier UTF-8 comme 0xEF 0xBB 0xBF. Mais la NOMENCLATURE est complètement inutile en UTF-8.


Il y a aussi quelques non-caractères. U+FFFF en est un exemple; U+FFFE en est une autre. Ceux-ci devraient normalement pas apparaître dans les données Unicode pour l'échange de données, mais peut apparaître à usage privé. Voir l'Unicode lien de la FAQ pour beaucoup de détails sordides, y compris le complexe de l'histoire de la non-caractères Unicode.

4voto

Gumbo Points 279147

L'article de Wikipedia sur UTF-8 résume bien les séquences d'octets valides / invalides. Un autre article qui mérite d'être lu est la FAQ du W3C I18N: Formulaires multilingues .

2voto

Douglas Leeder Points 29986

Du haut de ma tête:

0xff et 0xfe

Octets de poids fort simples

Représentation multi-octets de caractères octets faibles - Un bon moyen de passer en contrebande supprime les premiers contrôles

Byte-order marks - Allez-vous les ignorer?

NFC vs NFD

-1voto

Alexander Kjäll Points 1742

Automatisez-le, écrivez quelque chose qui génère une séquence de bits aléatoires et passez-le dans votre code.

Il est assez difficile de penser manuellement à tous les cas délicats.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X