Джава:обнаружить управляющие символы, которые не подходят для JSON
-
15-11-2019 - |
Вопрос
Я изобретаю велосипед и создаю свои собственные методы анализа JSON на Java.
Я руководствуюсь (очень хорошей!) документацией по json.org.Единственное, в чем я не уверен, это где написано "или управляющий персонаж"
Поскольку документация очень понятна, а JSON настолько прост и легок в реализации, я решил пойти дальше и потребовать спецификацию, а не быть свободной.
Как бы я правильно удалить управляющие символы в Java?Возможно, есть диапазон Юникода?
Редактировать:Недостающая (часто?) часть головоломки
я были проинформированы что помимо определенный диапазон 1 2 это может быть проблематично в <script>
теги.
В частности, символы U+2028 и U+2029, разделитель строк и абзацев, которые действуют как символы новой строки.Вставка новой строки в середину строкового литерала, скорее всего, приведет к синтаксической ошибке (незавершаемый строковый литерал). 3
Хотя я считаю, что это не представляет угрозы XSS, все же хорошей идеей будет добавить дополнительные правила для использования в <script>
теги.
- Просто будьте проще и кодируйте все символы, не входящие в «ASCII-печать», с помощью
\u
обозначения.Эти персонажи изначально необычны.Если хотите, вы можете добавить в белый список, но я рекомендую подход с использованием белого списка. - Если вы не в курсе, не забудь о
</script
(без учета регистра), что может привести к внедрению HTML-скрипта на вашу страницу с персонажами</script><script src=http://tinyurl.com/abcdef>
.Ни один из этих символов по умолчанию не закодирован в JSON.
Решение
Воля Персонаж.isISOControl(...) делать?Кстати, UTF-16 — это кодировка кодовых точек Unicode...Собираетесь ли вы работать на уровне байтов или на уровне символов/кодовых точек?Я рекомендую оставить отображение UTF-16 на потоки символов в основных API Java...
Другие советы
Даже если это не очень конкретно, я бы предположил, что они относятся к категория символов «управление» из спецификации Unicode.
В Java вы можете проверить, является ли символ c
— это управляющий символ Юникода со следующим выражением: Character.getType(c) == Character.CONTROL
.
Я считаю определение управляющего символа в Юникоде является:
65 символов в диапазонах U+0000..U+001F и U+007F..U+009F.
Это их определение контрольный код, но за этим следует предложение «Также известны как управляющие персонажи»., так...
Я знаю, что вопрос был задан пару лет назад, но я все равно отвечаю, потому что принятый ответ неверен.
Character.isISOControl(int codePoint)
выполняет следующую проверку:
(codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F);
Спецификация JSON определяет https://tools.ietf.org/html/rfc7159:
Струны
Представление строк аналогично конвенциям, используемым в семействе C -языках программирования.Строка начинается и заканчивается кавычками.Все символы Unicode могут быть размещены в кавычках, за исключением символов, которые должны быть сбежаны:кавычка, обратная солидус и управляющие символы (U+0000 через U+001F).
Character.isISOControl(int codePoint)
пометит все символы, которые необходимо экранировать (U+0000-U+001F)
, хотя он также будет отмечать символы, которые не нужно экранировать (U+007F-U+009F)
.Экранирование символов не требуется (U+007F-U+009F)
.