如何删除此动态 class 加载或替换此 class 加载?

How to remove this use of dynamic class loading or replace this class loading?

othersMap.put("maskedPan", Class.forName("Some Class"));

删除动态 class 加载的使用。

规则

更新日志 类 不应动态加载 动态加载的 classes 可能包含由静态 class 初始化程序执行的恶意代码。 IE。您甚至不必在此类 classes 上实例化或显式调用方法就容易受到攻击。 此规则会为每次使用动态 class 加载提出问题。 不合规代码示例

String className = System.getProperty("messageClassName");
Class clazz = Class.forName(className);  // Noncompliant

一个选项是这样的:

Class<?> cls;

switch (System.getProperty("messageClassName")){
   case "com.example.Message1":
     cls = com.example.Message1.class;
     break;
...
}

好吧,你可以尝试超越声纳规则,例如通过使用反射调用 Class.forName() 方法,但我觉得你会在那里解决错误的问题:

Class.class.getDeclaredMethod("forName", String.class).invoke(null, className);

正确的做法是说服您组织中 运行 Sonar 的人您所做的事情是必要的,他们需要为您破例。或者,如果你不能说服他们,就停止这样做。

让我们首先声明一个显而易见的事实:SonarQube 规则并不意味着被视为宇宙中唯一的真理。它只是一种将您的注意力吸引到可能敏感的代码段的方法,并由您采取适当的措施。如果您组织中的人强迫您遵守 SonarQube 的规则,那么他们不了解该工具的用途。

在这种情况下,规则告诉您您有任意代码执行的风险,因为 class 名称是通过系统 属性 加载的,没有任何安全检查.我只能同意规则所说的。

现在,由您决定如何处理这些信息:

  • 如果您认为您的构建和部署系统足够健壮,没有恶意代码可以通过此通道旁加载,您可以将此问题标记为不会修复,可选择就您认为这 不是问题 的原因发表评论,然后继续
  • 如果相反,您假设攻击者可以将 .class.jar 文件放在应用程序 class 路径中的某处,并将其用作任意代码执行的侧载通道,您应该至少验证所提供的 class 名称是否符合您的预期,并拒绝任何意外的名称