MALICIOUS_CODE EI_EXPOSE_REP 中

Posted

技术标签:

【中文标题】MALICIOUS_CODE EI_EXPOSE_REP 中【英文标题】:MALICIOUS_CODE EI_EXPOSE_REP Medium 【发布时间】:2010-12-16 12:13:52 【问题描述】:

我对我的所有代码都运行 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 并从中设置日期吗?

沃尔特

【问题讨论】:

【参考方案1】:

我认为这里的关键是 if

如果实例由不受信任的代码访问,并且对可变对象的未经检查的更改会危及安全性或其他重要属性,则您需要做一些不同的事情。

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

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

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

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

【讨论】:

我同意两个cmets,对于我正在做的事情,我不需要担心这个。不过,这提出了一个很好的观点,吸气剂可能并不总是简单地返回(属性);我之前错过了安全方面。感谢您的 cmets Matt 和 Robert。【参考方案2】:

好吧,我想说这一切都取决于。返回不可变对象还有其他与安全无关的原因,因为如果对象被滥用,它还可能导致代码中出现一些难以发现的错误。

类会被不受信任的代码和/或数据访问吗?如果是这样,您需要清楚地了解您的应用程序在验证输入方面的责任。

另外,应用程序的性质是什么?如果是例如一个外部可访问的网络服务,那么输入几乎可以肯定被认为是潜在的恶意。但是,如果它是在本地运行的应用程序,没有从受信任的来源获取输入的权限,则可能无需担心。

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

@bobince - “...我的意思是,究竟是哪个攻击者会针对您的对象编写恶意代码?”。 Findbugs 对执行代码的环境一无所知。你也没有!在某些情况下,这个特定的“错误”可能是一个严重的安全问题。 当然,只要任何个错误都可能成为安全问题。我觉得这有点奇怪,因为 99% 的实际项目 有一个内部安全边界,实际上需要这种水密性。【参考方案4】:

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

public void setDataEmissaoNota (Date dataEmissaoNota)

    this.dataEmissaoNota = new Date(dataEmissaoNota.getTime());

工作很好!

【讨论】:

【参考方案5】:

我更喜欢以 EpochTime 格式将 Date 存储为 Long 并将其用于在我的应用程序层中持久保存。这不需要任何额外的 Lombok getter 覆盖。最后,在提供响应时,我可以有一个 util 函数,它将纪元时间戳转换为日期,然后将其作为字符串返回。可能会像下面这样::

private String Epoch_to_ISO8601(Long savedTimeStamp) 
Date passedDate = new Date(savedTimeStamp);
String ISO8601_date =
    DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX")
        .withZone(ZoneOffset.UTC)
        .format(passedDate.toInstant());
return ISO8601_date;

【讨论】:

以上是关于MALICIOUS_CODE EI_EXPOSE_REP 中的主要内容,如果未能解决你的问题,请参考以下文章

简易先进先出队列-自用

函数参数

多重背包

合租房合同模板

启动代码分析 02

ACM数论 求幂乘