Итак, у нас есть шпаргалка по XSS для проверки нашей фильтрации XSS - но кроме примера безобидной страницы я не могу найти никаких злонамеренных или искаженных тестовых данных, чтобы убедиться, что мой код UTF-8 может обрабатывать данные с некорректным поведением.
Где я могу найти хорошие ... плохие данные для тестирования? Или что такое хитрая последовательность символов?
~𝘈Ḇ𝖢𝕯٤ḞԍНǏ𝙅ƘԸⲘ𝙉০Ρ𝗤Ɍ𝓢ȚЦ𝒱Ѡ𝓧ƳȤѧᖯć𝗱ễ𝑓𝙜Ⴙ𝞲𝑗𝒌ļṃʼnо𝞎𝒒ᵲꜱ𝙩ừ𝗏ŵ𝒙𝒚ź1234567890!@#$%^&*()-_=+[{]};:'",<.>/?
~ АḂ Ⲥ𝗗𝖤𝗙 ꞠꓧȊ𝐉𝜥ꓡ𝑀𝑵Ǭ𝙿𝑄Ŗ𝑆𝒯𝖴𝘝𝘞ꓫŸ𝜡ả𝘢ƀ𝖼ḋếᵮℊ𝙝 Ꭵ𝕛 кιṃ դ ⱺ𝓅𝘲𝕣𝖘ŧ𝑢ṽẉ𝘅 ყ ž1234567890! @ # $% ^ & * () -_ = + [{]}; : '", <.> /?~Ѧ𝙱ƇᗞΣℱԍҤ١𝔍К𝓛𝓜ƝȎ𝚸𝑄Ṛ𝓢ṮṺƲᏔꓫ𝚈𝚭𝜶Ꮟçძ𝑒𝖿𝗀ḧ𝗂𝐣ҝɭḿ𝕟𝐨𝝔𝕢ṛ𝓼тú𝔳ẃ⤬𝝲𝗓1234567890!@#$%^&*()-_=+[{]};:'",<.>/?
~ 𝖠Β𝒞𝘋𝙴𝓕ĢȞỈ𝕵ꓗʟ𝙼ℕ০𝚸𝗤 Հꓢ ṰǓⅤ𝔚 Ⲭ𝑌𝙕𝘢𝕤Ответы:
Ознакомьтесь с стресс-тестом декодера UTF-8 Маркуса Куна
источник
См. Также Как файлу с китайскими символами известно, сколько байтов использовать на символ? - без сомнения, есть и другие SO-вопросы, которые также могут помочь.
В UTF-8 вы получаете следующие типы байтов:
(Последняя строка выглядит так, как будто она должна читать 0xF0..0xF7; однако 21-битный диапазон Unicode (U + 0000 - U + 10FFFF) означает, что максимальное допустимое значение - 0xF4; значения 0xF5..0xF7 не могут встречаться в действительный UTF-8.)
Проверка того, является ли конкретная последовательность байтов допустимой для UTF-8, означает, что вам нужно подумать о:
В допустимом UTF-8 байты 0xF5..0xFF не могут встречаться.
Неминимальные последовательности
Для некоторых символов существует несколько возможных представлений. Например, символ Unicode U + 0000 (ASCII NUL) может быть представлен следующим образом:
Однако в стандарте Unicode четко указано, что последние три альтернативы неприемлемы, поскольку они не минимальны. Так получилось, что байты 0xC0 и 0xC1 никогда не могут появиться в допустимом UTF-8, потому что единственные символы, которые могут быть закодированы ими, минимально закодированы как однобайтовые символы в диапазоне 0x00..0x7F.
Суррогаты UTF-16
В базовой многоязычной плоскости (BMP) значения Unicode U + D800 - U + DFFF зарезервированы для суррогатов UTF-16 и не могут отображаться в кодировке действительного UTF-8. Если бы они были действительны в UTF-8 (что, я подчеркиваю, нет), то суррогаты были бы закодированы:
Плохие данные
Итак, ваши данные BAD должны содержать образцы, нарушающие эти различные предписания.
Обратите внимание, что метка порядка байтов (BOM) U + FEFF, также известная как неразрывный пробел нулевой ширины (ZWNBSP), не может отображаться незакодированной в UTF-8 - байты 0xFF и 0xFE не разрешены в допустимом UTF-8. Закодированный ZWNBSP может отображаться в файле UTF-8 как 0xEF 0xBB 0xBF, но BOM полностью излишни в UTF-8.
В Юникоде также есть некоторые несимволы . U + FFFE и U + FFFF - два таких несимвола (и последние две кодовые точки в каждой плоскости, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF - другие ). Обычно они не должны появляться в данных Unicode для обмена данными, но могут появляться при частном использовании. См. Ссылку на часто задаваемые вопросы по Unicode для получения множества грязных подробностей, включая довольно сложную историю несимволов в Unicode. ( Исправление № 9: Разъяснение о несимволах , выпущенное в январе 2013 года, делает то, что предполагает его название - разъясняет значение несимволов .)
источник
Вы можете использовать этот удобный онлайн-инструмент от Джеффри Бергамини для преобразования любого текста в действительно странную строку гомоглифов UTF8.
Типичный
стать таким:
источник
В статье Википедии о UTF-8 есть хорошее резюме о том, какие последовательности байтов допустимы / недействительны. Еще одна статья, которую стоит прочитать - W3C I18N FAQ: Multilingual Forms .
источник
С верхней части моей головы:
0xff и 0xfe
Одиночные байты старшего разряда
Многобайтовое представление младших байтовых символов - хороший способ скрыть пустые значения после ранних проверок
Метки порядка байтов - вы собираетесь их игнорировать?
NFC против NFD
источник