java - 是否可以通过禁止导入语句和 java.* 字符串来阻止对标准 java 库的访问?

标签 java code-analysis static-code-analysis

假设我想让人们在我的服务器上运行简单的控制台 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/

相关文章:

javascript - 如何在旧版 Java Web 应用程序中捆绑 js/css

c# - 从方法返回一次性对象时出现 CA2000

c# - 如何处理通过 Next 属性迭代的对象?

c# - 禁用/修复 .Designer.cs 文件中的代码分析警告

java - Openshift 部署 F8 : Cannot access cluster for detecting mode: sun. security.validator.ValidatorException

java - 从属性中删除元素

c# - 静态检查器无法评估特定条件下的确定性行为?

c++ - cppcheck 的规则集

java - 为什么 Spring MockMvc 结果不包含 cookie?

eclipse - 使用eclipse core/JDT以编程方式分析Java源代码