Findutils 'el kitabından:
Örneğin, bu iki komut gibi yapılar
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;
çok tehlikelidir. Bunun nedeni, '{}' öğesinin noktalı virgül veya kabuğa özel diğer karakterleri içerebilecek bir dosya adına genişletilmesidir. Örneğin birisi dosyayı oluşturursa
/tmp/foo; rm -rf $HOME
yukarıdaki iki komut birinin giriş dizinini silebilir.Bu nedenle, bağımsız değişkenleri daha fazla yorumlanacak komutlar olarak yorumlayan komutlara (örneğin 'sh') güvenilmeyen verileri (dosya adlarının adları gibi) iletecek herhangi bir komut çalıştırmayın.
Kabuk durumunda, bu sorun için akıllı bir geçici çözüm vardır:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;
Bu yaklaşımın her problemden kaçınacağı garanti edilmez, ancak bir saldırganın seçtiği verileri bir kabuk komutunun metnine koymaktan çok daha güvenlidir.
- Sorunun nedeni
find -exec sh -c "something {}" \;
, değiştirilmesinin{}
alıntılanmamış olması ve bu nedenle tek bir dize olarak ele alınmaması mı? Çözümde
find -exec sh -c 'something "$@"' sh {} \;
,Birincisi
{}
değiştirilir, ancak{}
alıntı yapılmadığından"$@"
, orijinal komutla aynı problemi yoktur? Örneğin,"$@"
genişletilmiş etmek olacaktır"/tmp/foo;"
,"rm"
,"-rf"
ve"$HOME"
?neden
{}
kaçmıyor ya da alıntı yapılmıyor?
- Aynı tür problem ve çözümlerin uygulandığı ve sorun ve çözüm üzerine odaklanabilmemiz için asgari örnekler olan başka örnekler verebilir misiniz (hala
sh -c
varsa veya olmasa;find
gerekli olan veya olmayan gerekli) mümkün olduğunca az dikkat dağıtıcı? Bkz Yolları bash -c` `tarafından yürütülen bir komuta argümanlar sunmak
Teşekkürler.