Zeal Blog - 泽欧里
WWW Zeal Blog
梦想 就像鸡蛋
要么孵化 要么臭掉

eval() may be evil

Posted by zeal on 2005-12-09 15:54 , 1544 characters , Via |  + 1 - 0   English
转载请保留本行原始链接信息 : http://www.zeali.net/entry/266 MADE 1n ZEAL
标签 ( WebDev ):  ,  ,  , 
Simon Willison 认为:虽然提供了把动态字符串作为脚本代码来执行的 eval() 函数,为代码的编写提供了很多的便利,但同时也导致了代码执行效率的低下以及难以维护。通常来说,只有设计存在缺陷才会不得不用 eval() 来弥补这些缺陷。

对于 eval() 的使用最常见的错误是用来动态获取某个对象/子对象及其属性,像这篇文章所介绍的那样。假设你的代码中有一个对象foo,其属性将在运行时被决定。你可能会想用eval来解决这个问题:

这样做固然可以达到预期的效果,但这会导致JavaScript每次运行这段代码的时候都切换到解释器模式来重新解释这段动态构建的代码,其运行效率大大降低。实际上以上情况你可以完全回避使用eval():

另一方面,使用 eval() 也可能会导致一些潜在的安全隐患。这一点对于任何语言来说都是如此。当你通过页面的GET/POST参数来获取数据并 eval() 之的时候,就有可能被恶意用户利用来注入非法代码进行非预期的操作。

所以,无论是从执行效率、代码维护成本还是应用安全性角度考虑,对于 eval() 的使用都必须谨慎。回想自己曾经写过的那些代码,有段时间里面 eval() 简直被我给用滥了 -- 最直接的后果就是给接手的其他程序员造成了不小的麻烦。要弄懂一段动态组合出来的字符串到底被 eval() 之后是用来干什么的的确不像结构清晰的OO代码那么容易。

难怪有人认为 eval() 应该被完全从编程语言中被清理出去,因为 eval() 意味着 B.A.D. -- Broken As Designed 。这个情形有点像 goto 关键字。不知道有多少人对 goto 深恶痛绝,也不知道 goto 导致了多少代码的崩溃。但不可否认,仍然有很多精彩的 goto 使用范例。只要用在合适的地方, eval() 同样可以是不二的解决方案。比如中用来执行得到的服务器端响应:

To be, or not to be: that is the question.

This Entry was Last Modified on 2007-05-28 11:03
对于这篇日志有什么看法?我想听听您的高见:
您也可以在页面底部的 Google Friend Connect 工具栏进行评论,体验更好的互动交流 »
首先为了证明您不是没有思想的机器Spammer,请告诉我 4 + 8 =
然后任选以下两种方式之一告诉我您的身份:
1. 使用您的 OpenID
2. 使用传统留言格式
(必填) 名字
如何称呼您?
(选填) URL
在此填写您的 Blog / Homepage 的地址,我将非常乐于访问
(选填) Email
Email地址将在经过防SPAM处理后显示在页面。如果您不希望公开自己的Email,请略过此栏
并写下您的见解:
(由于需要进行SPAM过滤,如果评论提交速度慢请耐心等待)
(所有URL都会加 nofollow 标记,保证不被搜索引擎收录,请SEOers不要白费力气)
记住我?

  如何进行评论                   当有新回复时给我发送邮件通知
除了 <b> 和 <i> 之外,其他的HTML标签都将从您的评论中去除. URL 或 Email 地址会被自动加上链接.
当您点击发表或者预览之后,系统会自动保存您此次评论的内容,以便当网络原因发表失败时直接按Ctrl-V重新粘贴上次评论内容。
注意:快捷键及自动拷贝功能仅对IE浏览器有效。
没有评论.
日志存档
2010年
2009年
2008年
2007年
2006年
本 Blog 原创内容
遵循以下授权:

Creative Commons
(创作共用) CC

署名-非商业性
-相同方式分享
Zeal Blog 基于
Powered byPivot - 1.24.1: 'Arcee'
Pivot1.24.1
开发
Launched @
2005-04-27
 里,居也。——《说文》    里,邑也。——《尔雅》。李注:“居之邑也。”RSS Feed (Entries) | Back To Home | All Links | zbird.com | 沪ICP备05024379号