0

我想在网站上运行用户提供的 javascript,但在此之前,我需要(从算法上)检查提供的 javascript 源是否遵循一组规则(例如,不使用 eval() 函数,不使用 setTimeout()/setInterval() 函数等.)。

另外一件好事是检查来源是否有效。用于此的工具可以是任何东西,因为在服务器端执行。您有什么想法可能对此有用吗?

编辑:代码将在 web worker 环境中执行

4

3 回答 3

2

仅仅通过扫描源代码是不可能判断脚本是否会使用被禁止的功能的。您已经更改了脚本执行的环境。

您所做的不是简单的文本搜索。JavaScript 是一种非常动态的语言,您可以有效地调用“禁止”函数,而无需在源代码中包含该函数的名称!

window['e'+'v'+'a'+'l']

也不可能简单地执行脚本并跟踪访问了哪些函数,因为您将无法访问所有代码路径。

要禁止使用特定功能,您必须在不存在这些功能的沙箱中运行代码。

于 2013-01-03T03:06:24.920 回答
1

如果你在服务器端运行它(在 Node.js 或 Rhino 或类似的东西上),可以控制全局命名空间。拿走evalsetTimeout

于 2013-01-03T03:08:39.670 回答
0

如果 JavaScript 在 Web 浏览器中运行,请在 iframe 中从单独域(“exampleusercontent.com”)加载的页面上执行它。然后使用window.postMessage()允许与父窗口通信(来自“example.com”)。这或多或少是 Facebook 应用程序的工作方式。

不幸的是,不受信任的 JavaScript 将能够做一些事情,例如将用户重定向到另一个网站或挂起用户的浏览器;但是,它应该无法将代码注入“example.com”或窃取用户的“example.com”cookie。

Google Caja是一个开源编译器,用于对第三方 JavaScript 进行沙盒处理,但有时会发现其中的漏洞。

于 2013-01-03T03:34:18.833 回答