为什么公共静态最终数组是一个安全漏洞?
问题内容:
有效的Java说:
//潜在的安全漏洞!
静态公共最终Thing [] VALUES = {…};
有人可以告诉我什么是安全漏洞吗?
问题答案:
声明static final public
字段通常是类常量的标志。对于原始类型(int,double等)和不可变的类(例如字符串和),这是非常好的选择java.awt.Color
。对于数组,问题在于,即使数组引用是恒定的,数组的元素仍然可以更改,并且因为它是一个字段,所以更改不受保护,不受控制并且通常是不受欢迎的。
为了解决这个问题,可以将数组字段的可见性限制为私有或程序包私有,因此在查找可疑修改时可以考虑使用较小的代码体。另外,通常更好的方法是一起删除数组,并使用“列表”或其他适当的集合类型。通过使用集合,您可以控制是否允许更新,因为所有更新都通过方法进行。您可以使用来包装您的收藏,以防止更新Collections.unmodifiableList()
。但是请注意,即使集合是不可变的,您也必须确保存储在集合中的类型也是不可变的,否则会重新出现假定的常量的未经请求的更改的风险。