JAVA (aplicación web) Datos públicos asignados a un campo de tipo de matriz privado

6

Refiriéndose a este CWE-496 , menciona que debido a que la aplicación asigna datos públicos a un matriz privada es equivalente a dar acceso público a la matriz.

Esto no está claro para mí porque, normalmente, antes de que pueda usar el objeto, debemos declararlo. Por ejemplo:

User user = new User();

Voy a hacer dos suposiciones y me corregirá si me equivoco.

  1. Cada new Object() creará una instancia diferente
  2. Dentro del objeto Usuario, hay una matriz privada userRoles y una pública definidor llamado setUserRoles(String[] userRoles)

Mi pregunta es, ya que el objeto declarará nuevas instancias cada vez, ¿cómo ocurre la situación definida en CWE?

Por ejemplo:

¿Por qué el user.setUserRoles() en una segunda solicitud sobrescribirá los valores de la variable userRoles en la primera solicitud o los valores de la variable userRoles en otras páginas?

    
pregunta overshadow 17.09.2015 - 13:54
fuente

2 respuestas

2

El problema es que los datos privados del objeto se convierten en una referencia a los datos que se pasan como parámetro en el configurador (que es público).

Las matrices en Java se pasan por referencia (consulte esta pregunta ), por lo que significa que:

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

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

En realidad, coloca la referencia de la variable param en el miembro privado. Si alguien modificara esta variable param después, también modificaría el miembro privado. El problema en este caso es que la matriz es mutable, como puede ver en esta pregunta SO.

Este comportamiento desafía el principio de encapsulación y, por lo tanto, es incorrecto.

Finalmente, esto no tiene nada que ver con la cantidad de instancias del objeto que puede crear. Es un problema que está relacionado con el objeto en sí (por lo que todos los objetos que crearías tendrían el mismo problema).

Una solución al problema sería hacer una copia completa de la matriz de parámetros en la matriz miembro privada (por ejemplo, usando clone() ).

    
respondido por el M'vy 17.09.2015 - 14:55
fuente
0

Siento que el CWE es bastante claro en el tema. Un desarrollador presumiblemente marca una variable como privada porque quiere que esa variable sea privada . Tener un método de acceso público que modifique la variable privada hace que la variable sea pública.

Pregunta sobre una situación específica en la que una clase contiene una matriz privada modificada por un definidor público. Es cierto que este probablemente no es un problema. Sin embargo, recuerde que las clases pueden, de hecho, hacer referencia a otros objetos que no están dentro del alcance de la clase.

Tenga en cuenta que esto no es automáticamente una vulnerabilidad. puede (o no) puede dar lugar a errores lógicos debido a modificaciones no intencionadas del alcance variable que puede (o no) dar como resultado una vulnerabilidad de seguridad.

    
respondido por el Ayrx 17.09.2015 - 14:46
fuente

Lea otras preguntas en las etiquetas