16

我正在使用javax.scripting添加对在服务器端运行任意用户上传的 JavaScript 的支持。显然我想保护这些脚本!

Rhino 本身就有一个在运行时保护脚本的框架。但是,的文档javax.scripting没有提及脚本可用的安全性、权限或限制类。那么这只是javax.scriptingAPI 中的一个巨大漏洞,它没有提供一个框架来保护它执行的脚本吗?

我不想直接使用 Rhino,因为我最初尝试过,但是在将 Java 实例暴露给正在运行的脚本时遇到了一些问题。javax.scripting框架使它(它在引擎盖下使用 Rhino)使这变得微不足道,并且还简化了多线程服务器中的运行脚本。

我想将可以在运行脚本中访问/实例化的 Java 类列入白名单。谁能指出我如何实现这一目标的示例或文档?

4

3 回答 3

18

事实证明,javax.scripting它不提供安全框架。经过一番搜索,我在 Google 的缓存中找到了一个文档,该文档建议尝试使用 Java 的doPrivilegedAction框架,但经过一些实验后,我无法阻止脚本打开套接字或访问文件系统。

在我问了这个问题之后,我发现之前在 StackOverflow 上有人问过这个问题:How can you run Javascript using Rhino for Java in a sandbox? 在那个页面上,它错误地表明 JDK6 中包含的 Rhino 已经解决了安全问题。正如我所指出的,我能够从脚本中打开套接字和其他有害操作。

最后我放弃javax.scripting并直接嵌入了Rhino。通过构建一个ContextFactory也是 a 的自定义,ClassShutter我能够轻松地实现两个结果:

  1. 将脚本执行时间限制为最大时间限制
  2. 限制对我列入白名单的类的访问权限,这基本上java.lang.*是我服务器层次结构中的几个类。

CodeUtopia(我无法链接到,因为作为一个新用户,我不允许在单个帖子中链接到多个页面;但它在另一个 StackOverflow 帖子中链接)对于描述ClassShutter架构和 Rhino 自己的ContextFactoryAPI很有价值页面描述了如何构建自定义ContextFactory.

于 2009-08-29T20:10:51.543 回答
2

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/描述了一种沙箱 rhino 的方法,javax.scripting 使用 Rhino 作为 JS 脚本引擎,所以你应该能够使用上面,尽管包名称可能不同。

我一直在开发一个需要 Rhino 来编写脚本的 Java 应用程序。该应用程序需要运行来自 3rd 方的不受信任的 JavaScript 代码,因此我必须找到一种方法来阻止对所有 Java 方法的访问,除了我想要的那些。如果有一种简单的方法可以禁用 LiveConnect(Rhino 提供对脚本的 Java 访问的功能),这将不是问题,但没有这样的事情。

然而,经过大量的挖掘,我终于找到了一种不需要太多黑客攻击的方法。事实上,只需扩展一些 Rhino 类,并使用提供的设置器覆盖一些默认设置,就可以做到这一点。

于 2009-10-21T18:00:05.730 回答
0

仅供参考,这现在可以在使用名为 Nashorn 的新引擎的 javax.scripting 的新 Java 8 实现中实现。请参阅安全 Nashorn JS 执行

于 2015-02-18T09:47:39.967 回答