【发布时间】:2015-10-08 12:23:37
【问题描述】:
与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
【问题讨论】:
-
设置数组 -> 让应用程序继续运行 -> 更改在
setArray(int[])中使用的数组 -> 应用程序损坏?换句话说,仅仅因为你(可能)修复了getArray,并不意味着我仍然不能操作我在setArray中传递的数组。