恶意代码漏洞 – 可能通过返回对可变对象的引用来公开内部表示
嗨,我收到的违规行为如下:
恶意代码漏洞 – 可能通过返回对可变对象的引用来公开内部表示
在我的代码中,我这样写
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
的实际数组的chkbox
,您允许Foo
类外部的代码进入并更改其状态。
从设计角度来看,这很糟糕(它被称为“漏洞抽象”)。 但是,如果此类在可能存在不受信任的代码的上下文中使用,则此( chkBox()
方法)是潜在的安全漏洞。 这就是违规消息告诉你的内容。
(当然,代码检查器无法知道这个特定的类是否真的对安全性至关重要。这是你要理解的。实际上对你说的是“嘿!看这里!这是可疑的!” )
修复程序取决于此代码(或整个库或应用程序)是否对安全性至关重要……或者代码在将来的部署中是否具有安全性。 如果这是误报,你可以压制违规行为; 即标记它以便检查器忽略它。 如果这是一个真正的问题(或者可能成为一个真正的问题),那么要么返回一个数组的副本:
return (String[]) chkBox.clone();
但显然,每次调用chkBox
时克隆数组都会产生性能成本。 或者,您可以修改chkBox
方法以返回数组的选定元素:
public String chkBox(int i) { return chkBox[i]; }
在这种情况下,我怀疑替代方法会更好……虽然它取决于当前如何使用该方法。