2

假设我想允许人们在我的服务器上运行简单的控制台 java 程序,而无法访问文件系统、网络或其他 IO,除非通过我自己的高度受限的 API。但是,我不想深入了解操作系统级别的限制,因此为了当前的讨论,我想考虑代码级别的清理方法。

因此,假设我尝试按如下方式实现此限制。我将禁止所有“import”语句,除了那些明确列入白名单的语句(假设“import SanitizedSystemIO. ”是允许的,而“import java.io. ”是不允许的),我将禁止在代码中的任何地方使用字符串“java.*”。因此,这样用户将能够编写引用来自 SanitizedSystemIO 的 File 类的代码,但他将无法引用 java.io.File。这样,用户被迫使用我的净化包装 api,而我自己的框架代码(它将与用户的代码一起编译和运行,例如为了提供 IO 功能)可以访问所有常规的 java api。

这种方法会奏效吗?或者有没有办法破解它来访问标准的java api?

ETA:好的,首先,它当然应该是 java.* 字符串而不是 system.*。我认为在 C# 中,基本上......

其次,好的,人们说,“使用安全管理器”或“使用类加载器”方法。但是,如果有的话,代码分析方法有什么问题?在我看来,它的一个好处是纯粹的 KISS 简单性——而不是找出所有要在 SecurityManager 中检查和清理的东西,我们只允许一个小的功能白名单并阻止其他所有内容。在实现方面,这对于对 java 知识很少的人来说是一个微不足道的练习。

并重申我最初的问题,那么这可以被黑客入侵吗?尽管有这样的代码限制,是否有一些 Java 语言结构允许访问底层 api?

4

3 回答 3

4

在你的鞋子里,我宁愿在 custom 中运行加载的应用程序ClassLoader

也许我弄错了,但是如果他想通过自己的功能允许对 IO 的有限访问,难道也不会SecurityManager阻止这些吗?有了一个习惯ClassLoader,他可以提供他的SanitizedSystemIO同时拒绝加载他不希望人们加载的东西。

但是,检查代码中的字符串绝对不是要走的路。

于 2012-04-09T16:50:59.023 回答
2

您需要检查SecurityManager. 许多 JVM 类调用它来检查它们是否具有所需的权限,然后再执行它们的工作。

于 2012-04-09T16:48:08.567 回答
2

您可以实现自己的SecurityManager. 教程

于 2012-04-09T16:48:18.843 回答