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
パラメータ拡張を含まない固定文字列であるため安全です。