【发布时间】:2013-06-30 08:42:20
【问题描述】:
尝试在浏览器中执行以下代码:
eval("(function() { console.log(JSON.parse('" + JSON.stringify('THIS IS COOL') + "')); })()");
它应该打印出THIS IS COOL,
但是,如果你执行这个:
eval("(function() { console.log(JSON.parse('" + JSON.stringify('THIS IS "NOT" COOL') + "')); })()");
它将失败,而不是打印THIS IS "NOT" COOL
谁能解释为什么会这样?
注意这一点:
JSON.stringify('THIS IS "NOT" COOL') 的结果是字符串"THIS IS \"NOT\" COOL"
如果你尝试执行JSON.parse("THIS IS \"NOT\" COOL"),它会失败,这是因为JS解析器会将字符串"THIS IS \"NOT\" COOL"解释为"THIS IS "NOT" COOL"。
如果你执行JSON.parse(JSON.stringify('THIS IS "NOT" COOL')),它会起作用,因为字符串"THIS IS \"NOT\" COOL"是直接传递给JSON.parse的。
为什么它在这种情况下有效,但在前一种情况下无效?
我唯一的结论是 eval 在执行代码之前明确地对传递给它的所有内容进行转义,但我想确定并理解为什么 eval 设计为这样工作。
【问题讨论】:
-
你的第二个代码在没有 eval 的情况下做同样的事情...
-
eval()在带注释的 ES5... -
@dandavis 我明白了,eval 的问题是我需要它在字符串上下文中评估 JSON.stringify 返回的字符串。
-
@Teemu 很好,谢谢,所以'为了安全',你认为像
eval(code.replace(/\/g, '\\\\'));这样的事情就足够了吗? -
@almosnow 我怀疑
eval永远不会是任何问题的安全解决方案......
标签: javascript json eval quotes