如何修复 CWE-470:使用外部控制输入 Select 类 或代码 ('Unsafe Reflection')
How to Fix CWE-470: Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')
我的代码中有一行是 470,正如 Vera 所定义的那样。
Vera 说要修复:
Apply strict input validation by using whitelists or indirect
selection to ensure that the user is only selecting allowable classes
or code.
所以我创建了一个严格的白名单,其中包含 class 名称反射可以作为 Set<String>
访问的内容
然后我将 Class.forName
包裹在
中
if (whitelist.contains(className) {
Veracode still fires in here with a 470
}
有人知道 Vera 不开火的修复方法是什么吗?我觉得我已经遵循了他们推荐的补救措施。
答案是所有 class 名称都必须来自可信来源。
唯一可信的来源是 class 文件中的硬编码字符串。
没有从属性文件中读取任何内容,没有您创建并传递给验证机制的集合。
它必须看到正在加载的硬编码常量 "com.dang.this.is.strict.ClassName:"。
字符串的硬编码白名单。
您可以使用一些很棒的验证代码来确保没有发生任何问题,但它不会通过,因为它不是硬编码的字符串。在这种情况下,您可以缓解并提供解释,并希望这足以让审阅结果的人满意。
他们确实说
Apply strict input validation by using whitelists or indirect
selection to ensure that the user is only selecting allowable classes
or code.
我只是没有意识到白名单在 classes 中是严格的字符串常量。我的错误是认为我可以在 运行 时间用代码构建白名单。有时我需要这样做,所以我会保留我的验证器和索赔缓解措施。
我已经设法使用消毒剂 class/method 解决了这个问题,它从硬编码值中获取 class 名称验证和 return 值 - 例如:
public class 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";
}
我的代码中有一行是 470,正如 Vera 所定义的那样。
Vera 说要修复:
Apply strict input validation by using whitelists or indirect selection to ensure that the user is only selecting allowable classes or code.
所以我创建了一个严格的白名单,其中包含 class 名称反射可以作为 Set<String>
然后我将 Class.forName
包裹在
if (whitelist.contains(className) {
Veracode still fires in here with a 470
}
有人知道 Vera 不开火的修复方法是什么吗?我觉得我已经遵循了他们推荐的补救措施。
答案是所有 class 名称都必须来自可信来源。 唯一可信的来源是 class 文件中的硬编码字符串。 没有从属性文件中读取任何内容,没有您创建并传递给验证机制的集合。
它必须看到正在加载的硬编码常量 "com.dang.this.is.strict.ClassName:"。 字符串的硬编码白名单。
您可以使用一些很棒的验证代码来确保没有发生任何问题,但它不会通过,因为它不是硬编码的字符串。在这种情况下,您可以缓解并提供解释,并希望这足以让审阅结果的人满意。
他们确实说
Apply strict input validation by using whitelists or indirect selection to ensure that the user is only selecting allowable classes or code.
我只是没有意识到白名单在 classes 中是严格的字符串常量。我的错误是认为我可以在 运行 时间用代码构建白名单。有时我需要这样做,所以我会保留我的验证器和索赔缓解措施。
我已经设法使用消毒剂 class/method 解决了这个问题,它从硬编码值中获取 class 名称验证和 return 值 - 例如:
public class 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";
}