我想在网站上运行用户提供的javascript,但在此之前,我需要(通过算法)检查提供的javascript源是否遵循规则集(例如,不使用eval()函数,而不是使用setTimeout()/ setInterval( )功能等。)。
另外一件好事就是检查来源是否有效。 这个工具可以是任何东西,因为在服务器端执行。 你有什么想法可能对此有用吗?
编辑:代码将在web worker环境中执行
答案 0 :(得分:2)
通过简单地扫描源代码,无法判断脚本是否将使用禁止的功能。您可以更改脚本执行的环境。
您所做的不是简单的文字搜索。 JavaScript是一种非常动态的语言,您可以有效地调用“禁止”函数,而根本不需要在源代码中使用该函数的名称!
window['e'+'v'+'a'+'l']
也无法简单地执行脚本并跟踪访问哪些功能,因为您将无法访问所有代码路径。
要禁止使用特定功能,必须在不存在这些功能的沙箱中运行代码。
答案 1 :(得分:1)
如果你在服务器端运行它(在Node.js或Rhino上或类似的东西上),你可以控制全局命名空间。从eval
和setTimeout
中取出它。
答案 2 :(得分:0)
如果JavaScript在Web浏览器中运行,请在iframe中从单独域(“exampleusercontent.com”)加载的页面上执行。然后使用window.postMessage()允许与父窗口(来自“example.com”)进行通信。这或多或少是Facebook Apps的工作方式。
不幸的是,不受信任的JavaScript可以执行诸如将用户重定向到另一个网站或挂起用户浏览器之类的操作;但是,它不应该能够将代码注入“example.com”或窃取用户的“example.com”cookie。
为了按照您的想法实际禁止某些功能,Google Caja是一个用于沙盒化第三方JavaScript的开源编译器,尽管有时候有人发现了一个漏洞。