Dalam dunia keselamatan web, pencemaran prototaip adalah kelemahan yang halus namun berpotensi memusnahkan yang boleh membawa kepada akibat yang teruk jika tidak ditangani dengan betul. Dalam blog ini, kita akan meneroka apa itu pencemaran prototaip, bagaimana ia berlaku, dan yang paling penting, bagaimana untuk mencegahnya. Jom terjun!
Pencemaran prototaip ialah sejenis kerentanan yang mempengaruhi aplikasi JavaScript. Ia berlaku apabila penyerang dapat menyuntik sifat ke dalam prototaip objek, yang kemudiannya boleh merambat ke semua objek yang mewarisi daripada prototaip ini. Ini boleh membawa kepada tingkah laku yang tidak dijangka, termasuk keupayaan untuk menimpa kaedah dan sifat sedia ada, akhirnya menjejaskan keselamatan dan kefungsian aplikasi.
Untuk memahami cara pencemaran prototaip berlaku, kita perlu melihat dengan lebih dekat objek dan prototaip JavaScript. Dalam JavaScript, setiap objek mempunyai prototaip, iaitu objek lain dari mana objek pertama mewarisi sifat dan kaedah. Rantaian prototaip ini membolehkan pencarian harta yang cekap tetapi juga membuka pintu untuk kemungkinan serangan jika tidak dikendalikan dengan betul.
Berikut ialah contoh mudah bagaimana pencemaran prototaip boleh berlaku:
let obj = {}; console.log(obj.constructor); // function Object() { [native code] } obj.__proto__.polluted = true; console.log({}.polluted); // true
Dalam contoh ini, dengan mengubah suai sifat proto obj, kami secara tidak sengaja menjejaskan semua objek yang berkongsi prototaip yang sama, menunjukkan betapa mudahnya mencemarkan rantaian prototaip.
Contoh Pencemaran Prototaip Dunia Sebenar
Pertimbangkan senario di mana input pengguna digunakan untuk memanjangkan atau menggabungkan objek tanpa pengesahan yang betul. Kes penggunaan biasa ialah menggabungkan parameter pertanyaan ke dalam objek konfigurasi.
const merge = require('lodash/merge'); let config = {}; let query = JSON.parse('{"__proto__":{"admin":true}}'); merge(config, query); console.log(config.admin); // undefined console.log({}.admin); // true
Dalam contoh ini, fungsi gabungan daripada perpustakaan Lodash digunakan untuk menggabungkan konfigurasi dengan pertanyaan. Walau bagaimanapun, objek pertanyaan dikawal penyerang termasuk harta proto yang mencemarkan prototaip objek global, menetapkan pentadbir kepada benar untuk semua objek.
Untuk melindungi aplikasi anda daripada pencemaran prototaip, pertimbangkan untuk melaksanakan langkah berikut:
1. Elakkan Memanjangkan Prototaip Asli:
Jangan lanjutkan prototaip asli (cth., Object.prototype) secara langsung, kerana ia boleh membawa kepada konflik dan kelemahan keselamatan.
Contoh: Elakkan Memanjangkan Prototaip Asli
Elakkan melakukan ini:
Object.prototype.polluted = true; // Extending native prototype let obj = {}; console.log(obj.polluted); // true
Sebaliknya, buat kaedah utiliti dalam ruang nama anda sendiri:
const myUtils = { polluted: function() { // Your method implementation } }; let obj = {}; console.log(obj.polluted); // undefined
2. Sahkan Input Pengguna:
Sentiasa sahkan dan bersihkan input pengguna sebelum menggunakannya untuk membina atau mengubah suai objek. Gunakan perpustakaan seperti Joi atau Validator untuk menguatkuasakan peraturan pengesahan input yang ketat.
Contoh: Sahkan Input Pengguna Menggunakan Joi
const Joi = require('joi'); const schema = Joi.object({ admin: Joi.boolean().required() }); const input = JSON.parse('{"admin":true}'); const { error, value } = schema.validate(input); if (error) { console.error('Invalid input:', error.details); } else { console.log('Valid input:', value); }
3. Gunakan Kaedah Objek Selamat:
Lebih suka menggunakan kaedah objek selamat yang tidak melintasi rantai prototaip, seperti Object.create(null) untuk mencipta objek biasa tanpa prototaip.
Contoh: Gunakan Kaedah Objek Selamat
let safeObj = Object.create(null); safeObj.admin = false; console.log(safeObj.constructor); // undefined console.log(safeObj.admin); // false
4. Membekukan Prototaip:
Bekukan Object.prototype untuk mengelakkan pengubahsuaian pada rantai prototaip. Ini boleh dilakukan menggunakan Object.freeze().
Contoh: Membekukan Prototaip
Object.freeze(Object.prototype); let obj = {}; try { obj.__proto__.polluted = true; } catch (e) { console.error('Attempt to modify prototype failed:', e); } console.log({}.polluted); // undefined
5. Kemas kini Ketergantungan:
Kemas kini kebergantungan anda secara kerap untuk memastikan anda menggunakan versi terkini yang termasuk tampung keselamatan. Kerentanan dalam perpustakaan pihak ketiga sering dieksploitasi untuk serangan pencemaran prototaip.
Contoh: Mengemas kini Ketergantungan Menggunakan npm
npm update
Jalankan arahan ini dengan kerap untuk memastikan semua pakej anda dikemas kini.
6. Pantau dan Uji:
Laksanakan pemantauan dan ujian automatik untuk mengesan dan mengurangkan kelemahan pencemaran prototaip. Alat seperti audit npm boleh membantu mengenal pasti pakej yang terdedah dalam projek anda.
Contoh: Pemantauan dan Pengujian dengan audit npm
npm audit
Jalankan arahan ini untuk mengimbas projek anda untuk mengesan kelemahan. Ia menyediakan laporan isu yang ditemui dan mencadangkan langkah pemulihan.
Pencemaran prototaip ialah kelemahan kritikal yang boleh membawa kesan yang meluas jika dibiarkan. Dengan memahami cara ia berlaku dan melaksanakan amalan terbaik untuk menghalangnya, anda boleh meningkatkan keselamatan aplikasi JavaScript anda dengan ketara. Kekal berwaspada, pastikan kebergantungan anda dikemas kini dan sentiasa sahkan input pengguna untuk melindungi daripada vektor serangan berbahaya ini.
Jika anda mendapati blog ini membantu, pastikan anda berkongsi dengan rakan pembangun dan peminat keselamatan anda. Kekal termaklum dan proaktif adalah kunci untuk mengekalkan keselamatan web yang teguh. Selamat mengekod!
Atas ialah kandungan terperinci Langkah-langkah untuk Mencegah Serangan Pencemaran Prototaip dalam JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!