我针对我的所有代码运行findbugs,只解决了最重要的问题.我终于解决了最重要的问题,现在我正在查看细节.我有一个简单的实体,比如一个用户:
public class User implements Serializable
{
protected Date birthDate;
public Date getBirthDate()
{return(birthDate);}
public void setBirthDate(final Date birthDate)
{this.birthDate = birthDate;}
}
Run Code Online (Sandbox Code Playgroud)
这个课程是不完整的,所以不要因为它错过了它serialVersionUID和其他标准的东西,我只关心birthDate安全漏洞.
现在,根据findbugs报告,由于我返回对可变对象的引用,这是一个潜在的安全风险.但在实践中,这究竟有多重要?
http://findbugs.sourceforge.net/bugDescriptions.html#EI_EXPOSE_REP
我想在这种情况下我仍然没有真正看到问题所在.我应该通过long并设置日期吗?
沃尔特
Mat*_*nit 37
我认为这里的关键是if:
如果不受信任的代码访问实例,并且对可变对象的未经检查的更改会危及安全性或其他重要属性,则需要执行不同的操作.
换句话说,如果你想要一个不可变对象(即你没有setBirthdate()方法),你的代码是不正确的,因为有人可以写:
Date date = user.getBirthDate();
date.setMonth(1); // mutated!
Run Code Online (Sandbox Code Playgroud)
所以你可能会想要以下内容:
public Date getBirthDate()
{return new Date(birthDate.getTime());} // essentially a clone
Run Code Online (Sandbox Code Playgroud)
是的,我不会真的把它称为"安全"问题......我的意思是,攻击者到底会针对你的对象编写恶意代码?真正的问题是你很可能会因意外调用getBirthDate然后修改结果而绊倒.
出于这个原因,Date当你将它们用作值类型时,通常会让你的getter clone可变对象像返回一样.
(你也可以说Java Date不应该变得可变,但现在没有太多可以做的了.)