知识卡片
eval扩大攻击面
内容
eval 把字符串传给编译器执行,是被滥用最多的特性——如拼接属性名代替下标访问 obj[key]。eval 代码更难读更慢,还会让 JSLint 失效;更严重的是给被求值文本过高权力,削弱安全性。Function 构造器、setTimeout/setInterval 传字符串参数同属此类。发散:需求看似需要 eval 时,应改用属性访问、数据结构、函数表或受限 DSL。
参考来源
- 位置:《JavaScript语言精粹(修订版)》附录B《糟粕 Bad Parts》"eval"一节
- 结论依据:原文举例说明用 eval 拼接属性名访问比直接用下标表示法更难读、更慢,并指出"eval函数还减弱了你的应用程序的安全性,因为它给被求值的文本授予了太多的权力",同时把 Function 构造器和 setTimeout/setInterval 的字符串参数形式都归为同类风险,据此推出 eval 类特性会扩大攻击面、应普遍避免的结论。
- 原始内容:eval函数传递一个字符串给JavaScript编译器,并且执行其结果。它是一个被滥用得最多的JavaScript特性……eval函数还减弱了你的应用程序的安全性,因为它给被求值的文本授予了太多的权力。而且就像with语句执行的方式一样,它降低了语言的性能。