Aniqlangan har qanday prototype pollution zaifligini, ekspluatatsiya qilinadigan gadjet bilan bog'liqmi yoki yo'qmi, tuzatishni tavsiya qilamiz. Kelajakdagi kod yoki kutubxona yangilanishlari yangi gadjetlarni keltirib chiqarmasligiga kafolat yo'q.
Kalitlarni merge'dan oldin tozalash — __proto__ kabi kalitlar kiritilishini oldini oladi. Ruxsat etilgan kalitlar oq ro'yxati (allowlist) eng samarali usul. Qora ro'yxat (blocklist) esa nozik — ko'p saytlar __proto__ ni bloklaydi, lekin constructor orqali ifloslanishni hisobga olmaydi. Shuning uchun buni faqat vaqtinchalik yechim sifatida tavsiya qilamiz.
Mustahkamroq yondashuv — prototip obyektlarini umuman o'zgartirib bo'lmaydigan qilish. Object.freeze() obyekt xususiyatlarini o'zgartirib bo'lmasligini va yangi xususiyat qo'shib bo'lmasligini ta'minlaydi:
Object.freeze(Object.prototype);Object.seal() metodi o'xshash, lekin mavjud xususiyatlarning qiymatlarini o'zgartirishga ruxsat beradi — agar Object.freeze() ni ishlatib bo'lmasa, yaxshi murosa.
Gadjetlarni yo'q qilish uchun obyektni Object.create(null) bilan yaratib, null prototipli qilishingiz mumkin — bunday obyekt hech qanday xususiyat meros olmaydi:
let myObject = Object.create(null);
Object.getPrototypeOf(myObject); // nullYana bir mustahkam himoya — ichki himoyaga ega obyektlardan foydalanish. Masalan, config obyekti o'rniga Map ishlating — uning get() metodi faqat map'ning o'zida aniqlangan xususiyatlarni qaytaradi:
Object.prototype.evil = 'polluted';
let options = new Map();
options.set('transport_url', 'https://normal-website.com');
options.get('evil'); // undefined
options.get('transport_url'); // 'https://normal-website.com'Faqat qiymatlarni saqlash uchun Set ham xuddi shunday muqobil — uning has() metodi ham faqat to'g'ridan-to'g'ri aniqlangan xususiyatlarni qaytaradi.