Bri*_*ngh 522 javascript security eval
eval函数是一种动态生成代码的强大而简单的方法,那么有什么警告呢?
Pre*_*aul 379
eval的不正确使用会打开您的注入攻击代码
调试可能更具挑战性(没有行号等)
eval'd代码执行速度较慢(无法编译/缓存eval'd代码)
编辑:正如@Jeff Walden在评论中指出的那样,#3今天不像2008年那样真实.但是,虽然编译脚本的某些缓存可能会发生,但这仅限于重复进行重复而无需修改的脚本.更可能的情况是,您正在评估每次都经过轻微修改的脚本,因此无法缓存.我们只说一些eval'd代码执行得更慢.
bob*_*nce 344
评估并不总是邪恶的.有时候它非常合适.
然而,eval目前和历史上大量过度使用,他们不知道自己在做什么.不幸的是,这包括编写JavaScript教程的人,在某些情况下,这确实会带来安全后果 - 或者更常见的是简单的错误.因此,我们越多可以在eval上抛出问号,就越好.每当你使用eval时,你需要理智地检查你正在做什么,因为你可能会做得更好,更安全,更清洁.
举一个非常典型的例子,设置一个id存储在变量'potato'中的元素的颜色:
eval('document.' + potato + '.style.color = "red"');
Run Code Online (Sandbox Code Playgroud)
如果上面那种代码的作者对JavaScript对象的工作原理有了线索,他们就会意识到可以使用方括号而不是文字点名,从而避免了对eval的需求:
document[potato].style.color = 'red';
Run Code Online (Sandbox Code Playgroud)
...这更容易阅读,也不那么潜在的错误.
(但那时,某人/他/他们真正知道他们在做什么会说:
document.getElementById(potato).style.color = 'red';
Run Code Online (Sandbox Code Playgroud)
这比直接从文档对象访问DOM元素的狡猾的旧技巧更可靠.)
kem*_*002 37
我相信这是因为它可以从字符串中执行任何JavaScript函数.使用它可以让人们更容易将恶意代码注入应用程序.
xto*_*ofl 26
我想到两点:
安全性(但只要您自己生成要评估的字符串,这可能不是问题)
性能:直到要执行的代码未知,它无法进行优化.(关于javascript和性能,肯定是Steve Yegge的演讲)
And*_*ges 20
将用户输入传递给eval()存在安全风险,但每次调用eval()都会创建JavaScript解释器的新实例.这可能是资源匮乏.
mat*_*amp 13
要记住的一件事是,您通常可以使用eval()在受限制的环境中执行代码 - 阻止特定JavaScript函数的社交网站有时会被错误地在eval块中分解 -
eval('al' + 'er' + 't(\'' + 'hi there!' + '\')');
Run Code Online (Sandbox Code Playgroud)
因此,如果你想要运行一些JavaScript代码,否则可能不会允许它(Myspace,我在看你......)然后eval()可能是一个有用的技巧.
但是,由于上面提到的所有原因,你不应该将它用于你自己的代码,你可以完全控制它 - 它只是没有必要,而且更好地降级到'棘手的JavaScript黑客'架子.
The*_*evs 12
除非您让eval()成为动态内容(通过cgi或输入),否则它与您页面中的所有其他JavaScript一样安全可靠.
如果你知道你正在使用它的上下文,它不一定是那么糟糕.
如果您的应用程序eval()用于从某个JSON创建一个对象,该对象已从XMLHttpRequest返回到您自己的站点,由您的可信服务器端代码创建,则可能不是问题.
不受信任的客户端JavaScript代码无论如何都无法做到这一点.如果您正在执行的事情eval()来自合理的来源,那么你很好.
| 归档时间: |
|
| 查看次数: |
249691 次 |
| 最近记录: |