Skip to content

Commit 7f8b16c

Browse files
committed
fix(deepMerge): prototype pollution
1 parent 1106872 commit 7f8b16c

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

src/object.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,16 @@ describe('deepMerge', () => {
5151
const obj2 = { a: ['C'], b: ['D'] }
5252
expect(deepMerge({}, obj1, obj2)).toEqual({ a: ['C'], b: ['D'] })
5353
})
54+
55+
it('prototype pollution 1', () => {
56+
const obj = {} as any
57+
const obj2 = {} as any
58+
const payload = JSON.parse('{"__proto__":{"polluted":"Polluted!"}}')
59+
60+
expect(obj.polluted).toBeUndefined()
61+
expect(obj2.polluted).toBeUndefined()
62+
deepMerge(obj, payload)
63+
expect(obj.polluted).toBeUndefined()
64+
expect(obj2.polluted).toBeUndefined()
65+
})
5466
})

src/object.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ export function deepMerge<T extends object = object, S extends object = T>(targe
8282

8383
if (isMergableObject(target) && isMergableObject(source)) {
8484
objectKeys(source).forEach((key) => {
85+
if (key === '__proto__' || key === 'constructor' || key === 'prototype')
86+
return
87+
8588
// @ts-expect-error
8689
if (isMergableObject(source[key])) {
8790
// @ts-expect-error

0 commit comments

Comments
 (0)