2016-12-15 33 views
0

當我進行聲吶掃描時,我得到的漏洞是「可變成員不應直接存儲或返回」。在提到我們應克隆可變對象或返回不可修改列表的情況下,也會提供此解決方案。 但是,如果我克隆該對象,並在稍後如果我想更新該值,那麼如何訪問原始對象,因爲我已經返回了克隆的對象? 對此的任何想法將不勝感激。在此先感謝聲吶掃描 - 可變成員不應該直接存儲或返回

回答

2

但是如果我克隆對象,後來,如果我要更新的值,那麼我怎麼能訪問原來的對象,因爲我已經回到了克隆的對象

你不。至少不是來自主叫方。

我這裏走出去的肢體,並說我們在談論一個列表,因此:

public class MyClass { 
    private List<String> strings; 

    public List<String> getStrings(){ 
    // returns a copy, so member list is still intact 
    return new ArrayList<String>(strings); 
    } 

    public void addString(String newString) { 
    strings.add(newString); 
    } 

    public void dropString(String oldString) { 
    strings.remove(oldString); 
    } 

    public void replaceString(String oldString, String newString) { 
    dropString(oldString); 
    addString(newString); 
    } 
} 

換句話說,你控制通過所屬的類訪問成員的行動。如果你真的想要一個任何人都可以獲得和更新的公共成員(不是我推薦的),那麼放棄獲得者並且讓成員public

+0

在st開發者之間進行討論後,還有一點我得到了。如果調用者來自我們的系統/應用程序,而不是來自外部,那麼仍然傳遞可變對象將是一個漏洞?因爲即使調用者更改了可變對象,因爲它來自系統內部,這也不會影響系統。 – Swapneel

+0

@Swapneel我不是安全專家,但我相信假設調用者只會並且總是「內部」被認爲是有風險的。但隨後安全人士對自然和未來都是偏執狂。 –

+0

感謝您的回覆。讚賞 – Swapneel