MALICIOUS_CODE EI_EXPOSE_REP 中型

2022-09-02 19:17:24

我对我所有的代码运行findbugs,只处理最重要的东西。我终于解决了最重要的问题,现在正在查看细节。我有一个简单的实体,比如说一个用户:

public class User implements Serializable
{
    protected Date birthDate;

    public Date getBirthDate()
    {return(birthDate);}

    public void setBirthDate(final Date birthDate)
    {this.birthDate = birthDate;}
}

这门课是不完整的,所以不要唠叨我它缺少和其他标准的东西,我只是关心安全漏洞。serialVersionUIDbirthDate

现在,根据findbugs报告,由于我返回对可变对象的引用,因此存在潜在的安全风险。然而,在实践中,这到底有多重要呢?

http://findbugs.sourceforge.net/bugDescriptions.html#EI_EXPOSE_REP

我想我仍然没有看到在这种情况下有什么问题。我应该通过一个并设置日期吗?long

沃尔特


答案 1

我认为这里的关键是如果

如果实例由不受信任的代码访问,并且对可变对象的未经检查的更改会损害安全性或其他重要属性,则需要执行其他操作。

换句话说,如果你想要一个不可变的对象(即你没有方法),你的代码是不正确的,因为有人可以写:setBirthdate()

Date date = user.getBirthDate();
date.setMonth(1);  // mutated!

因此,您可能需要以下内容:

public Date getBirthDate()
{return new Date(birthDate.getTime());}  // essentially a clone

答案 2

是的,我不会真的称之为“安全”问题......我的意思是,究竟是什么攻击者将针对您的对象编写恶意代码?真正的问题是,你很可能会因为不小心打电话然后修改结果而绊倒。getBirthDate

因此,当您将 getter 克隆可变对象(如返回对象)用作值类型时,通常会让它们克隆。Date

(你也可以争辩说Java不应该被可变化,但现在对此无能为力。Date