
Java-библиотека, которая преобразует повреждённое JSON-подобное содержимое в соответствующий стандартам, безопасный JSON, предотвращая внедрение кода и обеспечивая возможность встраивания в контексты HTML/XML.
JSON Sanitizer преобразует JSON-подобное содержимое в валидный JSON.
Этот инструмент может быть подключён на любом конце конвейера данных, чтобы помочь удовлетворить принцип Постела:
будьте консервативны в том, что делаете, и либеральны в том, что принимаете от других
Применённый к JSON-подобному содержимому от других, он создаст корректный JSON, который удовлетворит любой используемый вами парсер.
Применённый к вашему выводу перед отправкой, он исправит небольшие ошибки в кодировании и облегчит встраивание вашего JSON в HTML и XML.

Многие приложения имеют большие объёмы кода, использующего ad-hoc методы для генерации JSON-вывода.
Часто этот вывод проходит через небольшой объём каркасного кода перед отправкой по сети. Этот небольшой объём каркасного кода может использовать данную библиотеку, чтобы гарантировать, что ad-hoc вывод соответствует стандартам и безопасен для передачи (чрезмерно) мощным десериализаторам, таким как оператор eval в JavaScript.
Приложения также часто имеют веб-сервисные API, которые получают JSON из различных источников. Когда этот JSON создаётся ad-hoc методами, данная библиотека может привести его в форму, удобную для парсинга.
Подключив эту библиотеку к коду, который отправляет и получает запросы и ответы, она может помочь архитекторам программного обеспечения обеспечить общесистемную безопасность и корректность формата.
Санайзер принимает JSON-подобное содержимое и интерпретирует его так, как это сделал бы JS eval. В частности, он обрабатывает следующие нестандартные конструкции.
| Конструкция | Политика |
|---|---|
'...' | Строки в одинарных кавычках преобразуются в JSON-строки. |
\xAB | Шестнадцатеричные escape-последовательности преобразуются в JSON-escape-последовательности Юникода. |
\012 | Восьмеричные escape-последовательности преобразуются в JSON-escape-последовательности Юникода. |
0xAB | Шестнадцатеричные целочисленные литералы преобразуются в JSON-десятичные числа. |
012 | Восьмеричные целочисленные литералы преобразуются в JSON-десятичные числа. |
+.5 | Десятичные числа приводятся к более строгому формату JSON. |
[0,,2] | Пропуски в массивах заполняются значением null. |
[1,2,3,] | Завершающие запятые удаляются. |
{foo:"bar"} | Неэкранированные имена свойств заключаются в кавычки. |
//comments | JS-комментарии (строчные и блочные) удаляются. |
(...) | Группирующие скобки удаляются. |
Санайзер исправляет отсутствующую пунктуацию, закрывающие кавычки, а также несоответствующие или отсутствующие закрывающие скобки. Если ввод содержит только пробельные символы, то подставляется валидная JSON-строка null.
Результат — это корректный JSON, определённый в RFC 4627. Вывод удовлетворяет следующим дополнительным свойствам:
"</script", поэтому его можно встраивать в HTML-элемент script без дополнительного кодирования."]]>", поэтому его можно встраивать в XML-секцию CDATA без дополнительного кодирования.eval JavaScript (после заключения в скобки) или JSON.parse. В частности, вывод не будет содержать строковых литералов со встроенными символами новой строки JS (U+2028 разделитель абзацев или U+2029 разделитель строк).Поскольку вывод представляет собой корректный JSON, передача его в eval не будет иметь побочных эффектов и свободных переменных, поэтому он не является ни вектором внедрения кода, ни вектором для вывода секретов.
Данная библиотека гарантирует только то, что этап преобразования строки JSON в объект JavaScript не имеет побочных эффектов и не разрешает свободные переменные, и не может контролировать, как другой клиентский код впоследствии интерпретирует полученный объект JavaScript. Поэтому, если клиентский код берёт часть разобранных данных, контролируемых атакующим, и передаёт её обратно через мощный интерпретатор, такой как eval или innerHTML, то этот клиентский код может столкнуться с непреднамеренными побочными эффектами.
var myValue = eval(sanitizedJsonString); // safe
var myEmbeddedValue = eval(myValue.foo); // possibly unsafe
Кроме того, санация JSON не может защитить приложение от атак запутанного заместителя
var myValue = JSON.parse(sanitizedJsonString);
addToAdminstratorsGroup(myValue.propertyFromUntrustedSource);
Метод sanitize вернёт входную строку без выделения нового буфера, если входные данные уже являются корректным JSON, удовлетворяющим указанным выше свойствам. Таким образом, при использовании на вводе, который обычно корректен, это даёт минимальные накладные расходы по памяти.
Метод sanitize работает за время O(n), где n — длина входных данных в 16-битных юнитах UTF-16.