Javascript JSON.parse的Node.js实现
我需要从不受信任的json获取javascript对象 最初它以字符串的形式出现,有两种方式完成任务:Javascript JSON.parse的Node.js实现,javascript,json,node.js,security,v8,Javascript,Json,Node.js,Security,V8,我需要从不受信任的json获取javascript对象 最初它以字符串的形式出现,有两种方式完成任务:eval()和JSON.parse() 在这里,我可以看到Node.js实现的JSON.parse,因为我担心它在后台使用eval,并且可能存在安全漏洞 我试图检查v8repo,甚至在Firefox中尝试Function.prototype.toSource(),但没有结果 有人能给我一些证据证明我不用担心使用它吗 不能将函数/类解析为JSON。如果有函数,它们将被表示为字符串。您可以检查,如果
eval()
和JSON.parse()
在这里,我可以看到Node.js实现的
JSON.parse
,因为我担心它在后台使用eval,并且可能存在安全漏洞
我试图检查v8
repo,甚至在Firefox中尝试Function.prototype.toSource()
,但没有结果
有人能给我一些证据证明我不用担心使用它吗 不能将函数/类解析为JSON。如果有函数,它们将被表示为字符串。您可以检查,如果您尝试:
const obj={
a:()=>console.log(“测试”)
}
log(JSON.stringify(obj))
//在这里打印{}
v8developerJSON.parse
不在引擎盖下使用eval
——这正是使用JSON.parse
的目的,也是强烈建议使用它(而不是eval
)解析JSON数据的原因
正如feeela已经指出的,如果您想自己验证这一点,请查看源代码:
或者做一个实验:
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注入攻击)“因为我担心它在幕后使用eval,可能存在安全漏洞”-这似乎不是一个合理的担心。这是一个主要的软件项目,被大量的人使用,并且得到了大量的笔试。“在这里我可以看到JSON.parse的Node.js实现,“-它没有。它是从底层JS引擎(其中有多个引擎(包括V8和ChakraCore))获取的,您可以使用开源JSON库。“我试图检查V8 repo[…]“你也应该这么做。v8中JSON.parse实现的源代码如下:@AfferencicDeveloper-不。用C编写危险的代码非常容易。如果你想让自己放心,Google没有发布有安全缺陷的JSON.parse
函数,那么你需要对C有足够的了解,以执行以下操作:我对他们的代码进行了安全审计。“你不能将函数/类解析为JSON”-这不是问题所在。亲爱的V8开发人员,请告诉我们JSON解析器是否使用正则表达式?它是否会受到重做攻击?不,JSON解析器不会在引擎盖下使用正则表达式。即使如此,我的理解是重做攻击通常需要攻击者提供恶意的regexp;因此任何内置的在任何环境中,只要内置regexp安全/性能良好,就可以在内部愉快地使用regexp,而不会受到此类攻击。