Java: обнаружение управляющих символов, которые не соответствуют JSON - PullRequest
15 голосов
/ 19 мая 2011

Я заново изобретаю колесо и создаю свои собственные методы синтаксического анализа JSON в Java.

Я собираюсь (очень приятно!) Документация на json.org .Единственная часть, в которой я не уверен, это где "или управляющий символ"

Поскольку документация настолько ясна, а JSON настолько прост и легко реализуемЯ подумал, что я бы пошел дальше и потребовал бы спецификацию вместо того, чтобы быть свободным.

Как мне правильно убрать управляющие символы в Java?Возможно, есть диапазон Юникода?

enter image description here


Редактировать: A (обычно?) Недостающий кусок головоломки

I было сообщено что есть другие управляющие символы за пределами определенного диапазона 1 2 , которые могут вызывать затрудненияв тегах <script>.

В первую очередь это символы U + 2028 и U + 2029, разделитель строк и абзацев, которые действуют как символы новой строки.Введение новой строки в середину строкового литерала, скорее всего, вызовет синтаксическую ошибку (неопределенный строковый литерал). 3

Хотя я считаю, что это не представляет угрозы XSS, все же хорошая идея добавить дополнительные правила для использования в <script>теги.

  • Просто будьте просты и закодируйте все не-ASCII-печатаемые символы с пометкой \u.Эти персонажи необычны для начала.Если хотите, вы можете добавить в белый список, но я рекомендую использовать белый список.
  • Если вы не знаете, не забывайте о </script (без учета регистра), что может привести к внедрению HTML-скрипта на вашу страницу с символами </script><script src=http://tinyurl.com/abcdef>.Ни один из этих символов по умолчанию не кодируется в JSON.

Ответы [ 4 ]

7 голосов
/ 19 мая 2011

Будет Character.isISOControl (...) делать?Кстати, UTF-16 - это кодировка кодовых точек Unicode ... Вы собираетесь работать на уровне байтов или на уровне символов / кодов?Я рекомендую оставить отображение из UTF-16 в символьные потоки в основные API Java ...

6 голосов
/ 19 мая 2011

Даже если это не очень конкретно, я бы предположил, что они относятся к «управляющей» категории символов из спецификации Unicode.

В Java вы можете проверить, является ли символ c управляющим символом Unicode со следующим выражением: Character.getType(c) == Character.CONTROL.

4 голосов
/ 19 мая 2011

Я считаю, определение управляющего символа в Юникоде :

65 символов в диапазонах U + 0000..U + 001F и U + 007F..U + 009F.

Это их определение контрольного кода , но за вышеизложенным следует предложение "Также известный как контрольные символы." , поэтому ...

3 голосов
/ 08 июля 2016

Я знаю, что вопрос задавался пару лет назад, но я все равно отвечаю, потому что принятый ответ неверен.

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...