如何保护Class.forName(" SimpleClass")?

时间:2016-12-06 10:19:05

标签: java security checkmarx

我在我们的应用程序上运行了安全扫描,其中一个安全问题是"下载没有完整性检查的代码"。该行的风险点为Class.forName("SimpleClass");

如何保护上述代码? 如何确保forName("")的参数不是我要加载的恶意类。

编辑:使用的安全扫描是Checkmarx。

3 个答案:

答案 0 :(得分:2)

如果您没有从外面获得任何课程,this weakness不适用于此处。在这种情况下,如果已经在类路径中,则可以加载恶意类。这意味着攻击者已经可以访问类路径 - 在这种情况下,阻力是徒劳的。

如果您确实从外部获取课程 - 例如,从某个地方下载课程或允许用户上传课程或源代码并进行编译 - 那么您就会遇到这个弱点并需要采取措施。如果您从用户那里获得课程,则会遇到问题。 :)如果你从某个位置获得它们,你似乎是安全的,你可以使用HTTPS或自己检查签名。但我想这不是你的情况。

答案 1 :(得分:0)

您可以创建一个枚举来容纳要基于该字符串使用的所有类,而不是使用Class.forName("SimpleClass");。例如:

public enum InvokeableClasses {
    SOME_CLASS(SomeClass.class),
    ANOTHER_CLASS(AnotherClass.class),
    YET_ANOTHER_CLASS(YetAnotherClass.class),
    SIMPLE_CLASS(SimpleClass.class);

    private final Class clazz;
    InvokeableClasses(Class clazz){
        this.clazz = clazz;
    }

    public Class getClazz() {
        return this.clazz;
    }

    public static InvokeableClasses fromString(String className) {
        for(InvokeableClasses currentInvokeableClass : InvokeableClasses.values()) {
            if(currentInvokeableClass.getClazz().getSimpleName().equalsIgnoreCase(className)) {
                return currentInvokeableClass;
            }
        }
        return null;
    }
}

然后您像这样利用枚举而不是Class.forName("SimpleClass");

InvokeableClasses.fromString("SimpleClass").getClazz();

我使用了类似的方法,选择getCanonicalName()代替getSimpleName()来确保类来自预期的程序包。

这里的缺点是,您需要事先枚举可能的类,但这要安全得多。

我知道这个问题很旧,但是感觉答案并不完全令人满意。

答案 2 :(得分:-1)

不要将包含不受信任的类的jar放在类路径中。

消息不正确。这不会下载任何东西。它只会加载一个必须已经在类路径中的类才能成功加载。