Рельсы, как безопасно запускать команду системы из rails

У меня есть ActiveJob, который запускает систему script для запуска:

 `grunt custom-job --src=files --dest="file" --vars='#{user_input_vars_from_json}'`

Точка - это то, что

user_input_vars_from_json

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

Ответ 1

Я просто хотел бы предисловие к этому: Любой пользовательский ввод должен рассматриваться как опасный. Я бы не рекомендовал выполнять какую-либо команду с использованием пользовательских входов.

Первое, что вам нужно сделать, это заблокировать вход как можно больше. Рассмотрите возможность ограничения длины user_input_vars_from_json для предотвращения переполнения буфера и DoS-атак. Я также рекомендую попытаться выяснить способ проверки и ограничения "варсов", которые вы пытаетесь установить в user_input_vars_from_json JSON, для фильтрации любых нежелательных ключей/значений.

Как только ваш вход очищен, вы можете использовать Kernel # system в сочетании с Shellwords, чтобы как можно лучше подойти к выполнению вашей команды из вашей работы:

require 'shellwords'
system("grunt", "custom-job", "--src=files", '--dest="file"', "--vars=\"#{Shellwords.escape(user_input_vars_from_json)}\""