MALICIOUS_CODE EI_EXPOSE_REP中等

17 java security findbugs

我针对我的所有代码运行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)


bob*_*nce 6

是的,我不会真的把它称为"安全"问题......我的意思是,攻击者到底会针对你的对象编写恶意代码?真正的问题是你很可能会因意外调用getBirthDate然后修改结果而绊倒.

出于这个原因,Date当你将它们用作值类型时,通常会让你的getter clone可变对象像返回一样.

(你也可以说Java Date不应该变得可变,但现在没有太多可以做的了.)

  • @bobince - "......我的意思是,攻击者到底会针对你的对象编写恶意代码?" Findbugs对执行代码的环境一无所知.你也不是!在某些情况下,这种特殊的"错误"可能会成为一个严重的安全问题. (2认同)
  • 当然,任何*任何*错误都可能成为安全问题。我觉得这有点奇怪,许多 Java 程序员如此偏执地认为代码库中的其他类能够做“他们不应该”的事情,因为 99% 的现实世界项目 *没有* 具有内部安全性实际上需要这种水密性的边界。 (2认同)