Выбор ответа Senior Безопасность бэкенда обновлено
Prototype pollution через merge
Вопрос
Что выведет код?
function merge(target, src) {
for (const k in src) {
if (typeof src[k] === 'object') {
target[k] = target[k] || {};
merge(target[k], src[k]);
} else target[k] = src[k];
}
return target;
}
merge({}, JSON.parse('{"__proto__": {"isAdmin": true}}'));
console.log({}.isAdmin);
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: true. JSON.parse создаёт обычное собственное свойство с именем proto.
Варианты ответа
trueправильный ответundefined- TypeError
false
Разбор
JSON.parse создаёт обычное собственное свойство с именем __proto__. Но в merge выражение target["__proto__"] возвращает Object.prototype, и рекурсия записывает isAdmin прямо в него. Теперь у любого объекта есть isAdmin: true. Это prototype pollution.
undefinedбыло бы при безопасном слиянии.- Ошибки не возникает, запись в прототип разрешена.
falseнегде взять, записаноtrue.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Безопасность бэкенда»
- Безопасный INSERT: параметры и белый список колонок
- CORS: проверка Origin по белому списку
- Проверка claims JWT после подписи
- deepMerge без prototype pollution
- Rate limiter на token bucket
- Кто превысил лимит запросов: скользящее окно
- Код-ревью: регистрация, вход и сброс пароля
- Как защитить Node.js API