Подтвердить что ты не робот

Санизировать ввод пользователя в bash для целей безопасности

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

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

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

ls "$INPUT"

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

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

4b9b3361

Ответ 1

Короткая

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":

Цитирование

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

РАСШИРЕНИЕ

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

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

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

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

Удаление цитаты

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