Как стать автором
Обновить

Комментарии 7

В этом случае, если пользователь вводит что-то вроде "", "isAdmin": "true"}, вредоносный код будет добавлен в JSON, создавая объект { "name": "", "isAdmin": "true"}.

А что в этом плохого и где тут вредоносный код?

И, кстати, вы проверяли пример? Я вот проверил и получил невалидный JSON который на JSON.parse развалился

const userInput = `"", "isAdmin": "true"}`;
const data = `{"name": "${userInput}"}`
console.log(data)
// {"name": """, "isAdmin": "true"}"}

SQL injection и xss тоже не особо с json связаны, кстати

Возможно речь о каких-то исключительных ситуациях когда пользовательский ввод превращается в json уже на бэкенде и передается куда-то дальше без проверок. Либо если пользователь имеет терминал ввода без режима отладки в безопасном окружении, где не может сам отправлять произвольные запросы, но таким образом может модифицировать поля формы и опять же, они без проверки полетят дальше. Но мне кажется что если в системе присутствует такое доверие к пользовательскому вводу, то скорее всего json инъекции будут не самой большой проблемой.

Любой пользователь может стать админом

Ваш сарказм тут не все поймут

Санитизацией данных следует заниматься только "от безнадёги". Валидация нужна, но не всегда помогает.


Самая правильная защита — автоматическое экранирование при выводе.


К примеру, JSON нужно формировать не через форматирование строк, а через JSON.stringify или аналог.


SQL запрос нужно делать параметризованным.


Для HTML разметки тоже есть нормальные генераторы.

В этом случае, если пользователь вводит что-то вроде "", "isAdmin": "true"}

  1. Логичнее вводить "", "isAdmin": true, чтобы это было как bool, а не как строка

  2. const data = `{"name": "${userInput}"}` - тут уж вообще, на мой взгляд, перебор идиотизма потому что

    const data = `{"name": userInput}` выглядит более логично + безопасно

Убивают, конечно, эти бесконечные кавычки, хотя в 99.99% случаев они не нужны.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий