JSON.parse

时间:2018-08-16 11:52:58

标签: javascript json node.js security v8

我需要从不受信任的json获取javascript对象。

最初,它以字符串形式出现,并且有两种完成任务的方式:eval()JSON.parse()

在这里我可以看到JSON.parse的Node.js实现,因为恐怕它在后台使用了eval,并且可能存在安全漏洞。

我试图检查v8仓库,甚至在Firefox中尝试了Function.prototype.toSource()-没有结果。

有人可以为我提供一些我不用担心使用的证据吗?

2 个答案:

答案 0 :(得分:2)

V8开发人员在这里。 JSON.parse并不在幕后使用eval-正是拥有JSON.parse的意义所在,以及为什么强烈建议使用它(而不是eval)来解析JSON数据。

正如Feeela所指出的那样,如果您想自己验证一下,请查看源代码:https://github.com/v8/v8/blob/master/src/json-parser.cc

或进行实验:

var bad_json_data = 'console.log("executed!"); "{foo:1}"';
var o1 = eval(bad_json_data);  // Prints to console.
var o2 = JSON.parse(bad_json_data);  // SyntaxError!

也就是说,您必须谨慎对待不受信任的输入。使用JSON.parse将JSON字符串转换为对象是安全的,但是此后,您仍然必须小心使用该对象的用途(作为一个随机示例,如果您将其属性值用作SQL注入攻击,尝试将它们存储在数据库中。

答案 1 :(得分:-1)

您不能将函数/类解析为JSON。如果有函数,它们将被表示为字符串。您可以检查是否尝试:

const obj = {
  a: () => console.log("test")
}

console.log(JSON.stringify(obj))
// prints {}