"Eval echo" kullanmak her zaman güvenli midir?


20

Kullanılması evalkeyfi kod çalıştırılmasına izin verdiğinden genellikle önerilmez. Ancak, kullanırsak eval echo, dizenin geri kalanı argüman haline gelecektir, echobu yüzden güvenli olmalıdır. Bu konuda doğru muyum?


1
her zaman güvenli değil bir çatal bomba veya kötü rm -fR * şal olabilir
μολὼν.λαβέ

Belki de bu sadece bir düşünce denemesidir, ancak aslında bunu birden fazla argümanı iletmek için yapmayı düşünüyorsan, bunu bir dizi -ngibi echo $argumentsveya olmayan bir değişkenle yapabilirsiniz . Kullanılması o bile anlamsızdır edildi güvenli. $argumentsecho "${arguments[@]}"eval echo
JoL

Yanıtlar:


40

counterexample:

DANGEROUS=">foo"
eval echo $DANGEROUS

Keyfi argümanlar echo"foo" adlı bir dosya oluşturmaktan daha hain bir şey yapmış olabilirdi.


6
Ayrıca:, DANGEROUS="hello;ls"yerine rastgele komutlar için ls.
Kusalananda

2
Ayrıca: DANGEROUS='$(ls)'(daha fazla kaçış gerekebilir).
wizzwizz4

Çalışır mıydı eval echo '"'"$DANGEROUS"'"'? Görünüşe göre goo.gl/L2pPQP
Ismael Miguel

@IsmaelMiguel Bu, wizzwizz, Cyker veya sorontar'ın örnekleri veya dizede çift tırnak işareti olan herhangi bir şey (örneğin DANGEROUS='">foo"') için işe yaramaz .
Gordon Davisson

Lanet. Biraz yardımcı olan bir şey buldum
Ismael Miguel

26

@Celada mükemmel bir cevap verdi. Göstermek evalgerçekten kötüdür, işte "foo" adlı bir dosya oluşturmaktan daha hain bir şey :

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

Ve elbette "foo" adlı bir dosya oluşturmaktan daha hain bir şeyden daha hain bir şey olabilir .


8
Değişkeni "$THIS"sadece gibi yapmak yerine alıntı yapmanın $THISbile yardımcı olmadığını göstermek için +1 !
Celada

Ek bir çift tırnak göndermek yardımcı görünüyor. Gibi bir şey eval echo '"'"$DANGEROUS"'"'. DeneyinGoo.gl/L2pPQP deneyin
Ismael Miguel

Aslında, örneğiniz bundan daha kötü değildir >foo, çünkü "'foo' adında bir dosya oluşturmak" yeterli değildir >foo. Örneğinizin sahip olduğu tek gerçek fark, arkasında boş bir dosya bırakmamasıdır. İçeriği hala yok.
flarn2006

12

Hayır, her zaman güvenli değildir . Bir eval herhangi bir komutu yürütebilir.

Bunun gibi güvenli bir komut (tarih tek tırnak içinde olduğu için yürütülmez):

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

Eval ile birlikte kullanıldığında tehlikeli hale gelir:

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

Tabii ki, tarih herhangi bir komut olabilir .

Bunu iyileştirmenin bir yolu, aşağıdakileri değerlendirmek için argümanları alıntılamaktır:

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

Ancak bir ifadeyi iki kez doğru şekilde alıntılamak genellikle zordur.

Ve ifadenin harici bir saldırgan tarafından ayarlanabilmesi durumunda doğru alıntıyı kontrol etmek imkansız hale gelir:

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

1

Her evalzaman dikkatli bir şekilde yaklaşılması gerektiği doğru olsa da,eval echo inşaat hep anlamsız değildir ve olabilir güvenle kullanılabilir. Son zamanlarda onlara ihtiyacım olan sırayla değerlendirilen birden fazla küme ayracı genişletme almak için ona ihtiyaç vardı.

bash soldan sağa birden çok ayraç genişletmesi yapar,

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

genişler

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

ama önce ikinci brace genişlemesine ihtiyacım vardı,

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

Bunu yapabileceğim en iyi şey

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

Bu işe yarar çünkü tek tırnaklar ilk parantez kümesini, eval komut satırının işleminden çağrılan alt kabuk tarafından genişletilmesini sağlar eval.

Bunun bir adımda gerçekleşmesine izin veren iç içe geçmiş ayraç genişletmelerini içeren bazı kurnaz şema olabilir, ancak varsa çok görmek için aptalım. Ayrıca, bashbu tür şeyleri başarmanın daha düzenli yollarına izin veren kabuklar da vardır . Ancak her durumda, bu kullanımı evalgüvenlidir çünkü argümanlarının tümü parametre genişletmesi içermeyen sabit dizelerdir.


Yankıya ve burada komut değişikliğine ihtiyacınız yoktur (ki bu da $ IFS'ye bağımlıdır). Yapabilirsinizeval xargs -I_ cat _/'{11..15}'/{8..5}.jpg
Stéphane Chazelas

Bu da işe yarıyor, ancak xargs işlemi bitinceye kadar eval çubuğunun ortaya çıkardığı alt kabuk sürecini yapıyor; eval yankı sürümü, xargs başlamadan önce alt kabuğun ortadan kalmasını sağlar. Bu muhtemelen sadece benim gibi htop ağaç görünümleri ve set -x günlükleri :-) ne görünüyor hakkında anal olan diğerleri için önemlidir
flabdablet
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.