【问题标题】:Javascript eval() for Json strings injects global scope functionsJson 字符串的 Javascript eval() 注入全局范围函数
【发布时间】:2015-12-16 21:17:46
【问题描述】:

我有一个完全正确的 Json 字符串,它通过使用 eval 函数在函数的方法中进行解析。但是,完成此操作后,由于某些未知原因,全局定义方法的第一行作为数组参数之一被注入内部。

被解析的字符串是:

{"id":1,"name":"object1","volume":15,"weight":100}

解析行是:

var 解码 = eval('(' + 编码 + ')');

使用 eval() 函数解码后,我在里面得到了“互补”属性 decoded['replaceNode'],它包含一个包含在另一个文件中的全局范围函数。

我认为这是一个错误,但由于在 firefox 和 safari 中都会发生同样的情况,因此似乎不太可能。更可能我误解了 eval 的目的。

提前感谢您的帮助。

【问题讨论】:

  • 你有与 Object.prototype 混淆的代码吗?这可以使所有对象都具有附加属性。
  • 事实是,eval 有一个用途:将字符串作为 JS 代码运行。不解析 JSON,不解析任何东西。 执行任意字符串。它不知道也不关心字符串即代码会做什么,如果你也不知道,你就是在给你的网站一些笨蛋控制权。如果您的 JSON 确实正确,则可以改用 JSON.parse。现在,它已内置于每个体面的浏览器中。

标签: javascript json parsing eval


【解决方案1】:

不要使用 eval。

Eval 是不安全的,可以使攻击者执行任意代码。请改用 JSON library

【讨论】:

  • @Blender:因此他按下了“这个答案没用”按钮?真的,我链接的库可以被猴子使用,只需阅读文档。
  • 不错的库,试过了,效果很好。我明白你对代码注入的意思。由于它可以评估任何 Javascript 对象,并且函数是对象,因此可以将字符串转换回代码并最终执行它,如果不小心的话。
【解决方案2】:

暂时搁置使用eval()的陷阱...

我无法重现您描述的副作用。

您猜测,您已经加载了一个库,该库覆盖 eval() 以“增强” eval 返回的任何结果。

【讨论】:

  • 我错了!我以为它向我展示了一个全局作用域函数,但它实际上是一个加载在 Object 原型中的方法......所以逻辑上 eval 为我生成了一个包含 Object 超类中所有方法的对象。
  • 其实,来自 github 的库似乎也是如此
猜你喜欢
  • 1970-01-01
  • 2017-01-20
  • 2013-05-25
  • 2011-03-17
  • 2012-09-08
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2014-04-11
相关资源
最近更新 更多