Dados de teste de exemplo UTF-8 realmente bons, ruins [fechado]

88

Portanto, temos a folha de dicas XSS para testar nossa filtragem XSS - mas, além de uma página benigna de exemplo, não consigo encontrar nenhum dado de teste maligno ou malformado para ter certeza de que meu código UTF-8 pode lidar com dados de comportamento incorreto.

Onde posso encontrar alguns dados uh .. ruins para testar? Ou o que é uma sequência complicada de caracteres?

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

Respostas:

98

Confira o teste de estresse do decodificador UTF-8 de Markus Kuhn

zildjohn01
fonte
1
Embora você não tenha feito nenhum esforço nisso - aquela página é exatamente o que eu estava procurando. ;)
Xeoncross
73
Não se esqueça, saber onde encontrar a resposta geralmente é tão importante quanto saber a resposta.
Jonathan Leffler
19
Eu avisaria que seu teste é baseado em uma definição desatualizada de UTF-8, quando sequências de 5 e 6 bytes eram permitidas, antes que os planos 17 e acima fossem excluídos. E isso implica que os pontos de código U + FFFE e U + FFFF são inválidos em UTF-8, quando pelo consórcio Unicode eles não são
Simon Kissane
34

Consulte também Como um arquivo com caracteres chineses sabe quantos bytes usar por caractere? - sem dúvida, há outras perguntas do SO que também ajudariam.

Em UTF-8, você obtém os seguintes 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

(A última linha parece que deveria ser 0xF0..0xF7; no entanto, o intervalo de 21 bits do Unicode (U + 0000 - U + 10FFFF) significa que o valor máximo válido é 0xF4; os valores 0xF5..0xF7 não podem ocorrer em UTF-8 válido.)

Verificar se uma determinada sequência de bytes é UTF-8 válida significa que você precisa pensar sobre:

  • Bytes de continuação aparecendo onde não eram esperados
  • Byte de não continuação aparecendo onde um byte de continuação é esperado
  • Caracteres incompletos no final da string (variação de 'byte de continuação esperado')
  • Sequências não mínimas
  • UTF-16 substitutos

Em UTF-8 válido, os bytes 0xF5..0xFF não podem ocorrer.

Sequências não mínimas

Existem várias representações possíveis para alguns personagens. Por exemplo, o caractere Unicode U + 0000 (ASCII NUL) pode ser representado por:

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

No entanto, o padrão Unicode afirma claramente que as três últimas alternativas não são aceitáveis ​​porque não são mínimas. Acontece que os bytes 0xC0 e 0xC1 nunca podem aparecer em UTF-8 válido porque os únicos caracteres que poderiam ser codificados por eles são minimamente codificados como caracteres de byte único no intervalo 0x00..0x7F.

UTF-16 Surrogates

Dentro do plano multilingue básico (BMP), os valores Unicode U + D800 - U + DFFF são reservados para substitutos UTF-16 e não podem aparecer codificados em UTF-8 válido. Se fossem válidos em UTF-8 (o que, enfatizo, não são), os substitutos seriam codificados:

  • U + D800 - 0xED 0xA0 0x80 (menor substituto alto)
  • U + DBFF - 0xED 0xAF 0xBF (maior substituto alto)
  • U + DC00 - 0xED 0xB0 0x80 (menor substituto baixo)
  • U + DFFF - 0xED 0xBF 0xBF (maior substituto baixo)

Dados ruins

Portanto, seus dados BAD devem conter amostras que violem essas várias prescrições.

  • Byte de continuação não precedido por um dos valores de byte iniciais
  • Bytes iniciais de vários caracteres não seguidos por bytes de continuação suficientes
  • Caracteres multibyte não mínimos
  • UTF-16 substitutos
  • Bytes inválidos (0xC0, 0xC1, 0xF5..0xFF).

