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:

  1. Строка

    Представление строк аналогично соглашениям, используемым в C семейство языков программирования. Строка начинается и заканчивается кавычки. Все символы Юникода могут быть помещены в кавычки, за исключением символов, которые должны быть экранированы: кавычки, обратного солидуса и управляющих символов (U + 0000 через U + 001F).

Character.isISOControl(int codePoint) 

будет отмечать все символы, которые должны быть экранированы (U+0000-U+001F), хотя он также будет отмечать символы, которые не должны быть экранированы (U+007F-U+009F). Не требуется избегать символов (U+007F-U+009F).