【发布时间】:2012-02-15 14:10:54
【问题描述】:
您好,我的违规行为如下:
恶意代码漏洞 - 可能会通过以下方式暴露内部表示 返回对可变对象的引用
在我的代码中我是这样写的
public String[] chkBox() {
return chkBox;
}
我们如何解决它。
【问题讨论】:
您好,我的违规行为如下:
恶意代码漏洞 - 可能会通过以下方式暴露内部表示 返回对可变对象的引用
在我的代码中我是这样写的
public String[] chkBox() {
return chkBox;
}
我们如何解决它。
【问题讨论】:
假设如下:
从安全或隐私的角度来看,您的类做了一些重要的事情,并且 chkbox 的状态以某种方式用于其隐私/安全机制的类实现中。
chkBox() 方法可以被一些不受信任的代码调用。
现在考虑这段代码:
// ... in an untrusted method ...
Foo foo = ...
String[] mwahaha = foo.chkBox();
mwahaha[0] = "Gotcha!"; // ... this changes the effective state of `Foo`
通过返回对表示chkbox 的实际数组的引用,您允许Foo 类外部的代码进入并更改其状态。
从设计的角度来看,这很糟糕(它被称为“泄漏抽象”)。但是,如果在可能存在不受信任代码的上下文中使用此类,则此(chkBox() 方法)是一个潜在 安全漏洞。 这就是违规信息告诉你的。
(当然,代码检查器无法知道这个特定的类是否真的安全关键。这是你自己理解的。它实际上对你说的是“嘿!看这里!这很可疑!")
修复取决于此代码(或实际上是整个库或应用程序)是否对安全性至关重要......或者代码在未来的某些部署中是否对安全性至关重要。如果这是虚惊一场,你可以直接压制违规;即标记它,以便检查器忽略它。如果这是一个真正的问题(或可能成为一个真正的问题),那么要么返回数组的副本:
return (String[]) chkBox.clone();
但很明显,每次调用chkBox 时克隆阵列都会产生性能成本。或者,您可以修改 chkBox 方法以返回数组的选定元素:
public String chkBox(int i) {
return chkBox[i];
}
在这种情况下,我怀疑替代方法会更好……尽管这取决于当前使用该方法的方式。
【讨论】:
ArrayList,那么调用者可以对其执行变异操作……你的抽象仍然是泄漏的。返回一个不可修改的列表将是一种改进......取决于列表中的内容。
正如错误消息所述,您正在返回内部状态(chkBox 很可能是对象内部状态的一部分,即使您没有显示其定义)
这可能会导致问题 - 例如 - 这样做
String[] box = obj.chkBox();
box[0] = null;
由于数组对象和所有 Java 对象一样,都是通过引用传递的,这也会改变存储在对象中的原始数组。
您最可能想要解决此问题的方法很简单
return (String[])chkBox.clone();
返回数组的副本而不是实际的数组。
【讨论】: