Java 恶意代码漏洞-可能通过返回对可变对象的引用来暴露内部表示-使用什么对象?
Sonar报告了以下违规行为:可能通过返回对可变对象的引用来暴露内部表示 这是因为我正在从getter返回字符串[] 我知道问题是什么以及如何解决它,但通过stackoverflow上的几个线程,我注意到字符串[]和日期似乎发生了这种情况,例如: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
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中允许获取/设置日期的公共方法。。。那么每一个公共变异子都是一个漏洞。。。