我对我所有的代码运行findbugs,并且只处理最上面的东西。我终于解决了最重要的问题,现在正在查看细节。我有一个简单的实体,比如说一个用户:
public class User implements Serializable
{
protected Date birthDate;
public Date getBirthDate()
{return(birthDate);}
public void setBirthDate(final Date birthDate)
{this.birthDate = birthDate;}
}这个类是不完整的,所以不要纠缠于它缺少serialVersionUID和其他标准的东西,我只是关心birthDate的安全漏洞。
现在,根据findbugs报告,由于我返回一个对可变对象的引用,这是一个潜在的安全风险。但在实践中,这到底有多重要呢?
http://findbugs.sourceforge.net/bugDescriptions.html#EI_EXPOSE_REP
我想我仍然看不出这里的问题是什么。我是否应该传入一个long并从中设置日期?
沃尔特
发布于 2009-11-14 08:44:18
我认为这里的关键是if
如果实例被不受信任的代码访问,并且对可变对象的未经检查的更改会损害安全性或其他重要属性,则需要做一些不同的操作。
因此,换句话说,如果你想要一个不可变的对象(即你没有setBirthdate()方法),你的代码就不正确,因为有人可能会写:
Date date = user.getBirthDate();
date.setMonth(1); // mutated!因此,您可能需要以下内容:
public Date getBirthDate()
{return new Date(birthDate.getTime());} // essentially a clone发布于 2009-11-14 09:12:44
是的,我不会把它叫做“安全”问题……我的意思是,到底哪个攻击者会针对你的对象编写恶意代码呢?真正的问题是,您很可能会因为意外调用getBirthDate然后修改结果而出错。
由于这个原因,当您将可变对象(如Date )用作值类型时,让getter克隆这些可变对象以供返回是很常见的。
(您也可以争辩说,Java的Date不应该是可变的,但现在对此无能为力。)
发布于 2015-08-07 04:13:56
除了Matt Solnit的好答案之外,我在设置属性时也遇到了同样的问题,所以我也这么做了:
public void setDataEmissaoNota (Date dataEmissaoNota)
{
this.dataEmissaoNota = new Date(dataEmissaoNota.getTime());
}工作很好!
https://stackoverflow.com/questions/1732789
复制相似问题