json является опасным форматом

Статус русского языка в ИТ и в обществе. Аргументы за программирование на русском языке: история, культура, производительность труда, цивилизационная идентичность. Информационная безопасность.
Ответить
БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

json является опасным форматом

Сообщение БудДен » 12.12.19 10:50

По той простой причине, что он недостаточно определён.

https://habr.com/ru/company/mailru/blog/314014/

Ключевое место в тексте
Помимо специфических случаев, которые мы рассмотрели, практически невозможно установить, соответствует ли парсер требованиям RFC 7159, по причине сказанного в разделе 9:
JSON-парсер ДОЛЖЕН принимать все тексты, соответствующие грамматике JSON. JSON-парсер МОЖЕТ принимать не JSON формы или расширения.

Пока всё понятно. Все грамматически правильные входные данные ДОЛЖНЫ парситься, и парсеры могут сами решать, принимать ли другой контент.
Реализации могут ограничивать:

размер принимаемого текста;
максимальную глубину вложенности;
диапазон и точность чисел;
длину строковых значений и их набор символов.

Все эти ограничения звучат разумно (за исключением, возможно, символов), но противоречат слову «ДОЛЖЕН» из предыдущей цитаты. RFC 2119 предельно ясно объясняет его значение:
ДОЛЖЕН. Это слово, как и «ТРЕБУЕТСЯ» или «СЛЕДУЕТ», означает обязательное требование спецификации.

RFC 7159 допускает ограничения, но не задаёт минимальные требования. Поэтому технически парсер, который не может парсить строку длиннее трёх символов, всё ещё соответствует требованиям RFC 7159.

Кроме того, в разделе 9 RFC 7159 от парсеров требуется ясно документировать ограничения и/или позволить использовать пользовательские конфигурации. Но эти конфигурации могут приводить к проблемам с совместимостью, поэтому лучше останавливаться на минимальных требованиях.

Такой недостаток конкретики на фоне допускаемых ограничений практически не позволяет точно сказать, соответствует ли парсер RFC 7159. Ведь можно парсить контент, не соответствующий грамматике (это «расширения»), и отклонять контент, соответствующий грамматике (это «ограничения» парсера).
и
Заключение
JSON — это не тот формат данных, на который можно слепо полагаться. Я доказал это тем, что:

стандартное определение разбросано как минимум по шести разным документам (раздел 1);
последний и самый полный документ, RFC-7159, неточен и противоречив (раздел 2);
более чем среди 30 парсеров, обработавших созданные мною тестовые файлы, не нашлось даже двух, которые бы выдали одинаковые результаты (раздел 4).

Анализируя результаты тестирования, я обнаружил, что json_checker.c с сайта json.org отклоняет валидный JSON [0e1] (раздел 4.24), что никак не поможет пользователям понять, где правильно, а где неправильно. Многие авторы парсеров (включая и меня) любят хвастаться корректностью работы своих парсеров, толку от этого мало, потому что эталоны спорны, а существующие тестовые наборы откровенно слабы.

Я написал ещё один JSON-парсер (раздел 6), который парсит или отвергает JSON-документ согласно моему пониманию RFC 7159. Комментируйте, сообщайте о багах и делайте pull request’ы.

Аватара пользователя
Лис [Вежливый]
Сообщения: 561
Зарегистрирован: 08.10.18 13:32

Re: json является опасным форматом

Сообщение Лис [Вежливый] » 12.12.19 17:24

Это всё мелочная мышиная возня.

Что сделали они?

1) создали некоммерческую организацию IETF - https://en.wikipedia.org/wiki/Internet_ ... Task_Force
2) создали репозиторий документов
3) определили статусы документов
4) разработали и опубликовали процесс придания документам статусов (устарел, действует, черновик в процессе согласования)

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

А уже после к нему парсеры понапишут.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: json является опасным форматом

Сообщение БудДен » 17.12.19 12:40

Я написал не про "что надо делать", а про "очередная дыра в интернете". Просто, честно сказать, не ожидал, что даже тут сумели накосячить. Вроде достаточно простой формат, проще уже почти некуда.

440440
Сообщения: 37
Зарегистрирован: 20.12.19 22:35

Re: json является опасным форматом

Сообщение 440440 » 20.12.19 22:46

В данном случае слово опасный тут не слишком подходит. Врядли при разработке стандарта думали обо вских умниках, которые будут ограничивать парсер по длине 3 символами. Да, есть какая-то неопределённость, но где же её нет? Проблема решается способом, предложенным Лисом, не устраивает этот стандарт, всегда можно сделать другой.

БудДен
Сообщения: 2839
Зарегистрирован: 07.10.18 14:01

Re: json является опасным форматом

Сообщение БудДен » 21.12.19 15:03

Чем "ненадёжный" отличается от "опасный" - это вопрос больше подхода, чем самих особенностей дефекта. Если мы хотим атаковать, то мы можем пытаться использовать ненадёжность. Если речь идёт о надёжности промышленной системы (ну хотя бы той же Теслы), то дефекты json могут вызвать дефекты в конечном продукте.

Конечно, нормальный стандарт можно выработать, но популярен-то не этот воображаемый стандарт, а json. Вот когда будет популярен этот другой стандарт, тогда и будет предмет для разговора.

Насчёт "где её нет" - ну где-то её точно нет. Проблемы json совершенно конкретные и вытекают не из законов природы, а из плохих процедур, по которым он был сделан.

440440
Сообщения: 37
Зарегистрирован: 20.12.19 22:35

Re: json является опасным форматом

Сообщение 440440 » 21.12.19 16:36

Может быть и так, но в конечном счёте надёжность определяется не стандартом, а реализацией. Популярен но в узких кругах многочисленных js-разработчиков, сфера которых веб, о надёжности которой вообще нет смысла говорить, красота веб-страничек считается более приоритетной. Да и вообще стандарты в вебе - это больная тема.

Ответить