Skip to content

Commit 234e343

Browse files
committed
fix: prototype pollution
for curiousity’s sake, I checked if this has any significant performance impact and it does not. Based on 10 runs before and after, all values in percent: MED AVG get first level property 0.37 0.42 get second level property 0.40 0.61 get third level property 0.26 0.41 set first level property 2.25 2.16 set second level property 1.45 1.67 set third level property 2.05 1.98 push property into array -0.41 -0.51 2.25% slowdown as a worst case is not significant.
1 parent dc3ea9b commit 234e343

File tree

2 files changed

+11
-0
lines changed

2 files changed

+11
-0
lines changed

jsonpointer.js

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ function setter (obj, pointer, value) {
1717
var part
1818
var hasNextPart
1919

20+
if (pointer[1] === 'constructor' && pointer[2] === 'prototype') return obj
21+
if (pointer[1] === '__proto__') return obj
22+
2023
for (var p = 1, len = pointer.length; p < len;) {
2124
part = untilde(pointer[p++])
2225
hasNextPart = len > p

test.js

+8
Original file line numberDiff line numberDiff line change
@@ -128,4 +128,12 @@ assert.equal(pointer.set(a, 'test'), 'bar')
128128
assert.equal(pointer.get(a), 'test')
129129
assert.deepEqual(a, {foo: 'test'})
130130

131+
var b = {}
132+
jsonpointer.set({}, '/constructor/prototype/boo', 'polluted')
133+
assert(!b.boo, 'should not boo')
134+
135+
var c = {}
136+
jsonpointer.set({}, '/__proto__/boo', 'polluted')
137+
assert(!c.boo, 'should not boo')
138+
131139
console.log('All tests pass.')

0 commit comments

Comments
 (0)