解决“公共静态最终版本”安全漏洞

时间:2019-08-25 10:07:40

标签: java security

这是java中的一个安全漏洞:

// Potential security hole!

static public final Thing[] VALUES = { ... };

一般的解决方案可以是

private static final String[] VALUES = { "a", "b" };   
public static final String[] values()
{
    return VALUES.clone();
}

我认为克隆数组仍然可以修改内部值,为什么这被认为是可接受的解决方案?

1 个答案:

答案 0 :(得分:1)

它允许修改原始数组的副本的内容。但是原始数组未修改。

并且由于values()的每个呼叫者都收到一个单独的副本,因此一个呼叫者修改其副本不会影响另一个呼叫者。

也就是说,一般而言,您应该更喜欢集合而不是数组。并且可以使集合不可修改,从而避免进行复制。

public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(...));

但是请注意,无论选择哪种解决方案,如果Thing并非一成不变,那么任何人仍然可以修改事物的状态,而无需修改任何数组或列表。