首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保护Class.forName("SimpleClass")?

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

Stack Overflow用户
提问于 2016-12-06 18:19:05
回答 3查看 4.7K关注 0票数 4

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2016-12-06 18:38:40

如果您没有从外部获得任何类,则this weakness在这里不适用。在这种情况下,如果恶意类已经在类路径上,则可以加载恶意类。这意味着攻击者已经有权访问类路径-在这种情况下,抵抗是徒劳的。

如果您确实从外部获得了类-例如,从某个地方下载它们,或者允许用户上传类或源代码并对其进行编译-那么您就会受到这一弱点的影响,需要采取措施。如果你从用户那里得到类,你就有问题了。:)如果你从你认为安全的地方获得它们,你可以使用HTTPS或自己检查签名。但我猜这不是你的案子。

票数 3
EN

Stack Overflow用户

发布于 2016-12-06 18:36:57

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

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

票数 1
EN

Stack Overflow用户

发布于 2019-11-20 07:05:13

除了使用Class.forName("SimpleClass");,您还可以创建一个枚举,其中包含您想要基于该字符串利用的所有类。例如:

代码语言:javascript
复制
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");,如下所示:

代码语言:javascript
复制
InvokeableClasses.fromString("SimpleClass").getClazz();

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40992901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档