Rumah > hujung hadapan web > tutorial js > Langkah-langkah untuk Mencegah Serangan Pencemaran Prototaip dalam JavaScript

Langkah-langkah untuk Mencegah Serangan Pencemaran Prototaip dalam JavaScript

王林
Lepaskan: 2024-07-19 14:43:50
asal
1254 orang telah melayarinya

Steps to Preventing Prototype Pollution Attacks in JavaScript

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!

Apakah Pencemaran Prototaip?

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.

Bagaimana Pencemaran Prototaip Berlaku

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

Salin selepas log masuk

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

Salin selepas log masuk

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.

Mencegah Pencemaran Prototaip

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

Salin selepas log masuk

Sebaliknya, buat kaedah utiliti dalam ruang nama anda sendiri:

const myUtils = {
  polluted: function() {
    // Your method implementation
  }
};

let obj = {};
console.log(obj.polluted); // undefined

Salin selepas log masuk

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);
}

Salin selepas log masuk

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

Salin selepas log masuk

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

Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

Jalankan arahan ini untuk mengimbas projek anda untuk mengesan kelemahan. Ia menyediakan laporan isu yang ditemui dan mencadangkan langkah pemulihan.

Kesimpulan

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan