parse Node.js提供了一个全局的JSON 对象,提供了将JSON字符串转化为JavaScript的方法,或者将JavaScript值转化为JSON字符串的方法stringify 。
问题是,JavaScript的全局JSON 对象有一个缺陷,允许原型污染攻击。本教程告诉你如何用原型污染保护安全地解析JSON。
原型污染的简述
请看以下说明原型污染的代码片断:
const json = '{"name":"Supercharge", "__proto__": { "x": 1 }}'
const a = JSON.parse(json)
// { name: 'Supercharge' }
console.log(a.x)
// undefined
const b = Object.assign({}, a)
console.log(b.x)
// 1
JSON.parse 保留 属性作为解析对象的一个键。当把该对象分配给另一个对象或把值复制到另一个对象时,这就成为一个问题。然后, 属性成为新对象的原型。__proto__ __proto__
安全JSON.parse
这就是为什么我们开发了@supercharge/json包来安全地解析JSON字符串。在解析对象时,@supercharge/json 删除了constructor 和__proto__ 的键。
在上面的例子中使用@supercharge/json ,通过删除注入的原型属性来保证你的代码安全:
const JSON = require('@supercharge/json')
const json = '{"name":"Supercharge", "__proto__": { "x": 1 }}'
const a = JSON.parse(json)
// { name: 'Supercharge' }
console.log(a.x)
// undefined
const b = Object.assign({}, a)
console.log(b.x)
// undefined 👈
就是这样!