【问题标题】:Malicious code vulnerability - Field should be package protected恶意代码漏洞 - 字段应包保护
【发布时间】:2013-05-20 09:22:01
【问题描述】:

Sonar 正在给我信息:

恶意代码漏洞 - 字段应该被包保护 静态数组FORMATS.

为什么这段代码被认为是恶意的?我有一个公共类来存储所有常量。

public class Constants
{
    /*
    all the public static final constants of primitive datatypes for which 
    there is no sonar warning.
    */
    public static final String[] FORMATS = new String[] {
        "yyyy-MM-dd HH:mm:ss.S z", 
        "yyyy-MM-dd HH:mm:ss.S"
}

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    可能是因为可以执行另一段代码:

    Constants.FORMATS[0] = "SOME GARBAGE";
    

    并破坏您的其余代码。

    换句话说,你的数组是不变的,但不是它的内容。

    替代品示例:

    • 您可以将每种格式存储为单独的字符串常量
    • 您可以改用不可变列表:public static final List<String> FORMATS = Collections.unmodifiableList(Arrays.asList("yyyy-MM-dd HH:mm:ss.S z", "yyyy-MM-dd HH:mm:ss.S"));
    • 让它成为一种方法:

      public static String[] formats() {
        return new String[] { "yyyy-MM-dd HH:mm:ss.S z", "yyyy-MM-dd HH:mm:ss.S" };
      }
      
    • 如果您确信 (i) 只有您自己的代码可以访问该类并且 (ii) 您/您的同事根本不会考虑重新分配其中一个值,请忽略该警告。

    【讨论】:

    • 所以 final 只会阻止像 FORMATS = new String[] {"a","b"} 这样的重新分配。但这很糟糕,所以我必须使用不可变列表?
    • 是的,这就是问题所在,这是一种可能性。
    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2015-11-05
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2017-02-12
    相关资源
    最近更新 更多