如何修复CWE-470:使用外部控制的输入来选择类或代码(“不安全反射”)

时间:2018-06-28 15:28:54

标签: java reflection veracode

我在代码的一行上得到了470,这是Vera所定义的。

Vera说要解决:

  

使用白名单或间接应用严格的输入验证   选择以确保用户仅选择允许的类   或代码。

因此,我创建了一个严格的白名单,列出了哪些类名反射可以以Set<String>的身份访问

然后我将Class.forName包裹在

if (whitelist.contains(className) {
   Veracode still fires in here with a 470
}

谁知道维拉不启动该修复程序的样子?我觉得我已经按照他们的建议进行了补救。

2 个答案:

答案 0 :(得分:1)

我设法使用消毒剂类/方法来解决它,该方法使className生效并从硬编码值返回String中的值-例如:

公共类MySanitizer {

public static String sanitizeClassName(final String className) throws MyException {

    if(!className.equals("com.my.MyClass")) 
        throw new MyException("Class not valid: "  + className);

    return "com.my.MyClass";
}

答案 1 :(得分:0)

答案是所有类名都必须来自受信任的来源。 唯一受信任的来源是类文件中的硬编码字符串。 无需读取属性文件,也无需创建任何集合并将其传递给验证机制。

它必须看到正在加载硬编码的常量“ com.dang.this.is.strict.ClassName:”。 字符串的硬编码白名单。

您可以使用一些不错的验证代码来确保没什么不好的事情发生,但是由于不是硬编码的字符串,因此不会通过。在这种情况下,您可以减轻负担并提供解释,并希望它对检查结果的人员足够。

他们说

  

使用白名单或间接应用严格的输入验证   选择以确保用户仅选择允许的类   或代码。

我只是没有意识到白名单严格是类中的字符串常量。我的错误是认为我可以在运行时在代码中建立白名单。有时候我需要这样做,所以我将保留我的验证器并要求缓解措施。