On Dec 28, 2011, at 11:58 AM, gaz Heyes wrote:
> I'd also like to add that __proto__ allows valid JSON to change it's object
> type and allow functions within properties. There isn't a compelling exploit
> scenerio for this yet but who knows what is possible if setters come into the
> equation.
I assume by "valid JSON" you really mean any object literal rather than the use
of the built-in JSON.parse function.
The ES5.1 specification for JSON.parse, if strictly followed, should not set
the the [[Prototype]] of the object created by JSON.parse('{"__proto__": []}')
to anything other than Object.prototype. The JSON.parse spec. explicitly says
that [[DefineOwnProperty]] is used to create for create properties. The spec.
for JSON.parse also says "It is not permitted for a conforming implementation
of JSON.parse to extend the JSON grammars". It is probably debatable whether
or not giving "__proto__" special meaning would is iimplicitly a grammar
change. However, the intent of that statement was that JSON.parse should must
operate as specified and without extension.
Firefox (9 at least) appears to conform to the JSON.parse spec. in this regard.
TC39 has already agreed that as in ES.next is would provide a a normative
specification for an "optional" __proto__ feature. This is a good reminder
that when we do that we need to carefully specify details such as requiring
that JSON.parse does not recognize it.
>
> alert(({"__proto__":[]}).sort)
> alert(({"__proto__":function::['parent']}).location)
The second example threw me for a while until I figured out that :: is an e4X
construct. A conforming implementation of JSON.parse should reject such syntax.
Allen
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss