@@ -109,6 +109,56 @@ describe('Vulnerabilities', () => {
109109      ) ; 
110110    } ) ; 
111111
112+     it ( 'denies creating a cloud trigger with polluted data' ,  async  ( )  =>  { 
113+       Parse . Cloud . beforeSave ( 'TestObject' ,  ( {  object } )  =>  { 
114+         object . set ( 'obj' ,  { 
115+           constructor : { 
116+             prototype : { 
117+               dummy : 0 , 
118+             } , 
119+           } , 
120+         } ) ; 
121+       } ) ; 
122+       await  expectAsync ( new  Parse . Object ( 'TestObject' ) . save ( ) ) . toBeRejectedWith ( 
123+         new  Parse . Error ( 
124+           Parse . Error . INVALID_KEY_NAME , 
125+           'Prohibited keyword in request data: {"key":"constructor"}.' 
126+         ) 
127+       ) ; 
128+     } ) ; 
129+ 
130+     it ( 'denies creating a hook with polluted data' ,  async  ( )  =>  { 
131+       const  express  =  require ( 'express' ) ; 
132+       const  bodyParser  =  require ( 'body-parser' ) ; 
133+       const  port  =  34567 ; 
134+       const  hookServerURL  =  'http://localhost:'  +  port ; 
135+       const  app  =  express ( ) ; 
136+       app . use ( bodyParser . json ( {  type : '*/*'  } ) ) ; 
137+       const  server  =  await  new  Promise ( resolve  =>  { 
138+         const  res  =  app . listen ( port ,  undefined ,  ( )  =>  resolve ( res ) ) ; 
139+       } ) ; 
140+       app . post ( '/BeforeSave' ,  function  ( req ,  res )  { 
141+         const  object  =  Parse . Object . fromJSON ( req . body . object ) ; 
142+         object . set ( 'hello' ,  'world' ) ; 
143+         object . set ( 'obj' ,  { 
144+           constructor : { 
145+             prototype : { 
146+               dummy : 0 , 
147+             } , 
148+           } , 
149+         } ) ; 
150+         res . json ( {  success : object  } ) ; 
151+       } ) ; 
152+       await  Parse . Hooks . createTrigger ( 'TestObject' ,  'beforeSave' ,  hookServerURL  +  '/BeforeSave' ) ; 
153+       await  expectAsync ( new  Parse . Object ( 'TestObject' ) . save ( ) ) . toBeRejectedWith ( 
154+         new  Parse . Error ( 
155+           Parse . Error . INVALID_KEY_NAME , 
156+           'Prohibited keyword in request data: {"key":"constructor"}.' 
157+         ) 
158+       ) ; 
159+       await  new  Promise ( resolve  =>  server . close ( resolve ) ) ; 
160+     } ) ; 
161+ 
112162    it ( 'allows BSON type code data in write request with custom denylist' ,  async  ( )  =>  { 
113163      await  reconfigureServer ( { 
114164        requestKeywordDenylist : [ ] , 
0 commit comments