在 bash 中使用 eval 执行字符串的安全隐患

在 bash 中使用 eval 执行字符串的安全隐患

考虑以下:

$ a='friend'
$ b='printf "%s\n" "$a"'
$ eval "$b"
friend

这应该是完全安全的。然而,我们可以说这$b是相同的但$a未知。那么是否存在任何安全隐患?eval "$b"如果有,我可以采取什么措施来减轻这些隐患?

答案1

如果b包含文字 string ,即您事先printf "%s\n" "$a"没有扩展它,那么是的,应该没问题。不过,不知道为什么你需要那里,因为你只有一个静态命令。直接运行就可以了。$aeval "$b"evalprintf "%s\n" "$a"

您在评论中说您想存储一些命令以备将来使用。这就是函数的工作。例如,该printf命令可以变成这样的函数:

println() {
    printf "%s\n" "$1"
}

你以什么方式运行println "hello there"println "$a"或者什么。"$1"是函数的第一个参数,但当然您可以改为读取 stdin,或使用多个参数("$2", "$3", ...; 或将它们全部作为列表"$@"(类似"${array[@]}"))。

类似地,对于较长的操作集:

#!/bin/bash
say_hi() {
    echo "hello, $1"
}
louder() {
    echo "$1!"
}
funcs=(say_hi louder)
names=(Huey Dewey Louie)
for name in "${names[@]}"; do
    tmp=$name
    for func in "${funcs[@]}"; do
        tmp=$($func "$tmp")
    done
    echo "result: $tmp"
done

相关内容