首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MALICIOUS_CODE EI_EXPOSE_REP Medium

MALICIOUS_CODE EI_EXPOSE_REP Medium
EN

Stack Overflow用户
提问于 2009-11-14 08:40:10
回答 5查看 21.1K关注 0票数 18

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

代码语言:javascript
复制
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并从中设置日期?

沃尔特

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-14 08:44:18

我认为这里的关键是if

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

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

代码语言:javascript
复制
Date date = user.getBirthDate();
date.setMonth(1);  // mutated!

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

代码语言:javascript
复制
public Date getBirthDate()
{return new Date(birthDate.getTime());}  // essentially a clone
票数 43
EN

Stack Overflow用户

发布于 2009-11-14 09:12:44

是的,我不会把它叫做“安全”问题……我的意思是,到底哪个攻击者会针对你的对象编写恶意代码呢?真正的问题是,您很可能会因为意外调用getBirthDate然后修改结果而出错。

由于这个原因,当您将可变对象(如Date )用作值类型时,让getter克隆这些可变对象以供返回是很常见的。

(您也可以争辩说,Java的Date不应该是可变的,但现在对此无能为力。)

票数 6
EN

Stack Overflow用户

发布于 2015-08-07 04:13:56

除了Matt Solnit的好答案之外,我在设置属性时也遇到了同样的问题,所以我也这么做了:

代码语言:javascript
复制
public void setDataEmissaoNota (Date dataEmissaoNota)
{
    this.dataEmissaoNota = new Date(dataEmissaoNota.getTime());
}

工作很好!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1732789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档