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

Tim*_*Tim 4 security bash eval

二元斑马说

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

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

谢谢。

Sté*_*las 8

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

就像,不要这样做:

n=0
....
n=((n + 1))
eval "var$n=$1"
Run Code Online (Sandbox Code Playgroud)

$n是在你的控制之下,内容$1不是。例如,如果$1foo;reboot,则 eval 将接收var3=foo;reboot要解释的代码并运行重启。

用:

eval "var$n=\$1"
Run Code Online (Sandbox Code Playgroud)

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

eval "$1=\$2"
Run Code Online (Sandbox Code Playgroud)

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

unset var1 foo bar
case $1 in
  (var1 | foo | bar) eval "$1=\$2";;
  (*) echo >&2 unexpected variable name; exit 1;;
esac
Run Code Online (Sandbox Code Playgroud)

请注意,这eval不是评估任意代码的唯一命令,还有很多其他命令,例如sh, perl, awk, sed, even read, export, typeset, printf,test或者[在某些 shell 中,在将外部输入作为参数传递时,您需要同样小心对待它们。