【问题标题】:Malicious code vulnerability - May expose internal representation by returning reference to mutable object - With what objects?恶意代码漏洞 - 可能通过返回对可变对象的引用来暴露内部表示 - 使用什么对象?
【发布时间】:2014-04-09 11:30:53
【问题描述】:

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

这是因为我从 getter 返回一个 String[]。

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

Malicious code vulnerability - May expose internal representation by returning reference to mutable object

Malicious code vulnerability - May expose internal representation by incorporating reference to mutable object

但是考虑到发生这种情况的原因,它返回了对一个对象的引用,该对象的内部状态可以被调用者更改。不应该为每个返回可变对象的 getter 引发这种违规行为吗?

例如:

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

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

调用者可以改变返回对象的状态。声纳不应该为那些报告同样的吗?

非常感谢, 弗朗西斯科。

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    Sonar 不够聪明,无法知道对象是否可变。尤其是如果您返回 List,它无法判断您实际返回的是 ArrayListImmutableList 还是不可修改的列表。因此,它不会发出任何警告,以避免误报淹没您。

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

    【讨论】:

    • 有道理。谢谢 JB Nizet。
    • 虽然,在多个项目中与这个问题进行了斗争 - 这是 BS。 Date 在 Java 7 及更早版本中确实是可变的,虽然有人可能认为不应该如此,但它与 Hibernate 和 JSF 等公认的框架保持一致,它们无论如何都会破坏信息隐藏。例如,大多数 Web 应用程序都有完全可变的 get/set Date 方法 - 那么有什么区别呢?除非该方法暴露给公共服务,否则它是无关紧要的。如果您不信任自己的 JVM 中允许 get/set Date 的公共方法......那么每个公共 mutator 都是一个漏洞......
    猜你喜欢
    • 2012-02-15
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 2018-03-16
    相关资源
    最近更新 更多