Bourne. JSON Bourne.
JSON.parse() drop-in replacement with prototype
poisoning protection
Introduction
Consider this:
> const a = '{"__proto__":{ "b":5}}';
'{"__proto__":{ "b":5}}'
> const b = JSON.parse(a);
{ __proto__: { b: 5 } }
> b.b;
undefined
> const c = Object.assign({}, b);
{}
> c.b
5
The problem is that JSON.parse() retains the
__proto__ property as a plain object key. By itself, this
is not a security issue. However, as soon as that object is assigned to
another or iterated on and values copied, the __proto__
property leaks and becomes the object’s prototype.
API
Bourne.parse(text, [reviver], [options])
Parses a given JSON-formatted text into an object where: -
text - the JSON text string. - reviver - the
JSON.parse() optional reviver argument. -
options - optional configuration object where: -
protoAction - optional string with one of: -
'error' - throw a SyntaxError when a
__proto__ key is found. This is the default value. -
'remove' - deletes any __proto__ keys from the
result object. - 'ignore' - skips all validation (same as
calling JSON.parse() directly).
Bourne.scan(obj, [options])
Scans a given object for prototype properties where: -
obj - the object being scanned. - options -
optional configuration object where: - protoAction -
optional string with one of: - 'error' - throw a
SyntaxError when a __proto__ key is found.
This is the default value. - 'remove' - deletes any
__proto__ keys from the input obj.
