分配给私有数组类型字段的 JAVA(Web 应用程序)公共数据

信息安全 爪哇
2021-09-11 06:17:17

参考这个CWE-496,它提到由于应用程序将公共数据分配给私有数组,它等同于授予对数组的公共访问权限。

这对我来说不是很清楚,因为通常在你可以使用对象之前,我们必须声明对象。例如:

User user = new User();

我将做两个假设,如果我错了,请纠正我。

  1. 每个new Object()人都会创建不同的实例
  2. 在 User 对象内部,有一个私有数组userRoles和一个名为setUserRoles(String[] userRoles)

我的问题是,既然对象每次都会声明新的实例,那么 CWE 中定义的情况是如何发生的呢?

例如:

为什么user.setUserRoles()第二个请求会覆盖第userRoles一个请求中的变量值或userRoles其他页面中的变量值?

2个回答

问题是对象的私有数据成为对在设置器中作为参数传递的数据的引用(这是一个公共数据)。

Java 中的数组是通过引用传递的(参见这个问题),这意味着:

public void setUserRoles(String[] userRoles) {
    this.userRoles = userRoles;
}

String[] param = ...;
User.setUserRoles(param);

实际上是将param变量的引用放入私有成员中。如果有人param事后修改这个变量,它也会修改私有成员。这种情况下的问题是数组是可变的,正如您在这个SO question 中看到的那样。

这种行为违反了封装原则,因此是错误的。

最后,这与您可以创建多少个对象实例无关。这是一个与对象本身相关的问题(因此您创建的所有对象都会有同样的问题)。

该问题的解决方案是将参数数组的完整副本复制到私有成员数组中(clone()例如使用)。

我觉得 CWE 在这个问题上很清楚。开发人员可能将变量标记为私有,因为他希望该变量是私有的。拥有修改私有变量的可公开访问的方法有效地使变量公开。

您询问一个特定情况,其中一个类包含一个由公共设置器修改的私有数组。确实,这可能不是问题。但是,请记住,类实际上可以引用不在类范围内的其他对象。

请注意,这不会自动成为漏洞。由于变量范围的意外修改可能(或可能不会)导致安全漏洞,可能(或可能不会)导致逻辑错误。