Penggunaan eval
sering tidak dianjurkan karena memungkinkan eksekusi kode arbitrer. Namun, jika kita gunakan eval echo
, maka sepertinya seluruh string akan menjadi argumen echo
sehingga harus aman. Apakah saya benar dalam hal ini?
20
-n
, Anda bisa melakukannya dengan variabel yang tidak dikutip sepertiecho $arguments
atau jika$arguments
arrayecho "${arguments[@]}"
. Menggunakaneval echo
adalah sia-sia bahkan jika itu adalah aman.Jawaban:
Contoh tandingan:
Argumen sewenang-wenang untuk
echo
bisa melakukan sesuatu yang lebih jahat daripada membuat file yang disebut "foo".sumber
DANGEROUS="hello;ls"
:, untuk perintah sewenang-wenang menggantikanls
.DANGEROUS='$(ls)'
(lebih banyak melarikan diri mungkin diperlukan).eval echo '"'"$DANGEROUS"'"'
bekerja Tampaknya untuk goo.gl/L2pPQPDANGEROUS='">foo"'
).@Celada telah memberikan jawaban yang sangat baik. Untuk menunjukkan
eval
itu benar-benar jahat, berikut ini sesuatu yang lebih jahat daripada membuat file bernama "foo" :Dan tentu saja bisa ada sesuatu yang lebih jahat daripada sesuatu yang lebih jahat daripada membuat file yang disebut "foo" .
sumber
"$THIS"
daripada hanya suka$THIS
saja tidak membantu!eval echo '"'"$DANGEROUS"'"'
. Cobalah di goo.gl/L2pPQP>foo
, karena "membuat file bernama 'foo'" belum tentu>foo
demikian. Satu-satunya perbedaan nyata yang dimiliki contoh Anda adalah tidak meninggalkan file kosong. Isinya masih hilang.Tidak, itu tidak selalu aman. Sebuah eval bisa menjalankan perintah apa pun.
Perintah yang aman, seperti ini (tanggal tidak dieksekusi karena berada di dalam tanda kutip tunggal):
Menjadi berbahaya jika digunakan dengan eval:
Tentu saja, date bisa berupa perintah apa saja .
Salah satu cara untuk meningkatkan ini adalah dengan mengutip argumen untuk eval:
Tetapi biasanya sulit untuk mengutip dengan benar dua kali ekspresi.
Dan menjadi tidak mungkin untuk mengontrol kutipan yang benar jika ekspresi dapat diatur oleh penyerang eksternal, seperti:
sumber
Meskipun benar bahwa
eval
selalu perlu didekati dengan hati-hati,eval echo
konstruksi tidak selalu sia-sia dan dapat digunakan dengan aman. Saya baru-baru ini membutuhkannya untuk mendapatkan beberapa ekspansi brace dievaluasi dalam urutan yang saya butuhkan.bash
melakukan beberapa ekspansi brace dari kiri ke kanan, jadimeluas ke
tapi saya perlu ekspansi brace kedua dilakukan pertama, menghasilkan
Yang terbaik yang bisa saya lakukan untuk melakukan itu adalah
Ini bekerja karena tanda kutip tunggal melindungi set kawat gigi pertama dari ekspansi selama penguraian
eval
baris perintah, membiarkannya diperluas oleh subkulit yang dipanggil oleheval
.Mungkin ada beberapa skema licik yang melibatkan ekspansi penjepit bersarang yang memungkinkan ini terjadi dalam satu langkah, tetapi jika ada saya terlalu tua dan bodoh untuk melihatnya. Ada juga cangkang selain
bash
yang memungkinkan cara yang lebih rapi untuk mencapai hal semacam ini. Namun bagaimanapun, penggunaaneval
ini aman karena argumennya adalah semua string tetap yang tidak mengandung ekspansi parameter.sumber
eval xargs -I_ cat _/'{11..15}'/{8..5}.jpg