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