Как предотвратить инжекцию команды через опции команды?

-T largefile флаг корректирует сумму inodes, которые выделяются при создании файловой системы. После того, как выделенный, их число не может быть скорректировано (по крайней мере, для ext2/3, не полностью уверенного в ext4). Значение по умолчанию является одним inode для каждого 16K дискового пространства. -T largefile делает это одним inode для каждого мегабайта.

Каждый файл требует одного inode. Если Вы не имеете inodes в запасе, Вы не можете создать новые файлы. Но они статически выделили inodes, занимают место, также. Можно ожидать сохранять приблизительно 1,5 гигабайта для каждых 100 ГБ диска путем установки -T largefile, в противоположность значению по умолчанию. -T largefile4 (один inode на 4 МБ), не имеет такого сильного воздействия.

Если Вы уверены, что средний размер файлов, хранивших на устройстве, будет выше 1 мегабайта, то любой ценой, установить -T largefile. Я счастливо использую его на своих разделах устройства хранения данных и думаю, что это не является слишком радикальным из установки.

Однако при распаковке очень большого источника tarball многих файлов (думайте сотни тысяч) к тому разделу у Вас есть шанс исчерпывания inodes для того раздела. Существует мало, можно сделать в той ситуации кроме выбора другого раздела к untar к.

Можно проверить, сколько inodes Вы имеете в наличии в живой файловой системе с dumpe2fs команда:

# dumpe2fs /dev/hda5
[...]
Inode count:              98784
Block count:              1574362
Reserved block count:     78718
Free blocks:              395001
Free inodes:              34750

Здесь, я могу все еще создать 34 тысячи файлов.

Вот то, что я получил после выполнения mkfs.ext3 -T largefile -m 0 на разделе на 100 ГБ:

Filesystem           1M-blocks      Used Available Use% Mounted on
/dev/loop1              102369       188    102181   1% /mnt/largefile
/dev/loop2              100794       188    100606   1% /mnt/normal

largefile версия имеет 102 400 inodes, в то время как нормальный создал  6 553 600 inodes и сохранил 1,5 ГБ в процессе.

Если у Вас есть хорошая подсказка о том, какие файлы размера Вы собираетесь поставить файловую систему, можно подстроить сумму inodes непосредственно с -i переключатель. Это устанавливает байты на inode отношение. Вы получили бы 75% сбережений пространства, если бы Вы использовали -i 65536 в то время как все еще способность создать более чем миллион файлов. Я обычно вычисляю для хранения по крайней мере 100 000 запчастей inodes.

13
12.07.2013, 02:20
4 ответа

Если Вы управляете программой обертки, то удостоверьтесь, что она не вызывает подоболочку. В глубине души инструкция выполнить программу состоит из полного пути (абсолютный или относительно текущего каталога) к исполняемому файлу и списку строк для передачи как аргументы. Поиск ПУТИ, пробельные аргументы разделения, заключая в кавычки и операторы управления все обеспечиваются оболочкой. Никакая оболочка, никакая боль.

Например, с оберткой 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} создайте, который должен прибыть удобный сюда, требует изворотливого заключения в кавычки, и я не думаю, что можно получить '\'' как текст замены.)

6
27.01.2020, 19:53

Можно использовать Bash ${VAR//PATTERN/REPLACEMENT} идиома для преобразования одинарной кавычки ' в '\'' первым помещением '\'' в переменную (как промежуточный шаг) и затем расширяющий эту переменную как REPLACEMENT элемент в упомянутой идиоме Bash.

# example 
{
str="don't"
escsquote="'\''"
str="'${str//\'/${escsquote}}'"
printf '%s\n' "$str"   #  'don'\''t'
}
1
27.01.2020, 19:53

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

while getopts a:b: opts; do
  case ${opts} in
    a)
      A=${OPTARG}
      ;;
    b)
      B=${OPTARG}
      ;;
  esac
done
0
27.01.2020, 19:53

Чтобы в лучшем случае избежать инъекций, рассмотрите возможность перехода на [T]csh. В отличие от оболочек Bourne, оболочка C «ограничена», поэтому для написания сценариев рекомендуется использовать другие, более безопасные пути. «Ограничения», накладываемые оболочкой C, делают ее одной из самых надежных оболочек для работы. (Например, :Вложенность минимальна или невозможна, что предотвращает инъекции любой ценой; есть лучшие способы добиться желаемого.)

-1
28.11.2021, 19:20

Теги

Похожие вопросы