我正在使用javax.scripting
添加对在服务器端运行任意用户上传的JavaScripts的支持。显然我想要保护这些脚本!
Rhino本身就有一个用于在运行时保护脚本的框架。但是,javax.scripting
的文档未提及脚本可用的安全性,权限或限制类。那么这只是javax.scripting
API中的一个巨大漏洞,它没有提供一个框架来保护它执行的脚本吗?
我不想直接使用Rhino,因为我最初尝试过但是在将Java实例暴露给正在运行的脚本时遇到了一些问题。 javax.scripting
框架(在引擎盖下使用Rhino)使得这个简单且简化了多线程服务器中的运行脚本。
我想列出可在运行脚本中访问/实例化的Java类。有人能指出我如何实现这个目的的示例或文档吗?
答案 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
,我可以轻松实现两个结果:
java.lang.*
,并且在我的服务器层次结构中选择了几个类。 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