Использование eval
часто не рекомендуется, потому что это позволяет выполнять произвольный код. Однако, если мы используем eval echo
, то похоже, что остальная часть строки станет аргументом, echo
поэтому она должна быть безопасной. Я прав в этом?
20
-n
, вы можете просто сделать это с помощью переменной без кавычек, например,echo $arguments
или если$arguments
это массивecho "${arguments[@]}"
. Использованиеeval echo
бессмысленно, даже если это было безопасно.Ответы:
контрпример:
Произвольные аргументы to
echo
могли бы сделать что-то более гнусное, чем создание файла с именем "foo".источник
DANGEROUS="hello;ls"
для произвольных команд вместоls
.DANGEROUS='$(ls)'
(может потребоваться больше экранирования).eval echo '"'"$DANGEROUS"'"'
работать? Похоже на goo.gl/L2pPQPDANGEROUS='">foo"'
).@Celada предоставила отличный ответ. Чтобы продемонстрировать
eval
действительно зло, вот нечто более гнусное, чем создание файла с именем "foo" :И, конечно, может быть что-то более гнусное, чем нечто более гнусное, чем создание файла с именем «foo» .
источник
"$THIS"
а не просто как$THIS
, даже не помогает!eval echo '"'"$DANGEROUS"'"'
. Попробуйте это на goo.gl/L2pPQP>foo
, потому что «создание файла с именем« foo »» не обязательно все, что>foo
делает. Единственное реальное отличие вашего примера в том, что он не оставляет пустой файл. Содержание все еще ушло.Нет, это не всегда безопасно. Eval может выполнить любую команду.
Безопасная команда, подобная этой (дата не выполняется, поскольку она находится в одинарных кавычках):
Становится опасным, если используется с eval:
Конечно, датой может быть любая команда.
Один из способов улучшить это - дополнительно процитировать аргументы в eval:
Но обычно сложно правильно дважды цитировать выражение.
И становится невозможным контролировать правильное цитирование, если выражение может быть установлено внешним злоумышленником, например:
источник
Хотя это правда, что
eval
всегда нужно подходить с осторожностью,eval echo
конструкция не всегда бессмысленна и может использоваться безопасно. Недавно я нуждался в этом, чтобы оценить несколько расширений фигурных скобок в том порядке, в котором они мне нужны.bash
делает несколько расширений скобок слева направо, такрасширяется до
но мне нужно было сделать второе расширение скобки первым, давая
Лучшее, что я мог придумать, чтобы сделать это, было
Это работает, потому что одинарные кавычки защищают первый набор фигурных скобок от раскрытия во время синтаксического анализа
eval
командной строки, оставляя их для раскрытия посредством подоболочки, вызываемойeval
.Может быть какая-то хитрая схема с использованием вложенных фигурных скобок, которая позволяет этому происходить за один шаг, но если это так, я слишком стар и глуп, чтобы это увидеть. Есть и другие оболочки,
bash
которые позволяют более аккуратные способы достижения такого рода вещей. Но в любом случае такое использованиеeval
безопасно, поскольку все его аргументы - это фиксированные строки, которые не содержат раскрытия параметров.источник
eval xargs -I_ cat _/'{11..15}'/{8..5}.jpg