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 中的主要内容,如果未能解决你的问题,请参考以下文章