Su suposición acerca de que el código es una fuga de seguridad puede o no ser cierta dependiendo del idioma que esté utilizando. En el código C podría ser un problema (particularmente porque en C un booleano es solo un int que no es cero o cero), pero en la mayoría de los lenguajes fuertemente tipados (es decir, la verificación del tipo de tiempo de ejecución) si la passwordCheck
variable se declara como booleana, no hay forma de asignarle algo más. De hecho, todo en un if
predicado debe resolverse en un valor booleano, ya sea que use los operadores booleanos o simplemente use el valor. Si logras tener otro tipo de objeto vinculado al passwordCheck
tiempo de ejecución, arrojarás algún tipo de excepción de lanzamiento ilegal.
Las construcciones if / else simples son mucho más fáciles de leer que las construcciones if / if, y menos propensas a problemas inadvertidos si alguien intenta voltear la construcción. Tomemos el mismo ejemplo por un segundo:
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
Se pierde el significado de las cláusulas mutuamente excluyentes que desea ejecutar arriba. Eso es lo que transmite la construcción if / else. Dos ramas de ejecución mutuamente excluyentes, donde una de ellas siempre se ejecutará. Esta es una parte importante de la seguridad: garantizar que no haya forma de hacerlo letThemIn
después de haber llamado denyAccess
.
A los efectos de la claridad del código y para garantizar que las secciones críticas estén más protegidas, deben estar dentro de la cláusula primaria (la if
parte). El comportamiento no conforme predeterminado debe estar en la cláusula alternativa (la else
parte). Por ejemplo:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
NOTA: al trabajar con diferentes idiomas, he desarrollado un habbit de codificación que ayuda a evitar la pregunta "¿y si es una cadena?" Esencialmente, es poner la constante primero en la expresión booleana. Por ejemplo, en lugar de verificar passwordCheck == false
, estoy revisando false == passwordCheck
. Esto también evita el posible problema de asignación accidental en C ++. Usando este enfoque, el compilador se quejará si escribo en =
lugar de ==
. En lenguajes como Java y C #, el compilador trataría la asignación en la cláusula if como un error, pero C ++ lo aceptará con gusto. Es por eso que también tiendo a hacer una verificación nula con el null
primero.
Si cambia rutinariamente los idiomas, colocar la constante primero es muy útil. Sin embargo, en mi equipo es opuesto al estándar de codificación y el compilador detecta esos problemas de todos modos. Puede ser un hábitat difícil de romper.