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?
~𝘈Ḇ𝖢𝕯٤ḞԍНǏ𝙅ƘԸⲘ𝙉০Ρ𝗤Ɍ𝓢ȚЦ𝒱Ѡ𝓧ƳȤѧᖯć𝗱ễ𝑓𝙜Ⴙ𝞲𝑗𝒌ļṃʼnо𝞎𝒒ᵲꜱ𝙩ừ𝗏ŵ𝒙𝒚ź1234567890!@#$%^&*()-_=+[{]};:'",<.>/?
~ АḂ Ⲥ𝗗𝖤𝗙 ꞠꓧȊ𝐉𝜥ꓡ𝑀𝑵Ǭ𝙿𝑄Ŗ𝑆𝒯𝖴𝘝𝘞ꓫŸ𝜡ả𝘢ƀ𝖼ḋếᵮℊ𝙝 кιṃ դ ⱺ𝓅𝘲𝕣𝖘ŧ𝑢ṽẉ𝘅 ყ ž1234567890! @ # $% ^ & * () -_ = + [{]}; : '", <.> /?~Ѧ𝙱ƇᗞΣℱԍҤ١𝔍К𝓛𝓜ƝȎ𝚸𝑄Ṛ𝓢ṮṺƲᏔꓫ𝚈𝚭𝜶Ꮟçძ𝑒𝖿𝗀ḧ𝗂𝐣ҝɭḿ𝕟𝐨𝝔𝕢ṛ𝓼тú𝔳ẃ⤬𝝲𝗓1234567890!@#$%^&*()-_=+[{]};:'",<.>/?
~ 𝖠Β𝒞𝘋𝙴𝓕ĢȞỈ𝕵ꓗʟ𝙼ℕ০𝚸𝗤 Հꓢ ṰǓⅤ𝔚 Ⲭ𝑌𝙕𝘢𝕤Respuestas:
Echa un vistazo a la prueba de esfuerzo del decodificador UTF-8 de Markus Kuhn
fuente
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:
(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:
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:
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:
Datos incorrectos
Por lo tanto, sus datos MALOS deben contener muestras que violen estas diversas prescripciones.
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).
fuente
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
volverse así:
fuente
El artículo UTF-8 de Wikipedia tiene un buen resumen de qué secuencias de bytes son válidas / inválidas. Otro artículo que vale la pena leer es W3C I18N FAQ: Multilingual Forms .
fuente
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
fuente