沙箱 JSR-223

发布于 2024-08-03 20:00:38 字数 547 浏览 3 评论 0原文

我正在尝试对 JSR-223 进行沙箱处理。具体来说,我不希望任何脚本访问我的任何类。 (我听说 Rhino 可以使用 ClassShutter 做到这一点,但我想一般地做到这一点。即对于 JSR-223 的所有脚本引擎)。

我首先尝试使用 AccessController.doPrivileged 解决方案,根本不传递任何权限。它适用于大多数权限,但脚本仍然可以访问我的所有公共类(它似乎忽略“包访问”权限......?)。

发现了这个。我的问题是:如何在脚本引擎上安装自定义类加载器? (或者如果必须的话,如何全局替换类加载器?)

I'm trying to sandbox JSR-223. Specifically, I don't want any script to have access to any of my classes. (I hear Rhino can do that with ClassShutter, but I want to do it generally. ie. for all script engines of JSR-223).

I first tried to use the AccessController.doPrivileged solution, by passing no permissions at all. It works for most permissions, but the scripts can still access all my public classes (it seems to ignore "package access" permission ...?).

I found this. My question is : how do I install a custom ClassLoader on the script engine ? (Or How do I replace the ClassLoader globally if I have to ?)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眼角的笑意。 2024-08-10 20:00:38

ScriptEngineManager 有一个采用类加载器的构造函数。类加载器用于加载脚本引擎实现。由于类继承了它们的类加载器,因此脚本引擎及其创建的任何对象也应该使用该类加载器。

该类加载器需要拒绝任何未列入白名单的类的存在。

最重要的是使用自定义的 SecurityManager,以便您可以根据正在使用的类加载器进行访问检查。

编辑:这是我在 Java 中的沙盒 Rhino。其中大部分内容也应适用于 JSR-223。 Sun的实现是Rhino的修改,因此可能存在一些差异。

There is a constructor for ScriptEngineManager that takes a classloader. The classloader is used to load the scripting engine implementation. As classes inherit their classloaders, the scripting engine and any objects it creates should also use that classloader.

That classloader needs to deny the existence of any classes that are not white-listed.

Top it off with a custom SecurityManager so you can base access checks on which classloader in use.

Edit: Here's an article I found on Sandboxing Rhino in Java. Most of it should also apply to JSR-223. Sun's implementation is Rhino with modifications, so there may be some differences.

掩耳倾听 2024-08-10 20:00:38

是否可以在单独的 JVM 中运行需要脚本引擎的应用程序部分?您可以使用不同的类路径(和安全管理器)启动脚本引擎 JVM,然后在 2 个 JVM 之间使用某种形式的轻量级消息传递。

Is it possible to run the part of your application that requires the scripting engine in a separate JVM? You could start the scripting engine JVM with a different classpath (and security manager) and then use some form of lightweight message passing between the 2 JVMs.

橙幽之幻 2024-08-10 20:00:38

请参阅 http:// code.google.com/p/prebake/source/browse/trunk/code/src/org/prebake/js/RhinoExecutor.java 以及同一包中的相关类,尤其是其中的 SANDBOXING_FACTORY。

这是一些将犀牛解释器沙箱化的代码,以允许它访问由加载程序介导的文件系统。

See http://code.google.com/p/prebake/source/browse/trunk/code/src/org/prebake/js/RhinoExecutor.java and related classes in the same package, especially the SANDBOXING_FACTORY there.

That's some code that sandboxes a rhino interpreter to allow it access to the filesystem mediated by a loader.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文