Dati di test di esempio UTF-8 davvero buoni, cattivi [chiusi]


88

Quindi abbiamo il cheat sheet XSS per testare il nostro filtro XSS, ma a parte una pagina benigna di esempio non riesco a trovare dati di test malvagi o malformati per assicurarmi che il mio codice UTF-8 possa gestire dati che si comportano male.

Dove posso trovare dei buoni uh .. cattivi dati con cui testare? O cos'è una sequenza complicata di caratteri?




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

Risposte:


98

1
Anche se non hai fatto alcuno sforzo in questo, quella pagina è proprio quello che stavo cercando. ;)
Xeoncross

75
Non dimenticare, sapere dove trovare la risposta è spesso importante quanto conoscere la risposta.
Jonathan Leffler

19
Ti avverto che il suo test si basa su una definizione obsoleta di UTF-8, quando erano consentite sequenze di 5 e 6 byte, prima che gli aerei 17 e superiori fossero eliminati. E implica che i punti di codice U + FFFE e U + FFFF non sono validi in UTF-8, quando per il consorzio Unicode non lo sono
Simon Kissane

35

Vedi anche Come fa un file con caratteri cinesi a sapere quanti byte usare per carattere? - senza dubbio, ci sono anche altre domande SO che potrebbero aiutare.

In UTF-8, ottieni i seguenti tipi di byte:

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

(L'ultima riga sembra che dovrebbe leggere 0xF0..0xF7; tuttavia, l'intervallo di 21 bit di Unicode (U + 0000 - U + 10FFFF) significa che il valore massimo valido è 0xF4; i valori 0xF5..0xF7 non possono verificarsi in valido UTF-8.)

Controllare se una particolare sequenza di byte è valida UTF-8 significa che devi pensare a:

  • Byte di continuazione che compaiono dove non previsto
  • Byte di non continuazione che appaiono dove è previsto un byte di continuazione
  • Caratteri incompleti alla fine della stringa (variazione di "byte di continuazione previsto")
  • Sequenze non minime
  • Surrogati UTF-16

In UTF-8 valido, i byte 0xF5..0xFF non possono verificarsi.

Sequenze non minime

Esistono più rappresentazioni possibili per alcuni personaggi. Ad esempio, il carattere Unicode U + 0000 (ASCII NUL) potrebbe essere rappresentato da:

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

Tuttavia, lo standard Unicode afferma chiaramente che le ultime tre alternative non sono accettabili perché non sono minime. Accade così che i byte 0xC0 e 0xC1 non possano mai apparire in UTF-8 valido perché gli unici caratteri che potrebbero essere codificati da questi sono codificati minimamente come caratteri a byte singolo nell'intervallo 0x00..0x7F.

UTF-16 surrogati

All'interno del Basic Multi-lingual Plane (BMP), i valori Unicode U + D800 - U + DFFF sono riservati ai surrogati UTF-16 e non possono essere codificati in UTF-8 valido. Se fossero validi in UTF-8 (che, sottolineo, non lo sono), allora i surrogati sarebbero codificati:

  • U + D800 - 0xED 0xA0 0x80 (surrogato più piccolo alto)
  • U + DBFF - 0xED 0xAF 0xBF (surrogato alto più grande)
  • U + DC00 - 0xED 0xB0 0x80 (surrogato basso più piccolo)
  • U + DFFF - 0xED 0xBF 0xBF (surrogato basso più grande)

Cattivi dati

Quindi, i tuoi dati BAD dovrebbero contenere campioni che violano queste varie prescrizioni.

  • Byte di continuazione non preceduto da uno dei valori di byte iniziali
  • Byte iniziali di più caratteri non seguiti da byte di continuazione sufficienti
  • Caratteri multibyte non minimi
  • Surrogati UTF-16
  • Byte non validi (0xC0, 0xC1, 0xF5..0xFF).

