2013-05-20 30 views
3

聲納是給我的留言:惡意代碼漏洞 - 現場應包保護

惡意代碼漏洞 - 字段應該包保護的 靜態數組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" 
} 

回答

13

可能是因爲另一段代碼可以執行:

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)您/您的公司沒有辦法同事甚至會想到重新分配其中一個值。
+0

所以最終只是防止重新分配像FORMATS = new String [] {「a」,「b」}。但那很糟糕,所以我必須使用不可變列表呢? – dumper

+0

是的,這是問題,這是一種可能性。 – assylias