Exemple de données de test UTF-8 vraiment bonnes, mauvaises [fermé]

88

Nous avons donc la feuille de triche XSS pour tester notre filtrage XSS - mais à part un exemple de page bénigne, je ne trouve pas de données de test malfaisantes ou mal formées pour m'assurer que mon code UTF-8 peut gérer des données erronées.

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

Xeoncross
la source
4
columbia.edu/kermit/utf8.html est un autre bon
Xeoncross
14
ăѣ𝔠 ծ ềſģȟ Ꭵ𝒋 ǩľḿꞑȯ𝘱𝑞𝗋𝘴ȶ𝞄𝜈ψ𝒙𝘆𝚣1234567890! @ # $% ^ & * () -_ = + [{]} ;: '", <.> /? ~𝘈Ḇ𝖢𝕯٤ḞԍНǏ𝙅ƘԸⲘ𝙉০Ρ𝗤Ɍ𝓢ȚЦ𝒱Ѡ𝓧ƳȤѧᖯć𝗱ễ𝑓𝙜Ⴙ𝞲𝑗𝒌ļṃʼnо𝞎𝒒ᵲꜱ𝙩ừ𝗏ŵ𝒙𝒚ź1234567890!@#$%^&*()-_=+[{]};:'",<.>/?~ АḂ Ⲥ𝗗𝖤𝗙 ꞠꓧȊ𝐉𝜥ꓡ𝑀𝑵Ǭ𝙿𝑄Ŗ𝑆𝒯𝖴𝘝𝘞ꓫŸ𝜡ả𝘢ƀ𝖼ḋếᵮℊ𝙝 Ꭵ𝕛 кιṃ դ ⱺ𝓅𝘲𝕣𝖘ŧ𝑢ṽẉ𝘅 ყž1234567890! @ # $% ^ & * () -_ = + [{]}; : '", <.> /? ~Ѧ𝙱ƇᗞΣℱԍҤ١𝔍К𝓛𝓜ƝȎ𝚸𝑄Ṛ𝓢ṮṺƲᏔꓫ𝚈𝚭𝜶Ꮟçძ𝑒𝖿𝗀ḧ𝗂𝐣ҝɭḿ𝕟𝐨𝝔𝕢ṛ𝓼тú𝔳ẃ⤬𝝲𝗓1234567890!@#$%^&*()-_=+[{]};:'",<.>/?~ 𝖠Β𝒞𝘋𝙴𝓕ĢȞỈ𝕵ꓗʟ𝙼ℕ০𝚸𝗤 Հꓢ ṰǓⅤ𝔚 Ⲭ𝑌𝙕𝘢𝕤
Andrew

Réponses:

98

Découvrez le test de résistance du décodeur UTF-8 de Markus Kuhn

zildjohn01
la source
1
Bien que vous n'ayez fait aucun effort, cette page est exactement ce que je recherchais. ;)
Xeoncross
73
N'oubliez pas, savoir où trouver la réponse est souvent aussi important que de connaître la réponse.
Jonathan Leffler
19
Je vous préviens que son test est basé sur une définition obsolète de l'UTF-8, lorsque les séquences de 5 et 6 octets étaient autorisées, avant la suppression des avions 17 et plus. Et cela implique que les points de code U + FFFE et U + FFFF ne sont pas valides dans UTF-8, alors que, selon le consortium Unicode, ils ne le sont pas
Simon Kissane
34

Voir aussi Comment un fichier contenant des caractères chinois sait-il combien d'octets utiliser par caractère?- sans aucun doute, il y a d'autres questions SO 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 devoir 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.)

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

  • Octets de continuation 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 'octet de continuation attendu')
  • Séquences non minimales
  • Substituts UTF-16

En UTF-8 valide, les octets 0xF5..0xFF ne peuvent pas apparaître.

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 dans un UTF-8 valide car les seuls caractères qui pourraient être codés par ceux-ci sont au minimum codés en tant que caractères à un octet 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), alors les substituts seraient encodés:

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

Mauvaises données

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

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

Notez qu'une marque d'ordre d'octet (BOM) U + FEFF, alias espace sans coupure de largeur zéro (ZWNBSP), ne peut pas apparaître non codée en UTF-8 - les octets 0xFF et 0xFE ne sont pas autorisés en UTF-8 valide. Un ZWNBSP codé peut apparaître dans un fichier UTF-8 sous le nom 0xEF 0xBB 0xBF, mais la nomenclature est complètement superflue en UTF-8.


Il existe également des 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 FAQ Unicode pour de nombreux détails sordides, y compris l'histoire assez complexe des non-caractères en Unicode. (Le rectificatif n ° 9: Clarification sur les non-personnages, publié en janvier 2013, fait ce que son titre suggère - clarifie la signification des non-caractères.)

Jonathan Leffler
la source
Merci pour cette belle liste. Je prévois de vérifier chacun de ces éléments plus en détail maintenant.
Xeoncross
3
Le commentaire selon lequel les non-caractères "ne devraient pas apparaître dans les données encodées en UTF-8" est trompeur. Les non-caractères ne doivent pas apparaître dans les données encodées en UTF-8 destinées à un échange ouvert , mais doivent
Simon Kissane
@SimonKissane: Apparemment, j'étais l'un des nombreux confus par le statu quo ante corrigendum n ° 9 , qui a été publié en janvier 2013, semble-t-il. Toute la section de la FAQ Unicode sur les non -caractères vaut la peine d'être lue. Merci pour l'info. (Je noterai également que mes commentaires disent `` devrait '', ce qui est en accord avec ce que dit la norme Unicode (mais pas `` dit ''); l'intention est qu'ils ne doivent pas apparaître dans un `` échange ouvert '' mais peuvent être utilisés pour un `` usage interne '' '.)
Jonathan Leffler
1
@AdrianMaire: Voir le tableau 3.6 au chapitre 3 de la norme Unicode (9.0.0) (numéro de page 125; p54 du fichier PDF). Je ne sais pas quelles autres sources vous consultez, mais je pense que ce que j'ai dit est couvert dans ce tableau.
Jonathan Leffler
@JonathanLeffler Vous avez raison à 100%, merci pour la référence.
Adrian Maire
17

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

Un typique

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

devenir comme ça:

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

Shebuka
la source
6
Je suppose que c'est parce que cela n'aide pas vraiment à tester UTF8: vous n'obtenez rien de proche de l'ensemble complet des cas, il n'y a pas de "mauvais" cas et le format n'est pas vraiment utile pour les tests. Ce n'est qu'un moyen d'obtenir des personnages étranges.
Adrian Maire
L'as tu essayé? Ce générateur n'est pas pour le plaisir. Il vous donne des caractères de la gamme UTF-8 complète, et comme ils sont étrangement similaires aux caractères réels, vous pouvez «voir» quels caractères vous posent des problèmes. Dans l'exemple, j'ai posté 6 caractères que mon iPhone rend sous forme de points d'interrogation encadrés.
Shebuka
4
OMI, ce merveilleux outil aurait pu être une très belle "valeur ajoutée" à une explication, mais ne rentre pas comme une réponse en soi dans SO (aussi parce que la page peut être interrompue). Quoi qu'il en soit, je suis d'accord qu'un -1 sans explication n'est pas très constructif.
Adrian Maire
Donc, ce sont "bonnes, bonnes données de test d'exemple utf-8" ... vaut un vote positif en ce qui concerne, IMO
Rondo
2

Du haut de ma tête:

0xff et 0xfe

Octets simples à bits élevés

Représentation multi-octets des caractères à faible octet - Un bon moyen de passer en contrebande des valeurs nulles après les premiers contrôles

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

NFC contre NFD

Douglas Leeder
la source