【发布时间】:2010-08-31 09:05:50
【问题描述】:
我尝试使用谷歌搜索,但没有得到非常具体的答案.. 再说一次,我可能没有使用正确的关键字.. 有人可以指出 javascript eval 可能导致的“安全”问题吗?有很好的例子。如果您可以指向具有相同功能的现有网络资源,也可以这样做。
编辑:我只需要 eval 的安全含义。
【问题讨论】:
标签: javascript eval
我尝试使用谷歌搜索,但没有得到非常具体的答案.. 再说一次,我可能没有使用正确的关键字.. 有人可以指出 javascript eval 可能导致的“安全”问题吗?有很好的例子。如果您可以指向具有相同功能的现有网络资源,也可以这样做。
编辑:我只需要 eval 的安全含义。
【问题讨论】:
标签: javascript eval
eval() 可能是设计不佳的标志。例如,有时人们使用它来访问对象属性,因为他们不知道您可以使用 [] 表示法,即 eval('obj.' + prop_name)。如果您 eval() 用户内容,它也是 XSS 漏洞的来源,因为它可能被解释为 JS。它也往往比替代品慢。
这是使用 eval() 解析 JSON 时最基本的 XSS 示例:
eval({"a": "b", 'c': "d" + alert("xss") + ""})
要获得这样的漏洞,您必须懒惰地构建 JSON,而不是转义引号,但还有更复杂的示例,使用像 Douglas Crockford (json.org) 这样的专用库可以避免这种情况。
【讨论】:
一般来说,几乎总是有一种替代方法:
【讨论】:
eval 函数将字符串解析为代码,这比访问属性要多得多。
考虑eval('myForm.'+field+'.value') 与myForm[field].value 相比的效果。
几乎总是在使用eval 函数时,有一种更有条理的方法可以做到这一点。避免使用eval 函数会导致您想出更好的问题解决方案。
考虑使用像eval('myVars'+i) 这样的动态变量名称与使用像myArray[i] 这样的数组相比的效果。
【讨论】:
安全隐患是,如果 eval() 的参数是从某个第三方(用户输入、Web 服务等)获取的,您可能正在运行其他人的代码,而这些代码可能会执行您未预料到的事情。
为什么这很重要? 想象一下,您正在使用一些第三方 Web 服务来丰富您的用户体验,可能是从 facebook 获取信息,而该 Web 服务被黑了。现在黑客可以在你的页面上执行 javascript 代码,因为你 eval() 来自 web 服务的一些结果,使黑客能够在你的 DOM 中注入任何东西,用木马感染你的用户等。
现在,如果您没有使用 eval(),所有可能会发生的情况是您可能会得到错误数据,您可能会显示这些数据,或者,如果您是一个勤奋的程序员,甚至会显示一条错误消息:特定的数据。
【讨论】: