繁体   English   中英

Java中Class.forName的安全性

[英]Safety of Class.forName in java

假设我有以下内容:

public class ForNameTest {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException {
        final String s = "java.lang.Integer";
        Object test = Class.forName(s).getConstructors()[0].newInstance(222);
        System.err.println(test);
    }
}

在这段代码中,我根据String的值创建了一个对象,该对象的值在编译时是已知的,因此,我相信这段代码可以保证没有漏洞。 是否有“ s”可以采用的值来执行任意代码? 如果需要,“ s”可以包含所需的代码。

可能可以修改.class文件,以将字符串池中的字符串"java.lang.Integer"替换为"com.something.MaliciousClass" 此类将被加载,并且其静态初始化程序将被执行。 即使构造函数参数匹配。

但是,如果可以修改.class文件,则可以在其中放置任何种类的恶意代码,仅替换一个String是没有意义的。

如果您的字符串是在编译时分配的,则可能是安全的,如果从某个地方读取它,请确保它包含您期望的内容,即可以实例化的类的白名单名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM