如何处理评估脚本中外部输入的“eval”的不安全性?

如何处理评估脚本中外部输入的“eval”的不安全性?

二元斑马说

该脚本正在评估外部输入,这是一种非常不安全的做法。

有哪些方法可以处理甚至取代eval评估脚本中的外部输入?

谢谢。

答案1

只需确保传递给的参数eval不是来自外部输入,或者如果是,您已经事先清理了它们。

就像,不要这样做:

n=0
....
n=$((n + 1))
eval "var$n=$1"

$n在下面你的控制,内容$1不是。例如,如果$1是,eval 将收到要解释的代码,然后重新启动。foo;rebootvar3=foo;reboot

使用:

eval "var$n=\$1"

然后,相反,eval会收到var3=$1,这很好。

eval "$1=\$2"

也会错的。您需要确保 的内容$1仅来自一组可接受的值(清理):

unset -v var1 foo bar
case $1 in
  (var1 | foo | bar) eval "$1=\$2";;
  (*) echo >&2 unexpected variable name; exit 1;;
esac

请注意,这eval不是评估任意代码的唯一命令,还有很多其他命令,例如shperlawk、 、sed、 、 、read、 、exporttypeset、 、printftest[在某些 shell 中,在将外部输入作为参数传递时,您需要同样小心。

相关内容