【问题标题】:Compile and Run with java.lang package alone单独使用 java.lang 包编译和运行
【发布时间】:2018-03-28 09:35:36
【问题描述】:

我有 jdk-10_linux-x64_bin.tar.gz。我已经解压了这个文件。

我想修改 JDK 文件夹的内容,这样当我使用 javac bin 文件编译 java 代码时,当 java 代码包含对任何其他包的引用时(例如java.io、java.util、..etc),而不是“java.lang.*”。我只想删除除“java.lang”包之外的所有包。

即使 java 文件尝试在运行时(使用类加载器)获取包,类也不应该可用。所以我只想删除“java.lang”包以外的其他包。

我试图在 JDK 文件夹中找到其他包,但我很困惑。我无法通过搜索谷歌直接找到任何解决方案。我也不知道删除其他包是否会导致一些依赖错误。

有人试过修改JDK文件夹内容吗?

【问题讨论】:

  • 你的实际目标是什么?
  • 您可能需要创建自己的类加载器
  • @Stultuske 我将编译一个从用户那里收集的 java 代码。我不应该允许用户使用“java.lang”以外的任何其他包
  • @AniketSahrawat 使用自定义类加载器是一项昂贵的操作吗?因为我将为每个请求执行这个 javac 命令。我也可以使用我自己的类加载器防止在运行时加载类吗?
  • 一定要检查 java.lang 中不需要的类,否则人们可以使用 ClassLoader 并通过动态加载新类来绕过您设置的任何限制。 docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html

标签: java


【解决方案1】:

请不要手动修改 Java 平台库

相反,请考虑使用自定义策略设置 SecurityManager,您可以在其中决定允许运行哪些类(甚至方法)。

只需创建一个SecurityManager,您就可以在运行时使用您的自定义安全策略 中的System.setSecurityManager() 方法进行设置。

这将允许您捕获发生违反安全策略时引发的异常,以返回对用户有用的内容。

快速查看intro to security managers in Java

【讨论】:

  • 我可以通过设置来限制 System.setSecurityManager() 方法吗?
  • 当然。还请测试并考虑序列化(对象、序列化并作为编码字符串提交)和 URL 类加载。我认为通过阻止对所有 I/O 的访问应该没问题,但值得牢记此类攻击
  • 非常感谢@diginoise。这很有帮助
【解决方案2】:

去C:\Program Files\Java\jdk version\jre\lib,打开rt.jar zip,然后删除你想要的包

【讨论】:

  • 我找不到提到的目录或 rt.jar 文件。我正在使用 jdk-10_linux-x64_bin.tar.gz
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
相关资源
最近更新 更多