使用java脚本API查找和销毁坏/恶意java脚本代码

时间:2009-10-21 13:23:49

标签: java javascript scripting

我正在处理一个servlet(在tomcat上运行),它接收包含Java Script代码的请求,并使用java脚本API框架评估/运行代码并将答案返回给用户。

由于我们正在处理用户生成的代码,因此代码可能是一个很好的代码,也可能是错误的代码。作为一个坏代码的例子可以是while(true);这将无休止地在服务器中循环,占用不必要的资源

我的问题

1)我怎么能发现一个糟糕的代码? 2)一旦被识别为坏/恶意代码,停止运行的最佳方法是什么?

感谢

3 个答案:

答案 0 :(得分:7)

我的问题是:什么算不好代码

如果你不能提出正确定义什么算不好的代码,你就不能希望能够检测到它。既然这可能是你的问题的真正含义,我会提出我的答案 - 没有办法做到这一点。

即使像whether a program will terminate or not这样看似微不足道的事情也无法提前确定,我预计任何坏代码的定义都会无法终止。

因此,在我看来,你有一个主要的选择:信任你的用户(或者不信任他们,也不要运行任何东西)。

可能工作的东西是在严格的沙箱中运行脚本,如果它还没有完成运行,则在适当的时间后终止它。这在很大程度上取决于你的情况是什么是可以接受的。

答案 1 :(得分:3)

你真的在这个兔子洞里跳了下来。如果代码是资源密集型或具有邮件意图,则无法提前确定。即便是人类也很难。说过你可以采取一些措施来保护自己。

  1. 使用Rhino代替Java 6的内置JS脚本引擎,因为它为您提供了更多选择。
    • 实现监控指令计数的自定义上下文。这使您有机会中断无限循环的脚本。请参阅Rhino的ContextFactory
    • 在一个单独的线程中运行您的脚本,以便您可以中断处于等待状态的脚本,这些脚本不会触发Context的指令计数
    • 实施安全管理员:请参阅OverviewAPI。这将允许您将脚本限制为应该与之交互的对象。
  2. 我已在Myna中实施1,2和3,欢迎您偷取code

答案 2 :(得分:1)

已经有一个识别“糟糕”JavaScript的工具JSLint。显然,坏代码的定义非常主观,但JSLint提供了广泛的选项,因此您应该能够将其配置为与您的错误定义非常接近。

您可以通过链接到上面的Web表单向JSLint提交代码(和配置选项)。也应该可以以编程方式向JSLint提交代码(和选项),但如果您打算定期执行此操作,则应获得作者的许可。