Datos de prueba de ejemplo de UTF-8 realmente buenos y malos [cerrado]

88

Entonces tenemos la hoja de trucos XSS para probar nuestro filtrado XSS, pero aparte de un ejemplo de página benigna no puedo encontrar ningún dato de prueba malintencionado o mal formado para asegurarme de que mi código UTF-8 pueda manejar datos con mal comportamiento.

¿Dónde puedo encontrar datos buenos uh ... malos para probar? ¿O qué es una secuencia complicada de caracteres?

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

Respuestas:

98

Echa un vistazo a la prueba de esfuerzo del decodificador UTF-8 de Markus Kuhn

zildjohn01
fuente
1
Aunque no pusiste ningún esfuerzo en esto, esa página es justo lo que estaba buscando. ;)
Xeoncross
75
No lo olvide, saber dónde encontrar la respuesta es a menudo tan importante como saber la respuesta.
Jonathan Leffler
19
Les advierto que su prueba se basa en una definición obsoleta de UTF-8, cuando se permitían secuencias de 5 y 6 bytes, antes de que se eliminaran los planos 17 y superiores. E implica que los puntos de código U + FFFE y U + FFFF no son válidos en UTF-8, cuando según el consorcio Unicode no lo son
Simon Kissane
35

Consulte también ¿Cómo sabe un archivo con caracteres chinos cuántos bytes utilizar por carácter? - Sin duda, hay otras preguntas de SO que también ayudarían.

En UTF-8, obtienes los siguientes tipos de bytes:

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 última línea parece que debería leer 0xF0..0xF7; sin embargo, el rango de 21 bits de Unicode (U + 0000 - U + 10FFFF) significa que el valor máximo válido es 0xF4; los valores 0xF5..0xF7 no pueden aparecer en UTF-8 válido.)

Ver si una secuencia particular de bytes es válida UTF-8 significa que debe pensar en:

  • Bytes de continuación que aparecen donde no se esperaba
  • Bytes de no continuación que aparecen donde se espera un byte de continuación
  • Caracteres incompletos al final de la cadena (variación de 'byte de continuación esperado')
  • Secuencias no mínimas
  • Sustitutos UTF-16

En UTF-8 válido, los bytes 0xF5..0xFF no pueden ocurrir.

Secuencias no mínimas

Hay múltiples representaciones posibles para algunos personajes. Por ejemplo, el carácter Unicode U + 0000 (ASCII NUL) podría estar representado por:

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

Sin embargo, el estándar Unicode establece claramente que las últimas tres alternativas no son aceptables porque no son mínimas. Sucede que los bytes 0xC0 y 0xC1 nunca pueden aparecer en UTF-8 válido porque los únicos caracteres que podrían ser codificados por ellos están codificados mínimamente como caracteres de un solo byte en el rango 0x00..0x7F.

Sustitutos UTF-16

Dentro del plano multilingüe básico (BMP), los valores Unicode U + D800 - U + DFFF están reservados para sustitutos UTF-16 y no pueden aparecer codificados en UTF-8 válido. Si fueran válidos en UTF-8 (que, enfatizo, no lo son), entonces los sustitutos estarían codificados:

  • U + D800 - 0xED 0xA0 0x80 (sustituto alto más pequeño)
  • U + DBFF - 0xED 0xAF 0xBF (sustituto alto más grande)
  • U + DC00 - 0xED 0xB0 0x80 (suplente bajo más pequeño)
  • U + DFFF - 0xED 0xBF 0xBF (suplente bajo más grande)

Datos incorrectos

Por lo tanto, sus datos MALOS deben contener muestras que violen estas diversas prescripciones.

  • Byte de continuación no precedido por uno de los valores de byte iniciales
  • Bytes iniciales de varios caracteres no seguidos por suficientes bytes de continuación
  • Caracteres multibyte no mínimos
  • Sustitutos UTF-16
  • Bytes no válidos (0xC0, 0xC1, 0xF5..0xFF).

