предотвратить внедрение скрипта при порождении командной строки с входными аргументами из внешнего источника - PullRequest
1 голос
/ 09 марта 2020

У меня есть сценарий python, который включает в себя инструмент командной строки bash, который получает свои переменные из внешнего источника (переменные среды). Есть ли способ выполнить какое-либо мягкое экранирование, чтобы предотвратить выполнение злонамеренным пользователем неверного кода в одном из этих параметров.

например, если скрипт выглядит следующим образом

/bin/sh 

/usr/bin/tool ${VAR1} ${VAR2}

и кто-то установил VAR2 следующим образом

export VAR2=123 && \rm -rf /

, поэтому он может не обрабатывать VAR2 в качестве чистого ввода и выполните команду rm.

Есть ли способ сделать переменную неисполнимой и получить строку как есть для инструмента командной строки в качестве ввода?

1 Ответ

1 голос
/ 09 марта 2020

Правильный и безопасный способ передачи значений переменных VAR1 и VAR2 в качестве аргументов /usr/bin/tool:

/usr/bin/tool -- "$VAR1" "$VAR2"
  • Кавычки не допускают какой-либо специальной обработки разделителя или символы сопоставления с образцом в строках.
  • -- должен предотвращать обработку значений переменных как параметров, если они начинаются с - символов. Возможно, вам придется сделать что-то еще, если tool написан плохо и не принимает -- для завершения параметров командной строки.
  • См. Цитаты - Wiki Грега для получения превосходной информации о цитировании в программировании оболочки.
  • Shellcheck может обнаружить много случаев, когда кавычки отсутствуют. Он доступен как онлайн-инструмент или как устанавливаемая программа. Всегда используйте его, если вы хотите устранить многие распространенные ошибки в вашем шелл-коде.
  • Фигурные скобки в строке кода в вопросе полностью избыточны, как обычно. Некоторые люди ошибочно думают, что они действуют как цитаты. Чтобы понять их использование, см. Когда нам нужны фигурные скобки вокруг переменных оболочки? .
  • Я предполагаю, что /bin/sh в вопросе должен был быть #! /bin/sh притон . Поскольку вопрос был помечен bash, обратите внимание, что #! /bin/sh не следует использовать с кодом, который включает Bashisms . /bin/sh не может быть Bash, и даже если оно Bash, оно ведет себя иначе, когда вызывается как /bin/sh, а не /bin/bash.
  • Обратите внимание, что даже если вы забудете кавычки, строка код в вопросе не приведет к тому, что команды (например, rm -rf /), встроенные в значения переменных, будут выполняться в этой точке. Опасность заключается в том, что плохо написанный код, который использует переменные, будет создавать и запускать команды, которые включают значения переменных небезопасными способами. См. , следует ли мне избегать bash - c, sh - c и других эквивалентов оболочек в моих сценариях оболочки? для объяснения (только) некоторых опасностей.
...