javascript / expert
Snippet
Eindämmung von Prototype Pollution in tief verschachtelten React-Zustandshydrierungs-Objekten
Beim Wiederherstellen von externem Zustand in React-Anwendungen (z. B. SSR-Rehydrierung oder localStorage-Synchronisierung) können Angreifer bösartige Eigenschaften in Object.prototype einfügen. Die Verwendung von Wörterbuchobjekten ohne Prototypenketten und die explizite Überprüfung verbotener Eigenschaftsschlüssel neutralisieren Prototype-Pollution-Bedrohungen.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function safeHydrateState(target, source) {const cleanTarget = target ?? Object.create(null);for (const key of Object.keys(source)) {if (key === '__proto__' || key === 'constructor' || key === 'prototype') {continue;}const val = source[key];if (val && typeof val === 'object' && !Array.isArray(val)) {cleanTarget[key] = safeHydrateState(cleanTarget[key], val);} else {cleanTarget[key] = val;}}return cleanTarget;}
react
Erklärung
1
const cleanTarget = target ?? Object.create(null);
Instanziiert ein prototypenlos Objekt mit Object.create(null), um Exploits durch Vererbungssuche zu verhindern.
2
if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
Filtert gefährliche Objekteigenschaftsschlüssel heraus, die den Root-Object-Prototyp bei rekursiven Merges manipulieren können.
3
cleanTarget[key] = safeHydrateState(cleanTarget[key], val);
Führt verschachtelte Objektbäume rekursiv zusammen und behält dabei die Regeln zur Isolierung von Eigenschaften bei.