当前位置: 首页 > 知识库问答 >
问题:

(日期)可以通过将外部可变对象存储到CategoryModel中来公开内部表示。创建日期

邵弘伟
2023-03-14

在使用model class i时,会面临以下警告:--

com.model.products.CategoryModel.setCreatedDate(Date) may expose internal representation by storing an externally mutable object into CategoryModel.createdDate

我的模特班

@JsonInclude(Include.NON_NULL)
public class CategoryModel {

     private Date createdDate;

     public Date getCreatedDate() {

        return createdDate;

//Warning Message:--com.model.products.CategoryModel.getCreatedDate(Date) may expose internal representation by storing an externally mutable object into CategoryModel.createdDate

    public void setCreatedDate(Date createdDate) {

        this.createdDate = createdDate;

//Warning Message:--com.model.products.CategoryModel.setCreatedDate(Date) may expose internal representation by storing an externally mutable object into CategoryModel.createdDate

}

警告的描述:-

返回对存储在对象某个字段中的可变对象值的引用会暴露对象的内部表示。如果实例被不受信任的代码访问,并且对可变对象未经检查的更改会损害安全性或其他重要属性,那么您需要做一些不同的事情。在许多情况下,返回对象的新副本是更好的方法。

在上面的模型课中,我得到一个警告:处理这个问题的更好方法是什么??提前谢谢。。。

共有1个答案

须旭
2023-03-14

您正在接受类外部对可变对象的引用,以便在类内部使用。这意味着可变对象的来源可以在你背后改变它的值。一会儿你自己的物体包含今年的6月3日,一会儿又包含去年的11月27日。而任何其他引用该可变对象的对象都可以在你背后以同样悲惨的方式改变其值。

最佳实践是在收到可变对象后制作一个防御性副本。将其内部值复制到另一个新对象中。你知道这个新对象是安全的,因为没有其他对象引用它。

如果您不了解Java中对象引用的这种行为,请学习Java编程的一些基础知识。也许是神谕。com教程,或O'Reilly出版社的第一本关于Java的书。

防御性复制的另一种选择是首先使用不可变对象。如果不可变,则整个问题将被消除。

您正在使用麻烦的旧日期时间类,现在被现代java.time类所取代。

爪哇。时间类是不可变的,因此如果您每次使用Date

 类似资料:
  • 问题内容: 嗨,我收到了以下违规信息: 恶意代码漏洞-可能通过返回对可变对象的引用来公开内部表示 在我的代码中,我这样写 我们如何解决它。 问题答案: 当错误消息指出时,您正在返回内部状态(chkBox-很可能是对象内部状态的一部分,即使您没有显示其定义) 如果您-例如- 由于数组对象和所有Java对象一样都是通过引用传递的,因此这也将更改存储在对象内部的原始数组。 您最可能想解决的问题很简单 它

  • 问题内容: 我的dto类中有以下代码。 我在这样的声纳中得到一个错误,我不确定在这里做错了什么。 该类是dto,该方法是自动创建的setter方法。我在这里做错了。如果有人可以解释。这将是一个很大的帮助。 问题答案: 易变 使用该setter,某人可以 无意中* 从外部修改日期实例 * 考虑一下 现在有人可以设置它 为避免这种情况,您可能需要在设置之前进行 深度复制

  • 有没有办法找到赛贝斯ASE 15中存储过程的创建日期?实际版本为15.0.3。 我知道我可以在表中找到这方面的信息,但由于存储过程在任何时候被修改时都会被删除和重新创建,这显示了上次有人修改存储过程的时间。 有没有办法找到存储过程是何时首次创建的?

  • 我试图使用Adobe reader读取从服务器下载的pdf文件,但问题是当我将其存储在内部存储时,其他应用程序无法读取该文件。现在我想知道如何将此文件复制到外部存储(/sdcard/)中,以便pdf查看器可以查看。 由于安全原因,我将文件存储在内部存储,然后删除外部存储的文件。 我的问题是如何复制保存在内部存储中的文件,而不使用raw或将其放入InputStream中的资产。

  • 问题内容: 我想了解ES如何在其索引内部存储日期值。可以转换为UTC吗? 我有一个日期类型的字段“ t”。这是映射: 现在,当我向ES插入/添加文档时,它如何存储在索引中。 “ t”:“ 1427700477165”(从Date.now()函数生成的毫秒数)。ES是否在UTC中识别其时代时间并按原样存储? “ t”:“ 2015-03-29T23:59:59”(我会相应地调整映射日期格式)-ES如

  • 我得到声纳报告的以下违规行为:可能通过返回对可变对象的引用来暴露内部表示。 这是因为我从getter返回字符串[]。 我知道问题是什么,以及如何解决它,但通过stackoverflow上的几个线程,我注意到字符串[]和日期似乎发生了这种情况,例如: 恶意代码漏洞-通过返回对可变对象的引用可能暴露内部表示 恶意代码漏洞-通过合并对可变对象的引用,可能会暴露内部表示 但考虑到发生这种情况的原因,即返回