【问题标题】:using java scripting API to find and destroy bad/malicious java script code使用 java 脚本 API 查找和销毁不良/恶意的 java 脚本代码
【发布时间】:2009-10-21 13:23:48
【问题描述】:

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

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

我的问题

1) 我怎样才能发现错误的代码? 2) 一旦被识别为不良/恶意代码,停止运行的最佳方法是什么?

谢谢

【问题讨论】:

  • 如何停止 java 脚本机制中的无限循环?导入 javax.script.*; public class EvalScript { public static void main(String[] args) throws Exception { // 创建脚本引擎管理器 ScriptEngineManager factory = new ScriptEngineManager(); // 创建一个 JavaScript 引擎 ScriptEngine engine = factory.getEngineByName("JavaScript"); // 评估来自 String 的 JavaScript 代码 engine.eval("while(true);"); } }

标签: java javascript scripting


【解决方案1】:

我的问题是:什么是坏代码

如果您无法对什么是坏代码给出正式定义,那么您就无法希望能够检测到它。既然这可能是你的问题的真正意思,我会提出我的答案——没有办法。

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

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

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

【讨论】:

    【解决方案2】:

    你真的在这个兔子洞里跳了下来。无法提前确定代码是资源密集型还是具有恶意意图。即使是人类也很难做到这一点。话虽如此,您可以做一些事情来保护自己。

    1. 使用 Rhino 代替 Java 6 的内置 JS 脚本引擎,因为它为您提供了更多选择。
      • 实现一个自定义上下文来监控指令计数。这使您有机会中断无限循环的脚本。查看 Rhino 的 ContextFactory 课程
      • 在单独的线程中运行您的脚本,这样您就可以中断陷入等待状态但不会触发上下文指令计数的脚本
      • 实施安全管理器:请参阅OverviewAPI。这将允许您将脚本限制为仅应与之交互的那些对象。

    我在Myna中实现了1,2,3,欢迎盗取code

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我认为“坏”是指“恶意”/“恶作剧”,而不是“写得不好”。
      猜你喜欢
      • 2013-02-21
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多