Является ли JSON безопасным для использования в качестве аргумента командной строки или его необходимо сначала дезинфицировать?

Является ли следующее опасным?

$ myscript '<somejsoncreatedfromuserdata>'

Если да, то что я могу сделать, чтобы это не опасно?

Я понимаю, что это может зависеть от оболочки, ОС, утилиты, используемой для создания системных вызовов (если это делается внутри языка программирования) и т.д. Однако я просто хотел бы знать, какие вещи я должен соблюдать для.

Ответы

Ответ 1

Да. Это опасно.

JSON может включать одинарные кавычки в строковых значениях (они не должны быть экранированы). Смотрите "дорожки" на json.org.

Представьте, что данные:

{"pwned": "you' & kill world;"}

Счастливое кодирование.


Я бы рассмотрел возможность подключения данных к рассматриваемой программе (например, используйте "popen" или даже версию "exec", которая напрямую передает аргументы) - это может избежать проблем, возникающих в результате прохождения через оболочку, например, Так же, как и с SQL: использование заполнителей исключает необходимость путаницы с "экранированием".


Если передача через оболочку является единственным способом, то это может быть опция (она не проверена, но что-то похожее для контекста "<script> " ):

Для каждого символа в JSON, который находится за пределами диапазона "пробел" до "~" в ASCII, или имеет особый смысл в контексте '' оболочки, такой как \ и ' (но исключая " или любой другой символ - например, цифры - которые могут отображаться вне "строковых" данных, что является ограничением этого тривиального подхода), затем закодируйте символ, используя форму \uXXXX JSON. (В соответствии с ограничениями, указанными выше, это должно только кодировать потенциально опасные символы, появляющиеся в "строках" в JSON, и не должно быть пар \\, нет конечных \ и no ' s и т.д.)