Просто убедитесь, что аргументы, переданные в eval
, не поступают из внешнего ввода или что, если они есть, вы предварительно их продезинфицировали.
Например, не делать:
n=0
....
n=((n + 1))
eval "var$n=$1"
$ n
находится под вашим контролем, содержание $ 1
- нет. Если $ 1
равно foo; reboot
, например, eval получит код var3 = foo; reboot
для интерпретации, и это запустит перезагрузку.
Используйте:
eval "var$n=\$1"
Тогда вместо этого eval
получит var3 = $ 1
, что нормально.
eval "$1=\$2"
Тоже неправ. Вам нужно будет убедиться, что содержимое $ 1
только из набора допустимых значений (дезинфекция):
unset var1 foo bar
case $1 in
(var1 | foo | bar) eval "$1=\$2";;
(*) echo >&2 unexpected variable name; exit 1;;
esac
Обратите внимание, что eval
- не единственная команда, которая оценивает произвольный код. есть много других, например sh
, perl
, awk
, sed
, даже read
, export
, typeset
, printf
, test
или [
] в некоторых оболочках, вам нужно быть одинаково осторожным с ними при передаче внешний ввод в качестве аргументов.