Esempio di stringa utf8 non valida?


96

Sto testando il modo in cui alcuni dei miei codici gestiscono dati non validi e ho bisogno di alcune serie di byte che non sono UTF-8 non validi.

Puoi pubblicare alcuni, e idealmente, una spiegazione del perché sono cattivi / dove li hai presi?


Risposte:



50

In PHP:

$examples = array(
    'Valid ASCII' => "a",
    'Valid 2 Octet Sequence' => "\xc3\xb1",
    'Invalid 2 Octet Sequence' => "\xc3\x28",
    'Invalid Sequence Identifier' => "\xa0\xa1",
    'Valid 3 Octet Sequence' => "\xe2\x82\xa1",
    'Invalid 3 Octet Sequence (in 2nd Octet)' => "\xe2\x28\xa1",
    'Invalid 3 Octet Sequence (in 3rd Octet)' => "\xe2\x82\x28",
    'Valid 4 Octet Sequence' => "\xf0\x90\x8c\xbc",
    'Invalid 4 Octet Sequence (in 2nd Octet)' => "\xf0\x28\x8c\xbc",
    'Invalid 4 Octet Sequence (in 3rd Octet)' => "\xf0\x90\x28\xbc",
    'Invalid 4 Octet Sequence (in 4th Octet)' => "\xf0\x28\x8c\x28",
    'Valid 5 Octet Sequence (but not Unicode!)' => "\xf8\xa1\xa1\xa1\xa1",
    'Valid 6 Octet Sequence (but not Unicode!)' => "\xfc\xa1\xa1\xa1\xa1\xa1",
);

Da http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php#54805


4

, ̆ era particolarmente malvagio. Lo vedo combinato su Ubuntu.

virgola-breve


3

L'idea di pattern di sequenze di byte mal formate può essere ricavata dalla tabella delle sequenze di byte ben formate. Vedere " Tabella 3-7. Sequenze di byte UTF-8 ben formate " nello standard Unicode 6.2.

    Code Points    First Byte Second Byte Third Byte Fourth Byte
  U+0000 -   U+007F   00 - 7F
  U+0080 -   U+07FF   C2 - DF    80 - BF
  U+0800 -   U+0FFF   E0         A0 - BF     80 - BF
  U+1000 -   U+CFFF   E1 - EC    80 - BF     80 - BF
  U+D000 -   U+D7FF   ED         80 - 9F     80 - BF
  U+E000 -   U+FFFF   EE - EF    80 - BF     80 - BF
 U+10000 -  U+3FFFF   F0         90 - BF     80 - BF    80 - BF
 U+40000 -  U+FFFFF   F1 - F3    80 - BF     80 - BF    80 - BF
U+100000 - U+10FFFF   F4         80 - 8F     80 - BF    80 - BF

Ecco gli esempi generati da U + 24B62. Li ho usati per una segnalazione di bug: Bug # 65045 mb_convert_encoding interrompe il carattere ben formato

// U+24B62: "\xF0\xA4\xAD\xA2"
"\xF0\xA4\xAD"    ."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"
"\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD\xA2"."\xF0\xA4\xAD"

La semplificazione eccessiva della gamma di byte finali ([0x80, 0xBF]) può essere vista nelle varie librerie.

// U+0800 - U+0FFF
\xE0\x80\x80

// U+D000 - U+D7FF
\xED\xBF\xBF

// U+10000 -  U+3FFFF
\xF0\x80\x80\x80

// U+100000 - U+10FFFF
\xF4\xBF\xBF\xBF

-6

Fuzz Testing: genera una sequenza casuale di ottetti. Molto probabilmente riceverai alcune sequenze illegali prima o poi.


7
Non c'è niente di peggio che avere heisenbugs o eisentest. I test superano 10 volte, rilasci il prodotto, il test fallisce.
Eric Duminil

@EricDuminil mai sentito parlare di srand ()?
shoosh

4
Giusto. Potresti menzionarlo nella risposta in modo da poter annullare il mio voto negativo?
Eric Duminil

2
Ah ah. Beh, c'è sempre qualcosa di nuovo da imparare, ecco perché vengo a SO in primo luogo. Penso che il tuo srand()consiglio sia una buona idea, potrebbe aiutare altre persone qui.
Eric Duminil

Possiamo creare direttamente le stringhe non valide, non abbiamo bisogno della casualità per cercare di trovarle, anche se le librerie di elaborazione delle stringhe trarrebbero (probabilmente!) Beneficio dal fuzz per ogni evenienza.
galva
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.