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