web-dev-qa-db-fra.com

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

Nous avons donc la feuille de triche XSS pour tester notre filtrage XSS - mais autre qu'une exemple de page bénigne Je ne trouve aucune donnée de test malfaisante ou malformée pour m'assurer que mon Le code UTF-8 peut gérer les données de mauvais comportement.

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

79
Xeoncross
91
zildjohn01

Voir aussi Comment un fichier contenant des caractères chinois sait-il combien d'octets utiliser par caractère? - sans aucun doute, il existe d'autres SO questions qui pourraient également aider.

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

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

(La dernière ligne semble lire 0xF0..0xF7; cependant, la plage de 21 bits d'Unicode (U + 0000 - U + 10FFFF) signifie que la valeur maximale valide est 0xF4; les valeurs 0xF5..0xF7 ne peuvent pas apparaître dans UTF-8 valide.)

En regardant si une séquence d'octets particulière est UTF-8 valide, vous devez penser à:

  • Octets de suite apparaissant là où ils n'étaient pas attendus
  • Octets de non-continuation apparaissant là où un octet de continuation est attendu
  • Caractères incomplets à la fin de la chaîne (variation de "l'octet de continuation attendu")
  • Séquences non minimales
  • Substituts UTF-16

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

Séquences non minimales

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

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

Cependant, la norme Unicode indique clairement que les trois dernières alternatives ne sont pas acceptables car elles ne sont pas minimales. Il se trouve que les octets 0xC0 et 0xC1 ne peuvent jamais apparaître en UTF-8 valide car les seuls caractères qui pourraient être codés par ceux-ci sont codés de manière minimale en tant que caractères à octet unique dans la plage 0x00..0x7F.

Substituts UTF-16

Dans le plan multilingue de base (BMP), les valeurs Unicode U + D800 - U + DFFF sont réservées aux substituts UTF-16 et ne peuvent pas apparaître codées en UTF-8 valide. S'ils étaient valides en UTF-8 (ce qui, je le souligne, ils ne le sont pas), les substituts seraient encodés:

  • U + D800 - 0xED 0xA0 0x80 (plus petit substitut élevé)
  • U + DBFF - 0xED 0xAF 0xBF (le plus grand substitut élevé)
  • U + DC00 - 0xED 0xB0 0x80 (plus petit substitut bas)
  • U + DFFF - 0xED 0xBF 0xBF (plus grand substitut bas)

Données incorrectes

Ainsi, vos données BAD doivent contenir des échantillons violant ces différentes prescriptions.

  • Octet de suite non précédé d'une des valeurs d'octet initiales
  • Octets initiaux à plusieurs caractères non suivis par suffisamment d'octets de continuation
  • Caractères multi-octets non minimaux
  • Substituts UTF-16
  • Octets non valides (0xC0, 0xC1, 0xF5..0xFF).

Notez qu'un repère d'ordre des octets (BOM) U + FEFF, alias espace sans interruption de largeur nulle (ZWNBSP), ne peut pas apparaître non codé en UTF-8 - les octets 0xFF et 0xFE ne sont pas autorisés dans UTF-8 valide. Un ZWNBSP codé peut apparaître dans un fichier UTF-8 en tant que 0xEF 0xBB 0xBF, mais la nomenclature est complètement superflue en UTF-8.


Il y a aussi quelques non-caractères en Unicode. U + FFFE et U + FFFF sont deux de ces non-caractères (et les deux derniers points de code dans chaque plan, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF sont d'autres ). Ceux-ci ne devraient normalement pas apparaître dans les données Unicode pour l'échange de données, mais peuvent apparaître dans un usage privé. Voir le lien Unicode FAQ pour de nombreux détails sordides, y compris l'historique plutôt complexe des non-caractères en Unicode. ( Corrigendum # 9: Clarification About Noncharacters , qui a été publié dans Janvier 2013, fait ce que son titre suggère - clarifie le sens des non-caractères.)

33
Jonathan Leffler

Vous pouvez utiliser cet outil en ligne pratique de Jeffrey Bergamini pour convertir n'importe quel texte en une chaîne d'homoglyphes UTF8 vraiment bizarre.

Un typique

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

devenir comme ça:

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

13
Shebuka

article UTF-8 de Wikipedia a un bon résumé des séquences d'octets valides/invalides. Un autre article qui mérite d'être lu est FAQ W3C I18N: formulaires multilingues .

5
Gumbo

Du haut de ma tête:

0xff et 0xfe

Octets à un seul bit élevé

Représentation multi-octets des caractères de faible octet - Un bon moyen de faire passer les valeurs nulles en contrebande après les premières vérifications

Marques d'ordre des octets - Allez-vous les ignorer?

NFC contre NFD

2
Douglas Leeder