bashで文字列を実行するためにevalを使用するときのセキュリティリスク

bashで文字列を実行するためにevalを使用するときのセキュリティリスク

以下を考慮してください。

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

これは完全に安全でなければなりません。しかし、$b同じですが知られていないと言うことができます$a。では安全上の問題はありませんか?eval "$b"それでは、これらのリスクを軽減するためにどのような措置を講じることができますか?

答え1

bリテラル文字列が含まれている場合、つまりprintf "%s\n" "$a"辞書に展開していない場合は問題ありません。静的命令しかないので、なぜそこが必要なのかよくわかりません。自分で実行してみてください。$aeval "$b"evalprintf "%s\n" "$a"

お客様は、ご意見で後で使用できるように、いくつかのコマンドを保存したいと述べました。これがまさに関数がすることです。たとえば、printfコマンドは次の関数になります。

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

どのように実行しますかprintln "hello there"?は関数の最初のパラメータですが、もちろん、代わりにstdinを読み込むことも、複数のパラメータを使用することもできます(、、...;またはすべてリストとして含める(類似))。println "$a""$1""$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

関連情報