我正在使用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/

    10-17 02:27