恶意代码漏洞 - 可能通过返回对可变对象的引用来暴露内部表示形式
嗨,我得到的违规行为如下:
恶意代码漏洞 - 可能通过返回对可变对象的引用来暴露内部表示形式
在我的代码中,我这样写
public String[] chkBox() {
return chkBox;
}
我们如何解决它。
嗨,我得到的违规行为如下:
恶意代码漏洞 - 可能通过返回对可变对象的引用来暴露内部表示形式
在我的代码中,我这样写
public String[] chkBox() {
return chkBox;
}
我们如何解决它。
正如错误消息所述,您正在返回内部状态(chkBox很可能是对象内部状态的一部分,即使您没有显示其定义)
这可能会导致问题,例如 , 如果您 - 做
String[] box = obj.chkBox();
box[0] = null;
由于数组对象与所有 Java 对象一样,都是通过引用传递的,因此这也将更改存储在对象内的原始数组。
您最有可能想要做的是解决此问题是一个简单的
return (String[])chkBox.clone();
它返回数组的副本,而不是实际的数组。
让我们假设以下内容:
您的类执行从安全或隐私角度来看很重要的事情,并且在其隐私/安全机制的类实现中以某种方式使用了 的状态。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];
}
在这种情况下,我怀疑替代方法会更好...尽管这取决于当前如何使用该方法。