JAVA (Applicazione Web) Dati pubblici assegnati a campo di tipo array privato

6

Riferendosi a questo CWE-496 , si accenna che a causa dell'applicazione che assegna dati pubblici a un array privato equivale a fornire l'accesso pubblico alla matrice.

Questo non mi è chiaro perché di solito prima di poter usare l'oggetto, dobbiamo dichiarare l'oggetto. Ad esempio:

User user = new User();

Ho intenzione di fare due ipotesi e correggermi se sbaglio.

  1. Ogni new Object() creerà un'istanza diversa
  2. Oggetto Utente interno, c'è un array privato userRoles e un pubblico setter chiamato setUserRoles(String[] userRoles)

La mia domanda è, dato che l'oggetto dichiarerà ogni volta nuove istanze, come si verifica la situazione definita in CWE?

Ad esempio:

Come mai user.setUserRoles() in una seconda richiesta sovrascriverà i valori della variabile userRoles nella prima richiesta o i valori della variabile userRoles nelle altre pagine?

    
posta overshadow 17.09.2015 - 13:54
fonte

2 risposte

2

Il problema è che i dati privati dell'oggetto diventano un riferimento ai dati che vengono passati come parametro nel setter (che è pubblico).

Gli array in Java sono passati per riferimento (Vedere questa domanda ), questo significa che:

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

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

Inserisce effettivamente il riferimento della variabile param nel membro privato. Se qualcuno dovesse modificare questa variabile param in seguito, modificerebbe anche il membro privato. Il problema in questo caso è che l'array è mutabile come puoi vedere in questa domanda SO.

Questo comportamento sfugge al principio di incapsulamento e quindi è sbagliato.

Infine, questo non ha nulla a che fare con quante istanze dell'oggetto è possibile creare. È un problema correlato all'oggetto stesso (quindi tutto l'oggetto che avresti creato avrebbe lo stesso problema).

Una soluzione al problema sarebbe quella di creare una copia completa dell'array dei parametri nell'array dei membri privati (usando clone() per esempio).

    
risposta data 17.09.2015 - 14:55
fonte
0

Mi sento come se la CWE fosse abbastanza chiara sulla questione. Uno sviluppatore indica presumibilmente una variabile come privata perché desidera che la variabile sia privata . Avere un metodo pubblicamente accessibile che modifica la variabile privata rende efficacemente la variabile pubblica.

Chiedete una situazione specifica in cui una classe contiene un array privato modificato da un setter pubblico. È vero che questo probabilmente non è un problema. Tuttavia, ricorda che le classi possono in realtà fare riferimento ad altri oggetti non compresi nell'ambito della classe.

Si noti che questa non è automaticamente una vulnerabilità. può (o non può) portare a errori logici a causa di modifiche involontarie della variabile scope che può (o potrebbe non) provocare una vulnerabilità di sicurezza.

    
risposta data 17.09.2015 - 14:46
fonte

Leggi altre domande sui tag