JavaScript eval()安全问题

2015-07-28 17:31:41 +08:00
 qnsh

代码 eval('(' + Text + ')') 存在注入问题,有什么方法可以替代或避免该问题吗?

6998 次点击
所在节点    JavaScript
25 条回复
zythum
2015-07-28 17:35:56 +08:00
保证text内容是你可控的。
FrankFang128
2015-07-28 17:36:17 +08:00
不相信外部输入即可。

你为啥要用 eval()?
这可能是一个 XY 问题。
morethansean
2015-07-28 17:37:57 +08:00
不要使用 eval。
你应该问有没有方法不使用 eval 实现你的具体需求……
如果这就是你的具体需求……假设这个需求真的不奇怪,那只能自己过滤了啊……
lichao
2015-07-28 17:41:56 +08:00
@FrankFang128

例如 JSON with Padding 的时候
qnsh
2015-07-28 17:44:19 +08:00
@morethansean @FrankFang128 我也不想用eval,问题是之前的代码用了,我要修改这这个方法,想找个替代方案。
FrankFang128
2015-07-28 18:12:41 +08:00
@lichao jsonp 吗?不需要 eval 的呀,不是回调么?
edire
2015-07-28 18:49:36 +08:00
如果是json的话,JSON.parse() 可将 json形式的字符串转换为js对象。
zythum
2015-07-28 18:58:02 +08:00
@FrankFang128 有啥区别.... 回调数据是破坏性代码不一样....
FrankFang128
2015-07-28 18:59:41 +08:00
@zythum 回调不用 eval 嘛,我写几年JS都没用几次 eval
zythum
2015-07-28 19:04:45 +08:00
@FrankFang128
jsonp_callback( { I_am_xss: (function () {alert(1)}()) } );
FrankFang128
2015-07-28 20:32:23 +08:00
@zythum jsonp mimetype 设为 text/html ,然后这段回调不会执行的
bramblex
2015-07-28 21:34:06 +08:00
这是你的问题,为什么你eval的东西里面会有用户输入?你需要用户给你写代码吗?

如果没有,那么你的用户怎么注入你?入侵你服务器来注入吗?
sneezry
2015-07-28 21:37:13 +08:00
不要用eval、new Function,以及不要在setTimeout和setInterval里将字符串解析成代码运行
bramblex
2015-07-28 23:56:47 +08:00
@sneezry 动态加载代码的时候eval的效率比插节点高的得多,而且可以并行加载!
sneezry
2015-07-29 00:01:19 +08:00
@bramblex 安全问题比效率问题优先级高。
bramblex
2015-07-29 02:17:09 +08:00
@sneezry

所以你的业务是多奇葩需要 eval() 用户输入?你难道需要用户给你写代码?虽然我还真有想法做一个类似的网站。

出现这种情况只能说明你的程序设计本身有问题,而不是eval有问题。如果你js里面要是硬要包含一段未做过滤的用户输入,那么无论你用eval()还是插入节点都会产生问题。eval产生的绝大多数所谓的问题,都是因为低端程序员滥用而导致的,而不是eval本身有问题,这一点上就跟c指针或者goto语句一样。

其实编程规范里面禁止用eval,这不过是就为了在团队协作的时候防猪队友而已,你不能要求你每一个队友都跟你一样能驾驭eval(),所以干脆禁止写eval。

不过eval()的灵活性让很多不可能编程可能。举一个简单的例子,类似c++的namespace,也可以在javascript里模拟实现了。
magicyu1986
2015-07-29 02:22:37 +08:00
'use strict' 会好一点。

另外很多时候eval都有替代方法。
jugelizi
2015-07-29 08:47:36 +08:00
确实啊
eval执行的代码几乎是由服务器返回的为什么怕安全呢?
sneezry
2015-07-29 08:50:12 +08:00
@bramblex 您这想法不对,eval可不像this,我们说this是非常棒的东西,但很多人驾驭不好,可是我们从来没说过要去禁用它。eval里的代码我们也基本不会设计成让用户输入,但您必须承认使用eval有内在的风险。Google对Chrome扩展和应用的开发明确禁用了eval,Google在多处文档,包括html5rocks中也多次强调不要用eval,这不是您能不能驾驭代码的问题,用户的网络环境不是您一个前端程序员能控制的。
sneezry
2015-07-29 08:51:31 +08:00
@jugelizi 就是怕用户被劫持啊,而且一旦服务端出现什么bug会连带前端一起遭殃

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208978

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX