Java 如何修复CWE-470:使用外部控制输入选择类或代码(“不安全反射”)
我的代码中有一行470,这是Vera定义的 维拉说要修复: 通过使用白名单或间接输入应用严格的输入验证 选择以确保用户仅选择允许的类 或代码 因此,我创建了一个严格的白名单,说明反射作为一个集合可以访问哪些类名 然后,我将Class.forName包装在一个Java 如何修复CWE-470:使用外部控制输入选择类或代码(“不安全反射”),java,reflection,veracode,Java,Reflection,Veracode,我的代码中有一行470,这是Vera定义的 维拉说要修复: 通过使用白名单或间接输入应用严格的输入验证 选择以确保用户仅选择允许的类 或代码 因此,我创建了一个严格的白名单,说明反射作为一个集合可以访问哪些类名 然后,我将Class.forName包装在一个 有人知道维拉不开枪的原因吗?我觉得我已经遵循了他们建议的补救措施 答案是所有类名必须来自可信源。 唯一受信任的源是类文件中的硬编码字符串。 没有从属性文件读取任何内容,也没有创建并传递到验证机制的集合 它必须看到一个硬编码常量com.dan
有人知道维拉不开枪的原因吗?我觉得我已经遵循了他们建议的补救措施 答案是所有类名必须来自可信源。 唯一受信任的源是类文件中的硬编码字符串。 没有从属性文件读取任何内容,也没有创建并传递到验证机制的集合 它必须看到一个硬编码常量com.dang.this.is.strict.ClassName:正在加载。 字符串的硬编码白名单 您可以使用一些很好的验证代码来确保没有什么不好的事情发生,但它不会通过,因为它不是硬编码的字符串。在这种情况下,您可以减轻并提供解释,并希望这对审查结果的人员来说是足够的 他们说 通过使用白名单或间接输入应用严格的输入验证 选择以确保用户仅选择允许的类 或代码
我只是没有意识到白名单在类中是严格的字符串常量。我的错误是认为我可以在运行时用代码构建白名单。有时我需要这样做,所以我将保留我的验证器和索赔缓解措施。我已设法使用sanitizer类/方法来解决它,该类/方法从硬编码值获取className validate并从字符串返回值-例如: 公共级MySanizizer{
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";
}
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";
}