我正在使用javax.scripting
添加对在服务器端运行任意用户上传的JavaScript的支持。显然,我想保护那些脚本!
Rhino本身就有一个用于在运行时保护脚本的框架。但是,javax.scripting
的文档中没有提及该脚本可用的安全性,权限或限制类。难道这只是javax.scripting
API的一个巨大漏洞,它没有提供保护执行脚本的框架吗?
我不想直接使用Rhino,因为我最初尝试过,但是在将Java实例暴露给正在运行的脚本时遇到了一些问题。 javax.scripting
框架使其得以实现(它在后台使用Rhino)使得此琐碎且简化了在多线程服务器中运行的脚本。
我想将可以在运行脚本中访问/实例化的Java类列入白名单。谁能指出我有关如何实现此目标的示例或文档?
最佳答案
事实证明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帖子中链接了它)在描述
ClassShutter
体系结构和Rhino自己的框架方面很有值(value)ContextFactory
API页面描述了如何构建自定义ContextFactory
。关于javascript - 如何保护使用javax.scripting运行的脚本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1347099/