La tua ipotesi sul fatto che il codice sia una perdita di sicurezza potrebbe essere o meno a seconda della lingua che stai utilizzando. Nel codice C potrebbe essere un problema (in particolare perché in C un booleano è solo un int che è diverso da zero o zero) - ma nella maggior parte dei linguaggi strongmente tipizzati (ad esempio il controllo del tipo di runtime) se la variabile passwordCheck
è stata dichiarata come un booleano, non c'è modo di assegnargli qualcos'altro. In realtà, tutto in un predicato if
deve essere risolto in un valore booleano, indipendentemente dal fatto che si utilizzino gli operatori booleani o semplicemente si utilizzi il valore. Se sei riuscito ad avere un altro tipo di oggetto associato a passwordCheck
, il runtime genererebbe qualche tipo di eccezione cast illegale.
Semplici costrutti / else sono più facili da leggere rispetto ai costrutti / if - e meno inclini a problemi involontari se qualcuno tenta di capovolgere il costrutto. Prendiamo lo stesso esempio per un secondo:
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
Il significato delle clausole mutuamente esclusive che si desidera eseguire sopra è perso. Questo è ciò che il costrutto if / else trasmette. Due rami di esecuzione che si escludono a vicenda, dove uno di loro sarà sempre attivo. Questa è una parte importante della sicurezza: assicurati che non ci sia modo di letThemIn
dopo aver chiamato denyAccess
.
Ai fini della chiarezza del codice, e allo scopo di garantire che le sezioni critiche siano più protette, dovrebbero essere all'interno della clausola primaria (la parte if
). Il comportamento predefinito non conforme dovrebbe essere nella clausola alternativa (la parte else
). Ad esempio:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
NOTA: lavorando con lingue diverse, ho sviluppato un habbit di codifica che aiuta a evitare la domanda "cosa succede se è una stringa?" Essenzialmente, è mettere la costante prima nell'espressione booleana. Ad esempio, invece di controllare passwordCheck == false
sto verificando false == passwordCheck
. Questo evita anche il problema di assegnazione accidentale possibile in C ++. Utilizzando questo approccio, il compilatore si lamenterà se digito =
anziché ==
. In linguaggi come Java e C #, il compilatore considererebbe l'assegnazione nella clausola if come un errore, ma C ++ lo accetterà volentieri. Ecco perché tendo anche a fare il controllo nullo con null
prima.
Se cambi di routine le lingue ponendo la costante per prima è molto utile. Tuttavia, nel mio team è opposto allo standard di codifica e il compilatore riesce comunque a cogliere questi problemi. Può essere difficile da interrompere.