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

Jef*_*man 16 javascript security javax.script server-side-scripting

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

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

我不想直接使用Rhino,因为我最初尝试过但是在将Java实例暴露给正在运行的脚本时遇到了一些问题.该javax.scripting框架由它(它使用犀牛罩下)在一个多线程服务器使这个琐碎,并且还简化了运行脚本.

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

Jef*_*man 18

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

在我问这个问题后,我发现之前在StackOverflow上询问过:如何在沙盒中使用Rhino for Java运行Javascript? 在那个页面上,它错误地表明包含在JDK6中的Rhino已经安全地解决了.正如我所指出的,我能够从脚本中打开套接字和其他有害操作.

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

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

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