javascript / expert
Snippet
Deserialisierungs-Schutzhülle für unvertrauenswürdige JSON-Datenstrukturen
Parst rohe JSON-Payloads sicher, indem Prototyp-Pollution-Vektoren in der Reviver-Funktion des JSON-Parsers neutralisiert werden. Anschließend werden Eigenschaften auf ein prototypenloses Objekt via Object.create(null) übertragen und eingefroren, um unveränderlichen React-Zustand zu gewährleisten.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import { useState, useCallback } from 'react';function sanitizePayload(rawJson) {const parsed = JSON.parse(rawJson, (key, value) => {if (key === '__proto__' || key === 'constructor') return undefined;return value;});return Object.freeze(Object.assign(Object.create(null), parsed));}export function useSecurePayloadState(initialJson) {const [state, setState] = useState(() => sanitizePayload(initialJson));const updatePayload = useCallback((newJson) => {setState(sanitizePayload(newJson));}, []);return [state, updatePayload];}
react
Erklärung
1
const parsed = JSON.parse(rawJson, (key, value) => {
Verwendet den Reviver-Parameter von JSON.parse, um jedes Schlüssel-Wert-Paar während des Parsens zu prüfen.
2
if (key === '__proto__' || key === 'constructor') return undefined;
Filtert Attribute zur Prototypen-Kontaminierung vor der Objekt-Instanziierung heraus.
3
return Object.freeze(Object.assign(Object.create(null), parsed));
Erstellt ein prototypenloses Wörterbuch und friert die Objektstruktur ein.