Tenga en cuenta que una marca de orden de bytes (BOM) U + FEFF, también conocida como espacio sin interrupciones de ancho cero (ZWNBSP), no puede aparecer sin codificar en UTF-8; los bytes 0xFF y 0xFE no están permitidos en UTF-8 válido. Un ZWNBSP codificado puede aparecer en un archivo UTF-8 como 0xEF 0xBB 0xBF, pero el BOM es completamente superfluo en UTF-8.


También hay algunos no caracteres en Unicode. U + FFFE y U + FFFF son dos de estos no caracteres (y los dos últimos puntos de código en cada plano, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF son otros ). Normalmente, estos no deberían aparecer en datos Unicode para el intercambio de datos, pero pueden aparecer en uso privado. Consulte el enlace de preguntas frecuentes sobre Unicode para ver muchos detalles sórdidos, incluida la historia bastante compleja de los no personajes en Unicode. ( Corrigendum # 9: Aclaración sobre los no personajes , que se publicó en enero de 2013, hace lo que sugiere su título: aclara el significado de los no personajes).

Jonathan Leffler
fuente
Gracias por esta gran lista. Planeo revisar cada uno de estos con más detalle ahora.
Xeoncross
3
El comentario de que los no caracteres "no deberían aparecer en datos codificados en UTF-8" es engañoso. Los no caracteres no deben aparecer en los datos codificados en UTF-8 destinados al intercambio abierto , pero, no obstante, deben ser aceptados por los codificadores / decodificadores UTF-8
Simon Kissane
@SimonKissane: Aparentemente, yo era uno de los muchos confundidos por el status quo ante Corrigendum # 9 , que fue publicado en enero de 2013, parece. Vale la pena leer toda la sección de preguntas frecuentes sobre Unicode sobre no personajes . Gracias por la info. (También señalaré que mis comentarios dicen 'debería', lo que está de acuerdo con lo que dice el estándar Unicode (pero no 'dice'); la intención es que no aparezcan en 'intercambio abierto' pero se pueden usar para 'uso interno '.)
Jonathan Leffler
1
@AdrianMaire: Consulte la tabla 3.6 en el Capítulo 3 del estándar Unicode (9.0.0) (número de página 125; p54 del archivo PDF). No estoy seguro de qué otras fuentes está consultando, pero creo que lo que he dicho está cubierto en esa tabla.
Jonathan Leffler
@JonathanLeffler Estás 100% correcto, gracias por la referencia.
Adrian Maire
17

Puede utilizar esta práctica herramienta en línea de Jeffrey Bergamini para convertir cualquier texto en una cadena UTF8 de homoglyphs realmente extraña.

Un típico

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

volverse así:

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

Shebuka
fuente
6
Supongo que se debe a que esto realmente no ayuda a probar UTF8: no obtienes nada cercano al conjunto completo de casos, no hay casos "malos" y el formato no es realmente útil para probar. Es solo una forma de conseguir personajes extraños.
Adrian Maire
¿Lo has probado? Ese generador no es para divertirse. Te da caracteres de la gama completa de UTF-8, y debido a que son extrañamente similares a los personajes reales, puedes 'ver' qué caracteres te están dando problemas. En el ejemplo que publiqué, hay 6 caracteres que mi iPhone representa como signos de interrogación encuadrados.
Shebuka
4
En mi opinión, esta maravillosa herramienta podría haber sido un "valor agregado" muy bueno para una explicación, pero no encaja como una respuesta por sí misma en SO (también porque la página puede estar descontinuada). De todos modos, estoy de acuerdo en que un -1 sin explicación no es muy constructivo.
Adrian Maire
Así que estos son "buenos, buenos datos de prueba de ejemplo de utf-8" ... vale la pena un voto positivo ya que se relacionó, IMO
Rondo
2

La parte superior de mi cabeza:

0xff y 0xfe

Bytes de bits altos únicos

Representación multibyte de caracteres de bajo byte: una buena forma de contrabandear nulos más allá de las primeras comprobaciones

Marcas de orden de bytes: ¿las ignorará?

NFC frente a NFD

Douglas Leeder
fuente