背景

系统中解耦组件的一个优点是您可以在不必触摸现有代码的情况下扩展系统。

有时您甚至不必重新编译旧代码,因为您可以从如下动态加载磁盘的类:

clazz = Demo.class.getClassLoader().loadClass("full.package.name.to.SomeClass");
.

允许某种类型的插件架构(给予或服用)。

问题

如何防止使用ClassLoader动态加载类时运行恶意代码?

有帮助吗?

解决方案

这个问题是这一个堆栈溢出。

所说,“插件架构”听起来不像你可以有意义地捍卫恶意代码的东西,因为它需要与系统的其余部分密切互动。这是一个你无法获胜的游戏,所以不要玩它。只需接受插件可以在系统中执行任何操作,因此只能安装受信任的插件。

其他提示

当您想要避免恶意代码时,问题是“您如何定义恶意行为”?有无数的东西可以做到这一点,这不是用户的最佳兴趣,并且禁止它们都是一个毫无意义的运动。

而不是黑名单禁止功能,您应该选择允许的功能。

当您希望将插件限制为有限的功能时,您不应该在Java中实现它们。你宁愿使用脚本语言。 java与脚本语言相当漂亮。默认情况下,脚本语言无法执行任何操作,但您可以选择性地将数据包,类和对象视为引擎。这使您可以对脚本引擎可以而且不能做的细粒度控制。

要求要签名的文件可以有所帮助。

是一个关于jar签名的维基百科文章。

这是Wikipedia文章的部分,这是重要的...

开发人员可以数字签名jar文件。在这种情况下,签名 信息成为嵌入式清单文件的一部分。罐子本身 未签名,而是列出了存档中的每个文件 以及其校验和;这是签名的这些校验和。 多个实体可以签署JAR文件,更改JAR文件本身 每次签名,虽然签名文件本身仍然有效。 当Java运行时加载签名的JAR文件时,它可以验证 签名和拒绝加载与签名不匹配的类。 它还可以支持“密封”包,其中ClassLoader将 如果它们只允许将Java类加载到同一包装中 全部由同一实体签署。这可以防止恶意代码 插入现有包,因此获得访问 包范围类和数据。

开发人员可以混淆jar文件,以便jar文件的用户 有关它包含的代码并没有得到很多信息,或者 减小其大小,可用于移动电话应用程序 开发。

我通常不仅仅是链接和引用维基百科。没有人提到了这个解决方案,但它不在我的专业领域。如果有更多的Java体验的人会提供详细的答案,请给我发表评论,我会删除这个答案。

许可以下: CC-BY-SA归因
scroll top