如何保护使用javax.scripting运行的脚本?

时间:2009-08-28 13:49:09

标签: javascript security javax.script server-side-scripting

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

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

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

我想列出可在运行脚本中访问/实例化的Java类。有人能指出我如何实现这个目的的示例或文档吗?

3 个答案:

答案 0 :(得分: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的自定义ClassShutter,我可以轻松实现两个结果:

  1. 将脚本执行时间限制为最长时限
  2. 限制对我列入白名单的人的类访问权限,这基本上是java.lang.*,并且在我的服务器层次结构中选择了几个类。
  3. CodeUtopia(我无法链接到,因为作为一个新用户,我不允许链接到一个帖子中的多个页面;但它在另一个StackOverflow帖子中链接)在描述{{ 1}}架构和Rhino自己的ClassShutter API页面描述了如何构建自定义ContextFactory

答案 1 :(得分:2)

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

  

我一直在研究一个Java应用程序   需要Rhino来编写脚本。该应用程序   需要运行不受信任的JavaScript   来自第三方的代码,所以我必须这样做   找到一种阻止访问所有Java的方法   方法,除了我想要的方法。   如果有的话,这不会是一个问题   是一种禁用LiveConnect的简单方法    - Rhino的功能,提供脚本的java访问 - 但有   没有这样的事情。

     然而,经过大量的挖掘   在身边,我终于找到了办法   这没有太多的黑客攻击。在   事实上,它可以通过扩展来完成   一些Rhino类,并使用   提供者提供覆盖一些   默认的。

答案 2 :(得分:0)

仅供参考,现在可以在使用名为Nashorn的新引擎的javax.scripting的新Java 8实现中实现。见Secure Nashorn JS Execution