只需确保传递给的参数eval
不是来自外部输入,或者如果是,您已经事先对它们进行了消毒。
就像,不要这样做:
n=0
....
n=((n + 1))
eval "var$n=$1"
Run Code Online (Sandbox Code Playgroud)
$n
是在你的控制之下,内容$1
不是。例如,如果$1
是foo;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 中,在将外部输入作为参数传递时,您需要同样小心对待它们。