Javascript 我是否可以有效地使用透明化、代码标记化/再生、VM或类似的方法来保证浏览器中的沙箱/控制代码?

Javascript 我是否可以有效地使用透明化、代码标记化/再生、VM或类似的方法来保证浏览器中的沙箱/控制代码?,javascript,virtual-machine,sandbox,transpiler,Javascript,Virtual Machine,Sandbox,Transpiler,看起来我是在问一个棘手的问题,在过去几十年中,人们一直在探索这个问题,却没有找到明确的解决方案。我看到了一些较小的问题,但它们似乎都被贴错了标签——它们都关注于沙盒cookie和DOM访问,而不是JavaScript本身,这正是我试图做的;iFrame或网络工作者听起来和我要找的不完全一样 在架构上,我正在探索病态的极端:我不仅想要完全控制执行哪些函数,这样我就可以禁止访问任意函数、DOM元素、网络等等,我也真的想控制执行调度,这样我就可以防止邪恶或写得不好的脚本消耗100%的CPU 在我思考这

看起来我是在问一个棘手的问题,在过去几十年中,人们一直在探索这个问题,却没有找到明确的解决方案。我看到了一些较小的问题,但它们似乎都被贴错了标签——它们都关注于沙盒cookie和DOM访问,而不是JavaScript本身,这正是我试图做的;iFrame或网络工作者听起来和我要找的不完全一样

在架构上,我正在探索病态的极端:我不仅想要完全控制执行哪些函数,这样我就可以禁止访问任意函数、DOM元素、网络等等,我真的想控制执行调度,这样我就可以防止邪恶或写得不好的脚本消耗100%的CPU

在我思考这个问题时,我提出了两种方法。我意识到我只会在快速、内省和安全中完美地钉出两个,但我想尽可能接近这三个

想法1:将所有内容放入虚拟机中

虽然它不会呈现一个JS“前端”,但解决我的问题最简单、最优雅的架构解决方案可能是一个小巧、轻量级的虚拟机。实际性能不会很好,但我会对正在执行的操作进行全面反思,并且我能够在VM内部而不是在JS级别运行
eval
,防止潜在的恶意代码遇到浏览器

想法2:透明化

首先,我看过Google Caja,但我正在寻找一个用JS编写的解决方案,这样编译/处理阶段就可以在浏览器中进行,而无需下载/运行任何其他内容

我对各种Transpiler(TypeScript、CoffeeScript等)非常好奇——如果这些语言执行完整的标记化->AST->代码生成,这将使它们成为优秀的“代码防火墙”,可用于在编译时过滤函数/DOM/etc访问,这意味着我可以恢复性能

我主要关心的是,是否有任何攻击可以用来生成我试图阻止的代码。毕竟,这些语言的解析器并没有考虑到安全性。这就是我使用虚拟机的动机


这种技巧也意味着我失去了执行内省。也许我可以在一个或多个web workers中运行代码,每隔一秒钟左右“ping”一次workers,杀死那些[可能陷入无限循环而且]没有响应的workers。这可能会奏效。

Javascript调试器集成在浏览器中,如果你必须保证客户端状态不被篡改-你必须将所有东西都放在服务器上(并在预算允许的情况下雇佣警卫、狗和/或忍者来保护服务器)。我真希望能在HTML5中启动调试器!但是,我需要对访问调试器的代码进行沙箱处理,然后。。。我回到了起点。我感兴趣的是允许用户向网页添加交互性,从而限制一组可预测的不安全/浪费时间的功能(DOM访问、cookie窃取、网络垃圾邮件等)。很抱歉没有澄清这一点(尽管现在我很难过,我无法实现您建议的保护服务器的技术:P)不,transpiler在这里不会帮助您(除非它将深奥的安全语言转换为安全的javascript)。JavaScript太过动态,无法在不牺牲可用性的情况下静态地证明脚本的安全性。@Bergi:是的,我担心JS风格的Transpiler没有(更好的说法是)“完整的代码覆盖率”。现在我想知道我可以用什么样的安全语言(不必太深奥)编译。我想用纯函数语言(比如Haskell),但这取决于你需要动态生成的代码做什么。