@@ -79,4 +79,45 @@ test('MemberExpressions from Functions unresolved', function(t) {
7979 var ast = parse ( src ) . body [ 0 ] . expression ;
8080 var res = evaluate ( ast , { } ) ;
8181 t . equal ( res , undefined ) ;
82- } ) ;
82+ } ) ;
83+
84+ test ( 'disallow accessing constructor or __proto__' , function ( t ) {
85+ t . plan ( 4 )
86+
87+ var someValue = { } ;
88+
89+ var src = 'object.constructor' ;
90+ var ast = parse ( src ) . body [ 0 ] . expression ;
91+ var res = evaluate ( ast , { vars : { object : someValue } } ) ;
92+ t . equal ( res , undefined ) ;
93+
94+ var src = 'object["constructor"]' ;
95+ var ast = parse ( src ) . body [ 0 ] . expression ;
96+ var res = evaluate ( ast , { vars : { object : someValue } } ) ;
97+ t . equal ( res , undefined ) ;
98+
99+ var src = 'object.__proto__' ;
100+ var ast = parse ( src ) . body [ 0 ] . expression ;
101+ var res = evaluate ( ast , { vars : { object : someValue } } ) ;
102+ t . equal ( res , undefined ) ;
103+
104+ var src = 'object["__pro"+"t\x6f__"]' ;
105+ var ast = parse ( src ) . body [ 0 ] . expression ;
106+ var res = evaluate ( ast , { vars : { object : someValue } } ) ;
107+ t . equal ( res , undefined ) ;
108+ } ) ;
109+
110+
111+ test ( 'constructor at runtime only' , function ( t ) {
112+ t . plan ( 2 )
113+
114+ var src = '(function myTag(y){return ""[!y?"__proto__":"constructor"][y]})("constructor")("console.log(process.env)")()'
115+ var ast = parse ( src ) . body [ 0 ] . expression ;
116+ var res = evaluate ( ast ) ;
117+ t . equal ( res , undefined ) ;
118+
119+ var src = '(function(prop) { return {}[prop ? "benign" : "constructor"][prop] })("constructor")("alert(1)")()'
120+ var ast = parse ( src ) . body [ 0 ] . expression ;
121+ var res = evaluate ( ast ) ;
122+ t . equal ( res , undefined ) ;
123+ } ) ;
0 commit comments