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?
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 à:
En UTF-8 valide, les octets 0xF5..0xFF ne peuvent pas se produire.
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.
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:
Ainsi, vos données BAD doivent contenir des échantillons violant ces différentes prescriptions.
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.)
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:
Ḽơᶉëᶆ ȋṕšᶙṁ ḍỡḽǭᵳ ʂǐť ӓṁệẗ, ĉṓɲṩḙċťᶒțûɾ ấɖḯƥĭṩčįɳġ ḝłįʈ, șếᶑ ᶁⱺ ẽḭŭŝḿꝋď ṫĕᶆᶈṓɍ ỉñḉīḑȋᵭṵńť ṷŧ ḹẩḇőꝛế éȶ đꝍꞎôꝛȇ ᵯáꞡᶇā ąⱡîɋṹẵ.
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 .
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?