我需要从不受信任的json获取javascript对象。
最初,它以字符串形式出现,并且有两种完成任务的方式:eval()
和JSON.parse()
。
在这里我可以看到JSON.parse
的Node.js实现,因为恐怕它在后台使用了eval,并且可能存在安全漏洞。
我试图检查v8
仓库,甚至在Firefox中尝试了Function.prototype.toSource()
-没有结果。
有人可以为我提供一些我不用担心使用的证据吗?
答案 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 {}