Observe que uma marca de ordem de byte (BOM) U + FEFF, também conhecida como espaço no-break de largura zero (ZWNBSP), não pode aparecer sem codificação em UTF-8 - os bytes 0xFF e 0xFE não são permitidos em UTF-8 válido. Um ZWNBSP codificado pode aparecer em um arquivo UTF-8 como 0xEF 0xBB 0xBF, mas o BOM é completamente supérfluo em UTF-8.


Existem também alguns não caracteres em Unicode. U + FFFE e U + FFFF são dois desses não-caracteres (e os últimos dois pontos de código em cada plano, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF são outros ) Normalmente, eles não devem aparecer em dados Unicode para troca de dados, mas podem aparecer em uso privado. Veja o link de FAQ do Unicode para muitos detalhes sórdidos, incluindo a história bastante complexa de não caracteres em Unicode. ( Corrigenda nº 9: Esclarecimento sobre não caracteres , lançada em janeiro de 2013, faz o que o título sugere - esclarece o significado dos não caracteres.)

Jonathan Leffler
fonte
Obrigado por esta ótima lista. Pretendo verificar cada um deles com mais detalhes agora.
Xeoncross
3
O comentário de que não-caracteres "não devem aparecer em dados codificados em UTF-8" é enganoso. Não-caracteres não devem aparecer em dados codificados em UTF-8 destinados ao intercâmbio aberto , mas, mesmo assim, devem ser aceitos pelos codificadores / decodificadores UTF-8
Simon Kissane
@SimonKissane: Aparentemente, eu era um dos muitos confusos com o status quo ante Rectificação nº 9 , que foi lançado em janeiro de 2013, ao que parece. Vale a pena ler toda a seção do FAQ Unicode sobre não caracteres . Obrigado pela informação. (Também notarei que meus comentários dizem 'deveria', o que está de acordo com o que o padrão Unicode disse (mas não 'diz'); a intenção é que eles não apareçam em 'intercâmbio aberto', mas podem ser usados ​​para 'uso interno '.)
Jonathan Leffler
1
@AdrianMaire: Consulte a tabela 3.6 no Capítulo 3 do padrão Unicode (9.0.0) (página número 125; p54 do arquivo PDF). Não tenho certeza de quais outras fontes você está consultando, mas acho que o que eu disse está coberto nessa tabela.
Jonathan Leffler,
@JonathanLeffler Você está 100% correto, Obrigado pela referência.
Adrian Maire,
17

Você pode usar esta ferramenta online útil de Jeffrey Bergamini para converter qualquer texto em uma string UTF8 realmente estranha de homoglifos.

Um típico

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

fique assim:

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

Shebuka
fonte
6
Suponho que seja porque isso realmente não ajuda a testar UTF8: você não obtém nada perto do conjunto completo de casos, não há casos "ruins" e o formato não é realmente útil para o teste. É apenas uma forma de obter personagens estranhos.
Adrian Maire,
Tentaste? Esse gerador não é para diversão. Ele fornece caracteres de uma gama UTF-8 completa e, como eles são estranhamente semelhantes aos personagens reais, você pode 'ver' quais caracteres estão causando problemas. No exemplo que postei, há 6 caracteres que meu iPhone processa como pontos de interrogação em caixas.
Shebuka,
4
IMO, esta ferramenta maravilhosa poderia ter sido um "valor agregado" muito bom para uma explicação, mas não se encaixa como uma resposta por si só no SO (também porque a página pode ser descontinuada). De qualquer forma, concordo que -1 sem explicação não é muito construtivo.
Adrian Maire,
Portanto, estes são "dados de teste de utf-8 bons, bons" ... vale uma votação positiva, pois está relacionado, IMO
Rondo
2

Em cima da minha cabeça:

0xff e 0xfe

Bytes únicos de alto bit

Representação multibyte de caracteres de byte baixo - uma boa maneira de contrabandear nulos após verificações iniciais

Marcas de ordem de bytes - você vai ignorá-las?

NFC vs. NFD

Douglas Leeder
fonte