Что делать с небезопасной оценкой внешнего ввода в сценарии eval?

Думали ли вы об использовании dos2unix?

4
13.04.2017, 15:36
1 ответ

Просто убедитесь, что аргументы, переданные в 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 или [] в некоторых оболочках, вам нужно быть одинаково осторожным с ними при передаче внешний ввод в качестве аргументов.

8
27.01.2020, 20:50

Теги

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