File tree 2 files changed +13
-5
lines changed 2 files changed +13
-5
lines changed Original file line number Diff line number Diff line change @@ -68,13 +68,21 @@ module.exports = function (args, opts) {
68
68
69
69
function setKey ( obj , keys , value ) {
70
70
var o = obj ;
71
- keys . slice ( 0 , - 1 ) . forEach ( function ( key ) {
71
+ for ( var i = 0 ; i < keys . length - 1 ; i ++ ) {
72
+ var key = keys [ i ] ;
73
+ if ( key === '__proto__' ) return ;
72
74
if ( o [ key ] === undefined ) o [ key ] = { } ;
73
- if ( o [ key ] === { } . __proto__ ) o [ key ] = { } ;
75
+ if ( o [ key ] === Object . prototype || o [ key ] === Number . prototype
76
+ || o [ key ] === String . prototype ) o [ key ] = { } ;
77
+ if ( o [ key ] === Array . prototype ) o [ key ] = [ ] ;
74
78
o = o [ key ] ;
75
- } ) ;
79
+ }
76
80
77
81
var key = keys [ keys . length - 1 ] ;
82
+ if ( key === '__proto__' ) return ;
83
+ if ( o === Object . prototype || o === Number . prototype
84
+ || o === String . prototype ) o = { } ;
85
+ if ( o === Array . prototype ) o = [ ] ;
78
86
if ( o [ key ] === undefined || flags . bools [ key ] || typeof o [ key ] === 'boolean' ) {
79
87
o [ key ] = value ;
80
88
}
Original file line number Diff line number Diff line change @@ -4,7 +4,7 @@ var test = require('tape');
4
4
test ( 'proto pollution' , function ( t ) {
5
5
var argv = parse ( [ '--__proto__.x' , '123' ] ) ;
6
6
t . equal ( { } . x , undefined ) ;
7
- t . equal ( argv . __proto__ . x , 123 ) ;
7
+ t . equal ( argv . __proto__ . x , undefined ) ;
8
8
t . equal ( argv . x , undefined ) ;
9
9
t . end ( ) ;
10
10
} ) ;
@@ -14,7 +14,7 @@ test('proto pollution (array)', function (t) {
14
14
t . equal ( { } . z , undefined ) ;
15
15
t . deepEqual ( argv . x , [ 4 , 5 ] ) ;
16
16
t . equal ( argv . x . z , undefined ) ;
17
- t . equal ( argv . x . __proto__ . z , 789 ) ;
17
+ t . equal ( argv . x . __proto__ . z , undefined ) ;
18
18
t . end ( ) ;
19
19
} ) ;
20
20
You can’t perform that action at this time.
0 commit comments