Node.js安全解析JSON的代码实例

338 阅读1分钟

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    👈

就是这样!