Загрязнение прототипа — это уязвимость, при которой злоумышленник манипулирует Object.prototype, в результате чего все объекты в приложении наследуют вредоносные или неожиданные свойства.
__proto__, constructor и prototype перед объединением или присваиванием данных, полученных от пользователя, объектамObject.create(null) для обычных объектов-словарей — это создаёт объекты без цепочки прототипов, устраняя поверхность атакиObject.freeze(Object.prototype), чтобы предотвратить любые изменения во время выполнения// Безопасная проверка ключа перед присваиванием
function safeSet(obj, key, value) {
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
return; // отклоняем опасные ключи
}
obj[key] = value;
}
// Словарь без прототипа
const safeDict = Object.create(null);
// Заморозь прототип
Object.freeze(Object.prototype);
lodash (новые версии закрывают эту уязвимость)Map обычным объектам при хранении произвольных ключей, полученных от пользователяJoi, Zod) для обеспечения строгой структуры входных данных перед обработкойЗагрязнение прототипа может привести к повышению привилегий, отказу в обслуживании или удалённому выполнению кода в зависимости от контекста приложения, что делает это критической уязвимостью, о которой стоит позаботиться заранее.
Объекты, созданные с помощью Object.create(null), по-прежнему наследуют от Object.prototype, но предотвращают прямое загрязнение свойства __proto__.
Новый — ещё не проверен сообществом
Вы