0 Tage Serie
javascript / intermediate
Snippet

Schutz vor Prototype Pollution in React State-Update-Handlern

Beim dynamischen Setzen von verschachteltem Objektstatus in React über Benutzereingaben könnten Angreifer versuchen, über manipulierte Schlüssel `Object.prototype` zu manipulieren. Die Verwendung eines Sets verbotener Bezeichner zusammen mit `Object.freeze` und prototypenlosen Objekten via `Object.create(null)` verhindert Angriffe durch Prototype Pollution.

snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import { useState } from 'react';
const FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
export function SecureNestedForm() {
const [profile, setProfile] = useState(() => Object.create(null));
const handleDeepFieldUpdate = (keyPath, value) => {
if (FORBIDDEN_KEYS.has(keyPath)) {
throw new TypeError(`Restricted property assignment: ${keyPath}`);
}
setProfile((prev) => {
const sanitizedKey = String(keyPath).trim();
return Object.freeze({
...prev,
[sanitizedKey]: typeof value === 'string' ? value.slice(0, 100) : value
});
});
};
return (
<input
aria-label="User Bio"
onChange={(e) => handleDeepFieldUpdate('bio', e.target.value)}
value={profile.bio || ''}
/>
);
}
react
Erklärung
1
const FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
Deklariert ein Set mit gefährlichen Schlüsseln, die für Prototype-Pollution-Angriffe genutzt werden können.
2
const [profile, setProfile] = useState(() => Object.create(null));
Initialisiert den React-Zustand mit einem Wörterbuch-Objekt ohne Prototypen-Kette.
3
return Object.freeze({
Friert das resultierende Zustandsobjekt unveränderlich ein, um nachgelagerte Mutationen zu verhindern.