【问题标题】:what are the issues javascript eval can posejavascript eval 会带来哪些问题
【发布时间】:2010-08-31 09:05:50
【问题描述】:

我尝试使用谷歌搜索,但没有得到非常具体的答案.. 再说一次,我可能没有使用正确的关键字.. 有人可以指出 javascript eval 可能导致的“安全”问题吗?有很好的例子。如果您可以指向具有相同功能的现有网络资源,也可以这样做。

编辑:我只需要 eval 的安全含义。

【问题讨论】:

标签: javascript eval


【解决方案1】:

eval() 可能是设计不佳的标志。例如,有时人们使用它来访问对象属性,因为他们不知道您可以使用 [] 表示法,即 eval('obj.' + prop_name)。如果您 eval() 用户内容,它也是 XSS 漏洞的来源,因为它可能被解释为 JS。它也往往比替代品慢。

这是使用 eval() 解析 JSON 时最基本的 XSS 示例:

eval({"a": "b", 'c': "d" + alert("xss") + ""})

要获得这样的漏洞,您必须懒惰地构建 JSON,而不是转义引号,但还有更复杂的示例,使用像 Douglas Crockford (json.org) 这样的专用库可以避免这种情况。

【讨论】:

  • 我添加了一个非常简单的例子。
【解决方案2】:

一般来说,几乎总是有一种替代方法:

  • 更快
  • 更容易阅读
  • 出错时更容易调试
  • 因意外用户输入而中断的可能性较低

【讨论】:

  • 对不起我的错..忘记在问题中添加安全部分..我只需要与 eval 相关的安全问题.. +1 为您的努力.. 现在编辑问题...
【解决方案3】:

性能

eval 函数将字符串解析为代码,这比访问属性要多得多。

考虑eval('myForm.'+field+'.value')myForm[field].value 相比的效果。

结构

几乎总是在使用eval 函数时,有一种更有条理的方法可以做到这一点。避免使用eval 函数会导致您想出更好的问题解决方案。

考虑使用像eval('myVars'+i) 这样的动态变量名称与使用像myArray[i] 这样的数组相比的效果。

【讨论】:

  • +1,感谢您的回答..我只需要 eval 的安全隐患..现在改变了问题..
【解决方案4】:

安全隐患是,如果 eval() 的参数是从某个第三方(用户输入、Web 服务等)获取的,您可能正在运行其他人的代码,而这些代码可能会执行您未预料到的事情。

为什么这很重要? 想象一下,您正在使用一些第三方 Web 服务来丰富您的用户体验,可能是从 facebook 获取信息,而该 Web 服务被黑了。现在黑客可以在你的页面上执行 javascript 代码,因为你 eval() 来自 web 服务的一些结果,使黑客能够在你的 DOM 中注入任何东西,用木马感染你的用户等。

现在,如果您没有使用 eval(),所有可能会发生的情况是您可能会得到错误数据,您可能会显示这些数据,或者,如果您是一个勤奋的程序员,甚至会显示一条错误消息:特定的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 2011-03-12
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多