を使用するeval
と、任意のコードの実行が許可されるため、多くの場合推奨されません。ただし、を使用するeval echo
と、残りの文字列がの引数にecho
なるため、安全である必要があります。これは正しいですか?
-n
引用符で囲まれていない変数echo $arguments
またはif $arguments
が配列の場合に行うことができますecho "${arguments[@]}"
。安全eval echo
であっても、使用することは無意味です。
を使用するeval
と、任意のコードの実行が許可されるため、多くの場合推奨されません。ただし、を使用するeval echo
と、残りの文字列がの引数にecho
なるため、安全である必要があります。これは正しいですか?
-n
引用符で囲まれていない変数echo $arguments
またはif $arguments
が配列の場合に行うことができますecho "${arguments[@]}"
。安全eval echo
であっても、使用することは無意味です。
回答:
反例:
DANGEROUS=">foo"
eval echo $DANGEROUS
へのarbitrary echo
意的な引数は、「foo」と呼ばれるファイルを作成するよりも邪悪なことをした可能性があります。
DANGEROUS="hello;ls"
代わりの任意のコマンドの場合ls
。
DANGEROUS='$(ls)'
さらにエスケープが必要な場合があります)。
eval echo '"'"$DANGEROUS"'"'
動作しますか?これは、上には思わgoo.gl/L2pPQP
DANGEROUS='">foo"'
)では機能しません。
@Celadaは素晴らしい答えを提供してくれました。eval
本当に悪であることを示すために、「foo」というファイルを作成するよりも邪悪なものを以下に示します。
DANGEROUS='$(rm foo)'
eval echo "$DANGEROUS"
そしてもちろん、 "foo"と呼ばれるファイルを作成するよりも邪悪なものよりももっと邪悪なものがあります。
"$THIS"
に変数を引用するだけではなく、変数を引用するだけ$THIS
でも役に立ちません!
eval echo '"'"$DANGEROUS"'"'
。goo.gl/L2pPQPで
>foo
、「foo」という名前のファイルを作成することだけでなくてもよいため、これ以上悪意のあるものではありません>foo
。あなたの例の唯一の本当の違いは、空のファイルを残さないということです。内容はまだありません。
いいえ、常に安全とは限りません。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!
それがあることは事実ですが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
です。
ネストされたブレース展開を含むいくつかのunningなスキームがあり、これが1つのステップで発生する可能性がありますが、ある場合、私はそれを見るには古すぎて愚かです。それ以外にもbash
、この種のことを達成するための整然とした方法を可能にするシェルがあります。ただし、いずれの場合でも、eval
引数はパラメータ展開を含まない固定文字列であるため、この使用は安全です。
eval xargs -I_ cat _/'{11..15}'/{8..5}.jpg