Si noti che un contrassegno di ordine dei byte (BOM) U + FEFF, noto anche come spazio senza interruzioni di larghezza zero (ZWNBSP), non può apparire non codificato in UTF-8: i byte 0xFF e 0xFE non sono consentiti in UTF-8 valido. Uno ZWNBSP codificato può apparire in un file UTF-8 come 0xEF 0xBB 0xBF, ma la distinta componenti è completamente superflua in UTF-8.


Ci sono anche alcuni non caratteri in Unicode. U + FFFE e U + FFFF sono due di questi non caratteri (e gli ultimi due punti di codice in ciascun piano, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF sono altri ). Normalmente non dovrebbero apparire nei dati Unicode per lo scambio di dati, ma possono apparire in uso privato. Vedi il collegamento FAQ Unicode per molti sordidi dettagli, inclusa la storia piuttosto complessa dei non caratteri in Unicode. ( Corrigendum # 9: Clarification About Noncharacters , che è stato rilasciato nel gennaio 2013, fa quello che suggerisce il titolo - chiarisce il significato dei non-personaggi.)


Grazie per questo fantastico elenco. Ho intenzione di controllare ciascuno di questi in modo più dettagliato ora.
Xeoncross

3
Il commento secondo cui i non caratteri "non dovrebbero apparire nei dati codificati UTF-8" è fuorviante. I non caratteri non dovrebbero apparire nei dati codificati UTF-8 destinati allo scambio aperto , ma comunque dovrebbero essere accettati dai codificatori / decodificatori UTF-8
Simon Kissane

@ SimonKissane: A quanto pare, sono stato uno dei tanti confusi dallo status quo ante Corrigendum # 9 , che è stato rilasciato nel gennaio 2013, a quanto pare. Vale la pena leggere l'intera sezione delle FAQ Unicode sui non caratteri . Grazie per le informazioni. (Noterò anche che i miei commenti dicono "dovrebbe" che concorda con ciò che dice lo standard Unicode (ma non "dice"); l'intenzione è che non dovrebbero apparire in "scambio aperto" ma possono essere usati per "uso interno '.)
Jonathan Leffler

1
@AdrianMaire: vedere la tabella 3.6 nel capitolo 3 dello standard Unicode (9.0.0) (numero di pagina 125; p54 del file PDF). Non sono sicuro di quali altre fonti stai consultando, ma penso che quello che ho detto sia coperto in quella tabella.
Jonathan Leffler

@JonathanLeffler Hai ragione al 100%, grazie per il riferimento.
Adrian Maire

17

Puoi utilizzare questo pratico strumento online di Jeffrey Bergamini per convertire qualsiasi testo in una strana stringa UTF8 di omoglifi.

Un tipico

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

diventare così:

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


6
Suppongo che sia perché questo non aiuta a testare UTF8: non si ottiene nulla di simile all'intero set di casi, non ci sono casi "cattivi" e il formato non è molto utile per i test. È solo un modo per ottenere strani personaggi.
Adrian Maire

L'hai provato? Quel generatore non è per divertimento. Ti dà caratteri dell'intera gamma UTF-8 e poiché sono stranamente simili ai caratteri reali puoi "vedere" quali caratteri ti stanno dando problemi. Nell'esempio che ho pubblicato ci sono 6 caratteri che il mio iPhone rende come punti interrogativi in ​​scatola.
Shebuka

4
IMO, questo meraviglioso strumento avrebbe potuto essere un simpaticissimo "Valore aggiunto" a una spiegazione, ma non si adatta da solo come risposta in SO (anche perché la pagina potrebbe essere interrotta). Comunque, sono d'accordo che un -1 senza spiegazione non è molto costruttivo.
Adrian Maire

Quindi questo è "buoni, buoni dati di test di esempio utf-8" ... vale la pena un voto positivo in quanto correlato, IMO
Rondo


2

Fuori dalla mia testa:

0xff e 0xfe

Byte singoli ad alto bit

Rappresentazione multibyte di caratteri a basso byte: un buon modo per contrabbandare i valori nulli dopo i primi controlli

Contrassegni per byte: li ignorerai?

NFC contro NFD

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.