「eval echo」を使うのはいつも安全ですか?

「eval echo」を使うのはいつも安全ですか?

evalランダムなコード実行を許可するため、通常は使用しないことをお勧めします。しかし、それを使用すると、eval echo文字列の残りの部分がパラメータになるように見えるechoので安全です。私は正しいですか?

答え1

反例:

DANGEROUS=">foo"
eval echo $DANGEROUS

任意の引数は、echo「foo」というファイルを生成するよりも悪いことをする可能性があります。

答え2

@Celadaが素晴らしい答えを提供しました。デモはeval本当に邪悪で、ここ「foo」というファイルを作成するよりも悪いこと:

DANGEROUS='$(rm foo)'
eval echo "$DANGEROUS"

もちろんそうかもしれません。「foo」というファイルを作成するよりも悪いこと

答え3

いいえいいえ常に安全です。 eval は任意のコマンドを実行できます。

安全なコマンドは次のとおりです(日付は一重引用符内にあるため実行されません)。

$ echo '$(date)'
$(date)

evalで使用すると危険になります。

$ eval echo '$(date)'
Sat Dec 24 22:55:55 UTC 2016

もちろん日付は可能です。どの注文する。

これを改善する1つの方法は、evalの引数をさらに引用することです。

$ eval echo '\$(date)'
$(date)

しかし、表現を正確に2回引用することはしばしば困難です。

外部攻撃者が式を設定できる場合、正しい参照を制御する方法はありません。たとえば、次のようになります。

$ var='$(date);echo Hello!'
$ eval echo "$var"
Sat Dec 24 23:01:48 UTC 2016
Hello!

答え4

eval常に注意が必要なのは事実ですが、eval echo建設が常に無意味なわけではありません。できる使用に安全です。最近、いくつかの支柱の拡張を必要な順序で評価するために必要でした。

bash複数の支柱が左から右に広がるので

xargs -I_ cat _/{11..15}/{8..5}.jpg

次に展開

xargs -I_ cat _/11/8.jpg _/11/7.jpg _/11/6.jpg _/11/5.jpg _/12/8.jpg _/12/7.jpg _/12/6.jpg _/12/5.jpg _/13/8.jpg _/13/7.jpg _/13/6.jpg _/13/5.jpg _/14/8.jpg _/14/7.jpg _/14/6.jpg _/14/5.jpg _/15/8.jpg _/15/7.jpg _/15/6.jpg _/15/5.jpg

ただし、最初に2番目のサポート延長を完了する必要があります。

xargs -I_ cat _/11/8.jpg _/12/8.jpg _/13/8.jpg _/14/8.jpg _/15/8.jpg _/11/7.jpg _/12/7.jpg _/13/7.jpg _/14/7.jpg _/15/7.jpg _/11/6.jpg _/12/6.jpg _/13/6.jpg _/14/6.jpg _/15/6.jpg _/11/5.jpg _/12/5.jpg _/13/5.jpg _/14/5.jpg _/15/5.jpg

私が考える最善の方法は

xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)

これは、単一引用符がコマンドラインevalの解析中に最初の中かっこセットが拡張されるのを防ぎ、呼び出すサブシェルによって拡張できるようにするために機能しますeval

ネストされた中かっこ拡張に関連する巧妙な計画がある可能性があるため、これを1つのステップで実行できますが、もしそうなら、私は古くて愚かなのでそれを見ることができません。他にも、bashこの種の作業をよりきれいに実行できる他のシェルがあります。ただし、いずれにせよ、この使用は、そのパラメータがevalパラメータ拡張を含まない固定文字列であるため安全です。

関連情報