是否可以对浏览器中运行的 JavaScript 进行沙盒处理?

2022-08-30 02:25:12

我想知道是否有可能在浏览器中运行的JavaScript沙箱,以防止访问通常在HTML页面中运行的JavaScript代码可用的功能。

例如,假设我想为最终用户提供一个 JavaScript API,让他们定义在“有趣的事件”发生时要运行的事件处理程序,但我不希望这些用户访问对象的属性和函数。我能做到这一点吗?window

在最简单的情况下,假设我想阻止用户呼叫 。我能想到的几种方法是:alert

  • 重新定义全球。我不认为这是一种有效的方法,因为在页面中运行的其他代码(即,不是由用户在其事件处理程序中创作的内容)可能希望使用。window.alertalert
  • 将事件处理程序代码发送到服务器进行处理。我不确定将代码发送到服务器进行处理是否是正确的方法,因为事件处理程序需要在页面的上下文中运行。

也许服务器处理用户定义的函数,然后生成要在客户端上执行的回调的解决方案会起作用?即使这种方法有效,是否有更好的方法来解决这个问题?


答案 1

Google Caja是一个源对源的翻译器,“允许您将不受信任的第三方HTML和JavaScript内联到您的页面中,并且仍然安全。


答案 2

看看Douglas Crockford的ADsafe

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

您可以通过查看项目 GitHub 存储库中的 和 文件来查看如何使用 ADsafe 的示例。template.htmltemplate.js