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 (<inputaria-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.