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

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