我正在开发一个 Enyo Web 应用程序,并希望允许用户在浏览器中编写他们的 Javascript 代码并执行它。
我可以通过使用来做到这一点window.eval
。但是,我已经阅读了 eval 的弊端。
有没有人可以阐明http://learn.knockoutjs.com/、http://jsfiddle.net等示例在浏览器执行中的安全性以及最佳实践是什么?
我正在开发一个 Enyo Web 应用程序,并希望允许用户在浏览器中编写他们的 Javascript 代码并执行它。
我可以通过使用来做到这一点window.eval
。但是,我已经阅读了 eval 的弊端。
有没有人可以阐明http://learn.knockoutjs.com/、http://jsfiddle.net等示例在浏览器执行中的安全性以及最佳实践是什么?
除了一种特定情况外,Eval 被认为是邪恶的,这是您在运行时(或元编程)期间生成程序的情况。唯一的选择是编写您的解析器/解释器(这可以在 javascript 中相对容易地完成,但是对于比 javascript 本身更简单的语言 - 我做到了,这很有趣)。因此eval()
在此处使用函数是合法的(为了使浏览器端编译器生成相当快的代码,无论如何您都需要使用 eval 生成编译后的 javascript)。
但是,eval 的问题是安全性,因为评估的代码与运行它的脚本具有相同的权限和对其环境的访问权限。这是最近很热门的话题,EcmaScript 5 旨在通过引入严格模式来部分解决这个问题,因为可以静态分析严格模式代码以查找危险操作。
这通常是不够的(或者出于向后兼容性的原因有问题),所以有像Caja这样的方法通过分析服务器上的代码来解决安全问题,并且只允许使用严格安全的 javascript 子集。
另一种常用的方法是保护用户,但不能通过在<iframe>
嵌入在父页面的元素中运行用户生成的 javascript(通常由jsfiddle等网站使用)来防止恶意攻击。iframe
但是可以访问其父页面并获取其内容是不安全的。
即使在这种方法中,最近也取得了一些进展,例如在 chrome 中,通过使用属性iframe
使其不那么容易受到攻击sandbox
<iframe src="sandboxedpage.html" sandbox="allow-scripts"></iframe>
您甚至可以在其中指定不同的权限。
希望我们很快就会有一个简单的方法来使用安全和简单的元编程,但我们还没有做到。