In generale, è più facile scrivere e rivedere il codice sensibile quando i valori non cambiano , perché ci sono meno intrecci di operazioni che potrebbero influenzare il risultato.
Immaginate codice come
void doSomethingImportant(String name) {
if (!isAlphaNumeric(name)) { throw new IllegalArgumentException(); }
Object o = lookupThingy(name);
// No chance of SQL-Injection because name is alpha-numeric.
connection.executeStatement("INSERT INTO MyTable (column) VALUES ('" + name + "')");
}
Il codice fa alcuni controlli per evitare un'escalation di autorità, ma questo solo se il isAlphaNumeric(name)
è vero quando l'argomento di executeStatement
è chiamato.
Se le prime due dichiarazioni sono state riordinate, questo non sarebbe un problema, quindi l'insicurezza nasce, in parte, da un cattivo interleaving. Ma altri codici potrebbero chiamare questa funzione e assumere che name
non venga modificato da esso, quindi potrebbe dover eseguire e rieseguire i controlli di validità.
Se String
non è immutabile, potrebbe essere stato modificato da lookupThingy
. Per essere sicuri che il controllo di sicurezza funzioni, c'è una quantità molto maggiore di codice che deve essere eseguita correttamente affinché questo codice sia sicuro contro l'iniezione SQL.
Non solo la quantità di codice che deve essere eseguita correttamente è maggiore, ma un manutentore che apporta modifiche locali a una funzione potrebbe influire sulla sicurezza di altre funzioni molto lontano. Gli effetti non locali rendono difficile la manutenzione del codice. Mantenere le proprietà di sicurezza è sempre rischioso dal momento che le vulnerabilità della sicurezza sono raramente ovvie, quindi la mutabilità può portare al degrado della sicurezza nel tempo.
Perché è una ragione che corda è realizzata per essere immutabili?
Questo è separato dal motivo per cui è una cattiva sicurezza.
È opinione diffusa che programmi scritti in lingue con tipi di stringa immutabili prontamente disponibili eseguano meno copie di buffer non necessarie rispetto a quelle che non lo sono. Le copie di buffer non necessarie consumano memoria, causano un abbandono del GC e possono causare semplici operazioni su input di grandi dimensioni per prestazioni molto peggiori rispetto a quelle su input piccoli.
Si ritiene inoltre che sia più facile scrivere programmi corretti quando si usano stringhe immutabili, poiché è improbabile che non si riesca a copiare in modo difensivo un buffer.
"Penso che controllare la stringa prima di noi e risolverebbe il problema "A meno che tu non usi esplicitamente una sorta di serratura, no. –
Se implementato in modo improprio, cosa impedisce a un trasgressore di modificare il riferimento dell'assegno? – Gamb
Ci sono molte ragioni per cui la stringa è progettata per essere immutabile, capire l'immutabile in questo modo: * quando una classe è indipendente e completamente concreta nella natura. * – Azad