Джава:обнаружить управляющие символы, которые не подходят для JSON

StackOverflow https://stackoverflow.com/questions/6051509

Вопрос

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

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

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

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

enter image description here


Редактировать:Недостающая (часто?) часть головоломки

я были проинформированы что помимо определенный диапазон 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:

  1. Струны

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

Character.isISOControl(int codePoint) 

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top