Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何保护使用javax.scripting运行的脚本?_Javascript_Security_Javax.script_Server Side Scripting - Fatal编程技术网

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

Javascript 如何保护使用javax.scripting运行的脚本?,javascript,security,javax.script,server-side-scripting,Javascript,Security,Javax.script,Server Side Scripting,我正在使用javax.scripting添加对在服务器端运行任意用户上传的JavaScripts的支持。显然我想保护那些脚本 Rhino本身就有一个在运行时保护脚本的框架。但是,javax.scripting的文档没有提到安全性、权限或限制脚本可用的类。那么这只是javax.scriptingAPI中的一个巨大漏洞,它没有提供一个框架来保护它执行的脚本吗 我不想直接使用Rhino,因为我最初尝试过使用Rhino,但在将Java实例暴露给运行中的脚本时遇到了一些问题。脚本编写框架(在引擎盖下使用R

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

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

我不想直接使用Rhino,因为我最初尝试过使用Rhino,但在将Java实例暴露给运行中的脚本时遇到了一些问题。脚本编写框架(在引擎盖下使用Rhino)使得这一点变得微不足道,并且简化了在多线程服务器中运行脚本


我想列出可以在运行脚本中访问/实例化的Java类。有人能给我举个例子或文档来说明如何实现这一点吗?

事实证明,
javax.scripting
并没有提供安全框架。经过一些搜索,我在Google的缓存中找到了一个文档,该文档建议尝试使用Java的
DoPrivilegeAction
框架,但经过一些实验,我无法获得该文档,以阻止脚本打开套接字或访问文件系统

在我问了这个问题之后,我发现它之前在StackOverflow上被问过:在那个页面上,它错误地表明JDK6中包含的Rhino已经解决了安全问题。正如我指出的,我能够从脚本中打开套接字和其他有害操作

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

  • 将脚本执行时间限制为最大时间限制
  • 将类访问限制为我列出的那些类,这些类基本上是
    java.lang.*
    ,以及我的服务器层次结构中的一些精选类
  • CodeUtopia(我不能链接到它,因为作为一个新用户,我不允许在一篇文章中链接到多个页面;但它在另一篇文章中链接)在描述
    ClassShutter
    体系结构时很有价值,Rhino自己的
    ContextFactory
    API页面描述了如何构建自定义
    ContextFactory

    描述了一种沙箱Rhino的方法,而javax.scripting使用Rhino作为JS脚本引擎,因此您应该能够使用上述方法,尽管包名可能不同

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

    然而,经过大量挖掘 我终于找到了一个办法 这没有太多的黑客攻击。在里面 事实上,只需扩展 一些Rhino类,并使用 设置程序提供用于覆盖某些 默认值中的一个


    仅供参考,这在javax.scripting的新Java8实现中是可能的,它使用了一个名为Nashorn的新引擎。看