2012-04-18 65 views
2

我正在开发一个Enyo网络应用程序,并希望允许用户在浏览器中编写他们的Javascript代码并执行它。在浏览器中的Javascript编辑器和执行

我可以通过使用window.eval来做到这一点。但是,我已经读过关于eval的罪恶。

有没有人可以说明如何在http://learn.knockoutjs.com/,http://jsfiddle.net等实例中安全地执行浏览器执行以及最佳实践是什么?

+3

http://jsbin.com是开源的,[托管在github上](https://github.com/remy/jsbin)。使它很容易研究它的代码。 – Sampson 2012-04-18 16:13:12

+1

只需将代码在不同的域上执行,即可完成。 – Yoshi 2012-04-18 16:28:24

+0

你读过关于eval的邪恶的东西吗? – user123444555621 2012-04-18 21:48:40

回答

2

对于除一个特定情况之外的所有情况,Eval被认为是邪恶的,这是您在运行时(或元编程)期间生成程序的情况。唯一的选择是编写解析器/解释器(这可以在JavaScript中相对容易地完成,而是为了比javascript本身更简单的语言 - 我做到了,而且很有趣)。因此,在这里使用eval()函数是合法的(为了使浏览器端编译器的代码速度相当快,无论如何您都需要使用生成的编译javascript的eval)。

但是,eval的问题在于安全性,因为评估代码与运行它的脚本具有相同的权限并访问其环境。这是最近很热门的话题,EcmaScript 5被设计为通过引入严格模式来部分解决这个问题,因为严格模式代码可以针对危险操作进行静态分析。

这通常是不够的(或者出于向后兼容性的原因有问题),所以有像Caja这样的方法通过分析服务器上的代码来解决安全问题,并且只允许使用严格安全的javascript子集。

另一个经常使用的方法是保护用户,而不是使用运行的用户产生的嵌入父页面的元素的JavaScript恶意攻击保护(通常使用的网站,如jsfiddle)。但iframe可以访问其父页并获取其内容,这是不安全的。

即使在这种iframe方法中,最近也有一些进展,例如,在Chrome中,使其少用sandbox属性

<iframe src="sandboxedpage.html" sandbox="allow-scripts"></iframe> 

,你甚至可以指定不同的权限脆弱。

希望我们能尽快使用安全和简单的元编程,但我们还没有。

+0

伟大的答案 - 我一直在寻找沙盒iframes和使用严格模式。感谢您发布答案。 – 2012-05-30 01:15:02