Dari manual findutils:
Misalnya membangun seperti dua perintah ini
# risky find -exec sh -c "something {}" \; find -execdir sh -c "something {}" \;sangat berbahaya. Alasan untuk ini adalah bahwa '{}' diperluas ke nama file yang mungkin mengandung titik koma atau karakter lain yang khusus untuk shell. Jika misalnya seseorang membuat file
/tmp/foo; rm -rf $HOMEmaka dua perintah di atas dapat menghapus direktori home seseorang.Jadi untuk alasan ini, jangan jalankan perintah apa pun yang akan meneruskan data yang tidak dipercaya (seperti nama file) ke perintah yang menafsirkan argumen sebagai perintah yang akan ditafsirkan lebih lanjut (misalnya 'sh').
Dalam kasus shell, ada solusi cerdas untuk masalah ini:
# safer find -exec sh -c 'something "$@"' sh {} \; find -execdir sh -c 'something "$@"' sh {} \;Pendekatan ini tidak dijamin untuk menghindari setiap masalah, tetapi jauh lebih aman daripada mengganti data pilihan penyerang ke dalam teks perintah shell.
- Apakah penyebab masalah
find -exec sh -c "something {}" \;adalah penggantian untuk{}tidak dikutip dan karenanya tidak diperlakukan sebagai string tunggal? Dalam solusinya
find -exec sh -c 'something "$@"' sh {} \;,pertama
{}diganti, tetapi karena{}tidak dikutip, tidak"$@"juga memiliki masalah yang sama dengan perintah aslinya? Sebagai contoh,"$@"akan diperluas untuk"/tmp/foo;","rm","-rf", dan"$HOME"?mengapa
{}tidak luput atau dikutip?
- Bisakah Anda memberikan contoh lain (masih dengan
sh -c, atau tanpa itu jika berlaku; dengan atau tanpafindyang mungkin tidak perlu) di mana masalah dan solusi yang sama berlaku, dan yang merupakan contoh minimal sehingga kita dapat fokus pada masalah dan solusi dengan sedikit gangguan mungkin? Lihat Cara untuk memberikan argumen pada perintah yang dijalankan oleh `bash -c`
Terima kasih.