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

Многие приложения имеют большие объёмы кода, использующего ad-hoc методы для генерации JSON-вывода.
Зачастую эти выводы проходят через небольшой объём каркасного (framework) кода перед отправкой по сети. Этот небольшой объём каркасного кода может использовать данную библиотеку, чтобы гарантировать, что ad-hoc выводы соответствуют стандартам и безопасны для передачи (чрезмерно) мощным десериализаторам, таким как оператор eval в Javascript.
Приложения также часто имеют веб-сервисные API, которые получают JSON из различных источников. Если этот JSON создан с использованием ad-hoc методов, эта библиотека может привести его к удобной для анализа форме.
Подключив эту библиотеку к коду, отправляющему и получающему запросы и ответы, она может помочь архитекторам ПО обеспечить системную безопасность и корректность формата.
Санитайзер принимает JSON-подобный контент и интерпретирует его так, как это сделал бы JS eval. В частности, он обрабатывает следующие нестандартные конструкции.
| Конструкция | Политика |
|---|---|
'...' | Строки в одинарных кавычках преобразуются в JSON-строки. |
\xAB | Шестнадцатеричные escape-последовательности преобразуются в JSON-escape-последовательности Unicode. |
\012 | Восьмеричные escape-последовательности преобразуются в JSON-escape-последовательности Unicode. |
0xAB | Шестнадцатеричные целочисленные литералы преобразуются в десятичные числа JSON. |
012 | Восьмеричные целочисленные литералы преобразуются в десятичные числа JSON. |
+.5 | Десятичные числа приводятся к более строгому формату JSON. |
[0,,2] | Пропуски в массивах заполняются значением null. |
[1,2,3,] | Завершающие запятые удаляются. |
{foo:"bar"} | Некавыченные имена свойств заключаются в кавычки. |
//comments | Строчные и блочные комментарии в стиле JS удаляются. |
(...) | Скобки группировки удаляются. |
Санитайзер исправляет пропущенную пунктуацию, закрывающие кавычки, а также несоответствующие или отсутствующие закрывающие скобки. Если входные данные содержат только пробельные символы, то подставляется корректная JSON-строка null.
Выходные данные — это корректный JSON, определённый в RFC 4627. Выходные данные удовлетворяют следующим дополнительным свойствам:
"</script", поэтому их можно встраивать в HTML-элемент script без дополнительного кодирования."]]>", поэтому их можно встраивать в CDATA-секцию XML без дополнительного кодирования.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.