Java 恶意代码漏洞-可能通过返回对可变对象的引用来暴露内部表示-使用什么对象?

Java 恶意代码漏洞-可能通过返回对可变对象的引用来暴露内部表示-使用什么对象?,java,sonarqube,Java,Sonarqube,Sonar报告了以下违规行为:可能通过返回对可变对象的引用来暴露内部表示 这是因为我正在从getter返回字符串[] 我知道问题是什么以及如何解决它,但通过stackoverflow上的几个线程,我注意到字符串[]和日期似乎发生了这种情况,例如: public List<String> getList() { return list; } public Foo getFoo() { return foo; } //where foo is just a random object

Sonar报告了以下违规行为:可能通过返回对可变对象的引用来暴露内部表示

这是因为我正在从getter返回字符串[]

我知道问题是什么以及如何解决它,但通过stackoverflow上的几个线程,我注意到字符串[]和日期似乎发生了这种情况,例如:

public List<String> getList() { return list; }

public Foo getFoo() { return foo; } //where foo is just a random object with getters and setters...

但是给出了发生这种情况的原因,即返回对其内部状态可能被调用方更改的对象的引用。对于每个返回可变对象的getter,不应该引发这种冲突吗

例如:

public List<String> getList() { return list; }

public Foo getFoo() { return foo; } //where foo is just a random object with getters and setters...
public List getList(){return List;}
public Foo getFoo(){return Foo;}//其中Foo只是一个带有getter和setter的随机对象。。。
调用方可以更改返回对象的状态。声纳不应该报告同样的情况吗

非常感谢,,
弗朗西斯科。

声纳不够聪明,无法知道物体是否可变。特别是如果您返回的是
列表
,它无法判断您实际返回的是
数组列表
不可变列表
还是不可修改列表。所以它不会发出任何警告来避免误报泛滥


另一方面,数组和日期是众所周知的可变标准类,它可以安全地发出此警告。

声纳不够聪明,无法知道对象是否可变。特别是如果您返回的是
列表
,它无法判断您实际返回的是
数组列表
不可变列表
还是不可修改列表。所以它不会发出任何警告来避免误报泛滥


另一方面,数组和日期是众所周知的可变标准类,它可以安全地发出此警告。

声纳不够聪明,无法知道对象是否可变。特别是如果您返回的是
列表
,它无法判断您实际返回的是
数组列表
不可变列表
还是不可修改列表。所以它不会发出任何警告来避免误报泛滥


另一方面,数组和日期是众所周知的可变标准类,它可以安全地发出此警告。

声纳不够聪明,无法知道对象是否可变。特别是如果您返回的是
列表
,它无法判断您实际返回的是
数组列表
不可变列表
还是不可修改列表。所以它不会发出任何警告来避免误报泛滥


另一方面,数组和日期是众所周知的标准类,它们是可变的,可以安全地发出此警告。

很有意义。感谢JB Nizet。不过,在多个项目中处理过这个问题,这是BS。在Java7和更早的版本中,Date确实是可变的,尽管有人可能认为不应该是可变的,但它与Hibernate和JSF等公认的框架保持一致,这些框架打破了信息隐藏。例如,大多数web应用程序都有完全可变的get/set Date方法——那么有什么区别呢?除非该方法向公共服务公开,否则它是不相关的。如果您不信任自己JVM中允许获取/设置日期的公共方法。。。那么每一个公共变异因子都是一个漏洞…是有道理的。感谢JB Nizet。不过,在多个项目中处理过这个问题,这是BS。在Java7和更早的版本中,Date确实是可变的,尽管有人可能认为不应该是可变的,但它与Hibernate和JSF等公认的框架保持一致,这些框架打破了信息隐藏。例如,大多数web应用程序都有完全可变的get/set Date方法——那么有什么区别呢?除非该方法向公共服务公开,否则它是不相关的。如果您不信任自己JVM中允许获取/设置日期的公共方法。。。那么每一个公共变异因子都是一个漏洞…是有道理的。感谢JB Nizet。不过,在多个项目中处理过这个问题,这是BS。在Java7和更早的版本中,Date确实是可变的,尽管有人可能认为不应该是可变的,但它与Hibernate和JSF等公认的框架保持一致,这些框架打破了信息隐藏。例如,大多数web应用程序都有完全可变的get/set Date方法——那么有什么区别呢?除非该方法向公共服务公开,否则它是不相关的。如果您不信任自己JVM中允许获取/设置日期的公共方法。。。那么每一个公共变异因子都是一个漏洞…是有道理的。感谢JB Nizet。不过,在多个项目中处理过这个问题,这是BS。在Java7和更早的版本中,Date确实是可变的,尽管有人可能认为不应该是可变的,但它与Hibernate和JSF等公认的框架保持一致,这些框架打破了信息隐藏。例如,大多数web应用程序都有完全可变的get/set Date方法——那么有什么区别呢?除非该方法向公共服务公开,否则它是不相关的。如果您不信任自己JVM中允许获取/设置日期的公共方法。。。那么每一个公共变异子都是一个漏洞。。。