Очистить ввод пользователя в bash в целях безопасности - PullRequest
28 голосов
/ 25 ноября 2010

Как мне санировать пользовательский ввод в скрипте bash, чтобы я мог передать его в качестве аргумента другой программе оболочки?Я хочу предотвратить следующее:

INPUT="filename;rm -rf /"
ls $INPUT

Я думал, что этого должно быть достаточно, чтобы заключить пользовательский ввод в двойные кавычки, например:

ls "$INPUT"

, но что, если есть двойнойцитата в $INPUT?

Или bash уже справился с этой проблемой?

1 Ответ

35 голосов
/ 25 ноября 2010

Короткая

Bash уже имеет дело с этим. Цитировать это достаточно.

ls "$INPUT"

Длинный

Вот примерный пример того, как оболочка анализирует эту строку:

"ls \"$INPUT\""                     # Raw command line.
["ls", "\"$INPUT\""]                # Break into words.
["ls", "\"filename; rm -rf /\""]    # Perform variable expansion.
["ls", "\"filename; rm -rf /\""]    # Perform word splitting (no change).
["ls", "filename; rm -rf /"]        # Remove quotes.

Из-за кавычек переменная $INPUT не разбивается на слова. ls будет искать файл с именем filename; rm -rf /.

Если вы не процитируете его, расширение будет происходить иначе:

"ls $INPUT"                             # Raw command line.
["ls", "$INPUT"]                        # Break into words.
["ls", "filename; rm -rf /"]            # Perform variable expansion.
["ls", "filename;", "rm", "-rf", "/"]   # Perform word splitting.

Вы можете, по крайней мере, утешиться тем, что это на самом деле не выполнится rm -rf /. Скорее, он передаст каждую из этих строк как имя файла в ls. Вы будете ls некоторые файлы, которые вы не собирались, но, по крайней мере, они не будут случайно выполнять нежелательные команды.

jkugelman$ VAR='.; echo hi'
jkugelman$ ls $VAR
ls: .;: No such file or directory
ls: echo: No such file or directory
ls: hi: No such file or directory

Выдержки из "man bash":

Цитирование

Цитирование используется для удаления особого значения определенных символов или слов в оболочке. Кавычки могут использоваться для отключения специальной обработки для специальных символов, для предотвращения распознавания зарезервированных слов как таковых и для предотвращения расширения параметров.

РАСШИРЕНИЕ

Расширение выполняется в командной строке после того, как оно было разбито на слова. Есть семь видов выполненного расширения: расширение фигурных скобок, расширение тильды, расширение параметров и переменных, команда подстановка, арифметическое расширение, разбиение слов и расширение пути.

Только расширение фигурных скобок, разбиение слов и расширение пути могут изменить количество слов в расширение; другие расширения расширяют одно слово в одно слово. Единственными исключениями к этому являются расширения "$@" и "${name[@]}", как описано выше (см. ПАРАМЕТРЫ).

Разделение слов

Оболочка сканирует результаты раскрытия параметров, подстановки команд и арифметического раскрытия это не произошло в двойных кавычках для разделения слов.

Цитата Удаление

После предыдущих расширений, все без кавычек вхождения символов \, ' и ", которые не результат от одного из вышеперечисленных расширений удаляется.

...