如何沙箱不受信任的用户提交的JavaScript内容?

Fla*_*ash 32 javascript iframe sandbox same-origin-policy

我需要在我的网站上提供用户提交的脚本(有点像jsfiddle).我希望脚本能够以安全的方式在访问者浏览器上运行,与它们所服务的页面隔离.由于代码是由用户提交的,因此无法保证它是值得信赖的.

现在我可以想到三个选择:

  • 在来自不同域的iframe中提供用户提交的内容,并依赖于同源策略.这需要设置一个我想尽可能避免的额外域名.我相信这就是jsfiddle的做法.脚本仍然可以做一些损坏,top.location.href例如,改变,这是不太理想的.http://jsfiddle.net/PzkUw/
  • 使用sandbox属性.我怀疑这在浏览器中得不到很好的支持.
  • 在提供脚本之前清理脚本.我宁愿不去那里.

上面有其他解决方案或建议吗?

更新

如果,正如我怀疑的那样,第一个选项是最佳解决方案,除了更改顶部窗口位置之外,恶意脚本可以做什么,以及如何防止这种情况?我可以操纵或拒绝基于静态代码分析某些脚本,但是这是很难给出对象可以被访问的方式的数量和总的难度分析JavaScript的静态.至少,它需要一个完整的解析器和一些复杂的规则(一些,但我怀疑不是所有,其中存在于JSLint中).

Lou*_*cci 26

创建一个定义良好的消息接口,并使用JavaScript Web Worker获取要沙箱的代码.HTML5 Web Workers

Web Workers无权访问以下DOM对象.

  • 窗口对象

  • 文档对象

  • 父对象

因此,他们无法重定向您的网页或更改其上的数据.

您可以创建模板和定义良好的消息传递接口,以便用户可以创建Web工作者脚本,但您的脚本将对操作的内容有最终决定权.

编辑评论由乔丹格雷插入一个似乎做我上面描述的JavaScript库.https://github.com/eligrey/jsandbox

  • 请注意,使用此技术您仍然可能会造成很多混乱!你可以窃取 cookie,你可以 fetch() 任何 url 地址,这样你就可以进行 CSRF 攻击(使用你的管理会话将我添加为管理员)等等。它根本不安全。 (2认同)

rsp*_*rsp 5

一些可能对您的应用程序有所帮​​助的工具的想法 - 它们从两个不同的方向攻击问题:Caja将不受信任的JavaScript代码编译为安全的东西,而AdSafe定义了一个可安全使用的JavaScript子集.

卡哈

卡哈

Caja Compiler是一个可以安全地嵌入您网站的第三方HTML,CSS和JavaScript的工具.它支持嵌入页面和嵌入式应用程序之间的丰富交互.Caja使用对象功能安全模型来实现各种灵活的安全策略,以便您的网站可以有效地控制嵌入式第三方代码可以对用户数据执行的操作.

为AdSafe

为AdSafe

ADsafe可以安全地将访客代码(例如第三方脚本广告或小部件)放在网页上.ADsafe定义了一个强大的JavaScript子集,允许访客代码执行有价值的交互,同时防止恶意或意外损坏或入侵.ADsafe子集可以通过JSLint等工具进行机械验证,因此无需人工检查即可查看访客代码的安全性.ADsafe子集还实施了良好的编码实践,增加了访客代码正确运行的可能性.