jsFiddle如何允许执行用户定义的JavaScript代码而不会带来安全威胁?

23

我一直在开发一个JS库,希望在Github上设置一个演示页面,允许用户定义自己的回调函数并执行命令。

我知道"eval()是邪恶的",我能看到盲目使用脚本的eval()可能导致XSS和其他安全问题。我正在尝试构思一些替代方案。

我非常喜欢jsFiddle的互动性。我已经查看了他们的源代码,但希望有人能在这里解释一下jsFiddle如何允许和执行用户定义的JavaScript而不会有安全隐患。只要不涉及第三方回显服务器,我希望可以模仿这种方法。

1个回答

28

jsFiddle在一个单独的域上执行用户脚本,即http://fiddle.jshell.net尝试一下并查看)。 因此,它无法与父框架交互,也无法窃取cookie。

你可以通过将静态页面放在另一个域中并在Javascript中从其查询字符串读取来实现此目的而不需要单独的服务器。
您可以使用页面标题进行回传(敌人也可以)。


1
执行在单独的域上是什么意思——加载包含执行JavaScript的页面的iFrame? - buley
@editor:没错。<iframe>中的页面必须位于一个完全没有可被攻击的内容(没有cookies)的不同域名下。 - SLaks
1
@SLaks - 为什么 alert(document.cookie); 在 jsFiddle 中可以工作? - Shlomi Hassid
1
有点晚了。@ShlomiHassid的安全问题围绕着对cookie的访问,而不是对浏览器环境的访问。因此,alert('hello')可以正常工作并在警告框中输出“hello”,但是alert(document.cookie)只会输出一个空字符串(警告框仍然会出现,但除非jshell.net域上有cookie,否则不会显示任何cookie)。 - Monarch Wadia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接