在Internet Explorer扩展程序(BHO)中进行沙箱JavaScript执行

10

火狐浏览器有Sandbox和evalInSandbox()特性,谷歌浏览器在内容脚本中实现了沙盒执行(称为隔离执行)。我正在寻找同样的功能来开发IE浏览器扩展。

我可以加载JavaScript文件,然后调用evalScript()函数,但该代码将在页面上已有的JavaScript环境中执行。我需要一种方法来运行我的库(其中包括并基于jQuery),在一个沙盒或隔离环境中运行,但仍然能够像在页面上运行一样修改DOM。

Jint看起来很有前途,但目前无法评估jQuery。(它们可以解析它。)

我该怎么做?


Chrome的隔离世界:http://code.google.com/chrome/extensions/content_scripts.html#execution-environment"内容脚本在一个特殊的环境中执行,称为隔离世界。它们可以访问注入页面的DOM,但无法访问页面创建的任何JavaScript变量或函数。" - TelegramSam
Firefox的evalInSandbox: https://developer.mozilla.org/En/Components.utils.evalInSandbox这个方法被GreaseMonkey用来在页面上下文之外允许JavaScript执行。将DOM作为变量传递允许脚本修改DOM,而不允许页面的JavaScript访问它自己的方法和变量。这确实允许沙盒化的代码在主页中嵌入脚本标签并加载内容,但是防止这种情况并不是我的关注点。 - TelegramSam
我并不认为 evalInSandbox 的工作方式与您想象的一样;请参见安全部分中的代码示例。虽然我不是专家,但我的理解是,evalInSandbox 主要用于允许本来会在完全信任的 Chrome 区域执行的 JS 代码,而在活动文档的有限信任区域中执行。 - EricLaw
我认为每个人都害怕告诉你他们不知道你问题的答案。这些不是答案。我也没有答案,但我只是说一下。 - Alex
4个回答

6

看起来你在这件事上遇到了麻烦。

  • 一些微软人员表示IE浏览器不提供此功能
  • 有些人声称他们已经实现了这个功能,并将其视为自己的秘密配方
  • 当联系“专业”的IE扩展店来构建你所需要的内容时,他们都拒绝了这份工作

我真希望能够给你一个好消息,但是看起来要完成你想要的可能需要一个小奇迹......或者需要花费大量的金钱。:)

你最好的选择可能是找到少数声称已经能够做到这一点的人,并支付高额报酬让他们分享这个秘密,或者重新考虑为什么你真正想要这个东西,看看是否可以通过其他方式实现它。


2
你可能会发现值得一看的是微软 Live Labs 的 Web Sandbox: http://websandbox.livelabs.com/ 虽然它更为完整,与混搭等相关,但它可能指引你朝着正确的方向前进。

Microsoft Web Sandbox 可以保护页面免受加载到其中的脚本的影响。但我需要保护已加载的脚本不受页面的影响。这是一个好项目,但对我在这里没有帮助。 - TelegramSam

2
你正在寻找的是ActiveScript引擎(http://en.wikipedia.org/wiki/Active_Scripting)。
我现在找不到任何有用的链接,MSDN仅包含接口定义(http://msdn.microsoft.com/en-us/library/ccd0zt2w(v=vs.85).aspx),请尝试谷歌搜索“Active Scripting”(而不是“Action Scripting”!)。
您需要在扩展中实现IActiveScriptHost接口,创建一个“JScript”对象,调用SetSite并传递您的主机对象,然后您可以将js代码加载到此引擎中并运行它。
由于缺乏相关文档,这种技术相当困难。如果您仍然对此感兴趣,我可以向您发送一些C++ / ATL示例。

如果您能在这里放置一个示例代码,或者在GitHub上分享一下,那将非常有帮助。特别是像您所说的那样 - 文档很少。 - Benjamin Gruenbaum

1

你能详细说明一下你的目标吗?

我认为你还没有清晰地定义你想要达成什么目标。如果你的代码有修改页面DOM的能力,那么它实际上就是在页面上执行。它可以创建新的脚本块来执行任何不安全或不可靠的操作,就好像它在同一个执行环境中运行一样。

IE没有提供你所要求的功能,而我也不确定Firefox和Chrome的功能是否符合你的期望。


1
我的目标是在页面上运行JavaScript,而不让页面的JavaScript能够访问我的JavaScript方法和变量。我还想要一个新鲜的JavaScript副本。如果页面重新定义了JavaScript中的某个方法,我不想受到它们的重新定义的影响。 我不担心我的脚本能否通过在DOM中插入脚本标记来跳出沙盒。这种功能在Firefox和Chrome中都可以实现。我将发布相关文档的链接。 - TelegramSam

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