检查javascript源是否使用禁止的函数

检查javascript源是否使用禁止的函数,javascript,parsing,Javascript,Parsing,我想在站点上运行用户提供的javascript,但在这样做之前,我需要(从算法上)检查提供的javascript源是否遵循一组规则(例如,不使用eval()函数,不使用setTimeout()/setInterval()函数等) 另外一件好事是检查源代码是否有效。 这个工具可以是任何东西,因为它是在服务器端执行的。 你有什么想法对这个有用吗 编辑:代码将在web worker环境中执行通过简单地扫描源代码,无法判断脚本是否将使用禁止的功能。您可以更改脚本在其中执行的环境 你所做的不是简单的文本搜

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

另外一件好事是检查源代码是否有效。 这个工具可以是任何东西,因为它是在服务器端执行的。 你有什么想法对这个有用吗


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

通过简单地扫描源代码,无法判断脚本是否将使用禁止的功能。您可以更改脚本在其中执行的环境

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

window['e'+'v'+'a'+'l']
也不可能简单地执行脚本并跟踪访问哪些函数,因为您无法访问所有代码路径


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

仅通过扫描源代码无法判断脚本是否将使用禁止的函数。您可以更改脚本在其中执行的环境

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

window['e'+'v'+'a'+'l']
也不可能简单地执行脚本并跟踪访问哪些函数,因为您无法访问所有代码路径


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

如果您在服务器端(Node.js或Rhino或类似设备上)运行代码,则可以控制全局命名空间。将
eval
setTimeout
从中取出。

如果您正在运行it服务器端(在Node.js或Rhino或类似设备上),您可以控制全局命名空间。从中取出
eval
setTimeout

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

不幸的是,不受信任的JavaScript将能够执行诸如将用户重定向到另一个网站或挂起用户浏览器等操作;但是,它不能将代码注入“example.com”或窃取用户的“example.com”cookie


实际上,它是一个开源编译器,用于对第三方JavaScript进行沙箱处理,尽管有时会有人发现其中存在漏洞。

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

不幸的是,不受信任的JavaScript将能够执行诸如将用户重定向到另一个网站或挂起用户浏览器等操作;但是,它不能将代码注入“example.com”或窃取用户的“example.com”cookie


实际上,按照您的想法禁止某些函数,这是一个用于沙盒第三方JavaScript的开源编译器,尽管不时有人发现其中存在漏洞。

@AndrewHubbs,这个问题绝对没有错。myspace很久以前就尝试过这样做。我打赌他们花了很多钱在专业程序员身上。他们不断被黑客攻击。你不应该尝试。@AndrewHubbs,这个问题绝对没有错。myspace很久以前就试过了。我打赌他们花了很多钱在专业程序员身上。他们不断被黑客攻击。你不应该尝试。“你能做的唯一一件事就是防止使用特定函数在那些函数不存在的地方启动JavaScript沙盒。”你说这好像不是一个完美的解决OP问题的跨语言解决方案。这正是他应该做的(依我看)。@Malvolio,你什么意思?这正是我建议他做的!是的,这是解决问题的唯一办法。我完全同意。也许我只是误解了你的语气。你用“唯一的”开始两句话。一个根本不起作用;另一个是个好主意。@Malvolio,谢谢你的反馈。为了更清楚,我编辑了。是的,那个代码是有效的参数。然而:是否有可能消除可变访问?我可以确定何时访问变量(从一些解析树?类似于调用函数),所以访问window[]意味着不安全(->不接受代码)。如果有一个小的、有限的方法可以做到这一点,那么就不可能只检查那些“特殊”变量。“你能做的唯一一件事就是防止使用特定的函数在那些函数不存在的地方触发JavaScript沙盒。”你说这好像不是一个完美的解决OP问题的方法。这正是他应该做的(依我看)。@Malvolio,你什么意思?这正是我建议他做的!是的,这是解决问题的唯一办法。我完全同意。也许我只是误解了你的语气。你用“唯一的”开始两句话。一个根本不起作用;另一个是个好主意。@Malvolio,谢谢你的反馈。为了更清楚,我编辑了。是的,那个代码是有效的参数。然而:是否有可能消除可变访问?我可以确定何时访问变量(从一些解析树?类似于调用函数),所以访问window[]意味着不安全(->不接受代码)。