假设我想让人们在我的服务器上运行简单的控制台 java 程序,而不能访问文件系统、网络或其他 IO,除非通过我自己的高度受限的 API。但是,我不想深入探讨操作系统级别的限制,因此为了当前的讨论,我想考虑代码级别的清理方法。
所以假设我尝试按如下方式实现此限制。我将禁止所有“导入”语句,除了那些明确列入白名单的语句(假设“import SanitizedSystemIO.”是允许的,而“import java.io.”是不允许的)并且我将禁止字符串“java.io”。 *"代码中的任何位置。所以这样用户就可以编写引用 SanitizedSystemIO 中的 File 类的代码,但他将无法引用 java.io.File。通过这种方式,用户被迫使用我经过清理的包装器 api,而我自己的框架代码(将与用户代码一起编译和运行,例如为了提供 IO 功能)可以访问所有常规 java api。
这种方法行得通吗?或者有没有办法破解它以访问标准 java api?
ETA:好的,首先,它当然应该是 java.* strings 而不是 system.*。我认为在 C# 中,基本上...
其次,好的,所以人们说,“使用安全管理器”或“使用类加载器”方法。但是,代码分析方法有什么问题(如果有的话)?在我看来,它的一个好处是纯粹的 KISS 简单性——我们不需要在 SecurityManager 中找出所有要检查和清理的东西,我们只允许一个小的功能白名单并阻止其他所有东西。在实现方面,对于 Java 知识最少的人来说,这是一项微不足道的练习。
并重申我最初的问题,这可以被黑客入侵吗?尽管存在此类代码限制,是否存在一些允许访问底层 api 的 java 语言构造?
最佳答案
换句话说,我宁愿在自定义 ClassLoader
中运行加载的应用程序。
也许我错了,但如果他想通过他自己的函数允许对 IO 的有限访问,SecurityManager
不会也阻止这些吗?通过自定义 ClassLoader
,他可以提供他的 SanitizedSystemIO
,同时拒绝加载他不希望人们加载的东西。
但是,检查代码中的字符串绝对不是要走的路。
关于java - 是否可以通过禁止导入语句和 java.* 字符串来阻止对标准 java 库的访问?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10076551/