@@ -79,4 +79,45 @@ test('MemberExpressions from Functions unresolved', function(t) {
79
79
var ast = parse ( src ) . body [ 0 ] . expression ;
80
80
var res = evaluate ( ast , { } ) ;
81
81
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