与https://cwe.mitre.org/data/definitions/496.html
相关 谷歌搜索引导我,我们不应该直接从公共getter / setter获取/设置私有数组。我们可以通过从getter而不是实际数组返回数组的副本来解决它。对于getter,我们可以将私有数组分配给在setter中作为参数接收的数组副本。现在,我知道如果我们使用getter,那么对数组的引用就会消失,并且可以随时修改。
private int[] arr = {1,2,3};
public int[] getArray() {
return arr;
}
可以访问类的其他地方,执行此操作:
int[] badArray = obj.getArray();
badArray[0] = 100;
修改private arr
。
我的问题是阵列怎么可能受到伤害。也就是说,如果我将我的getter修改为:
public int[] getArray() {
return Arrays.copyOf(arr, arr.length);
}
并将我的二传手保持为:
public void setArray(int[] arr) {
this.arr = arr;
}
这怎么可能对我的私人阵列有风险。请举例说明。 相关:Getters and setters for arrays
答案 0 :(得分:5)
如果你将你的二传手保持为:
public void setArray(int[] arr) {
this.arr = arr;
}
setter的调用者拥有对你的类实例中存储的同一个数组实例的引用,并且可以直接修改它。
YourClass obj = new YourClass ();
int[] arr = new int[] {1,2,3};
obj.setArray (arr);
arr[0] = 5; // this will modify the array stored inside obj
如果您也在setter中创建了数组的副本,则可以解决此问题:
public void setArray(int[] arr) {
this.arr = Arrays.copyOf(arr, arr.length);
}
对于可变引用类型数组的更一般情况(与原始int数组示例不同),即使您阻止修改私有数组,仍可以从数组中保留引用保留在数组中的对象在你的课外(除非你的二传手和吸气者也复制了它们)。