Ihre Vermutung, dass der Code ein Sicherheitsleck ist, kann je nach verwendeter Sprache zutreffen oder auch nicht . In C-Code kann dies ein Problem sein (insbesondere, weil in C ein Boolescher Wert nur ein Int ist, der nicht Null oder Null ist). In den am häufigsten typisierten Sprachen (dh Laufzeit-Typprüfung) kann die passwordCheck
Variable jedoch als Boolescher Wert deklariert werden. Es gibt keine Möglichkeit, etwas anderes zuzuweisen. Tatsächlich muss alles in einem if
Prädikat in einen Booleschen Wert aufgelöst werden, unabhängig davon, ob Sie die Booleschen Operatoren oder einfach den Wert verwenden. Wenn es Ihnen gelingt, einen anderen Objekttyp an passwordCheck
die Laufzeit zu binden, würde dies eine Art unzulässiger Ausnahmebedingung auslösen.
Einfache if / else-Konstrukte sind viel einfacher zu lesen als if / if-Konstrukte - und weniger anfällig für versehentliche Probleme, wenn jemand versucht, das Konstrukt umzudrehen. Nehmen wir das gleiche Beispiel für eine Sekunde:
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
Die Bedeutung der sich gegenseitig ausschließenden Klauseln, die Sie oben ausführen möchten, geht verloren. Das vermittelt das if / else-Konstrukt. Zwei sich gegenseitig ausschließende Ausführungszweige, von denen immer einer ausgeführt wird. Dies ist ein wichtiger Teil der Sicherheit - um sicherzustellen, dass letThemIn
nach Ihrem Anruf keine Möglichkeit mehr besteht denyAccess
.
Aus Gründen der Klarheit des Codes und um sicherzustellen, dass kritische Abschnitte am besten geschützt sind, sollten sie in der Primärklausel (dem if
Teil) enthalten sein. Das standardmäßige nicht konforme Verhalten sollte in der alternativen Klausel (dem else
Teil) enthalten sein. Beispielsweise:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
HINWEIS: In der Arbeit mit verschiedenen Sprachen habe ich ein Codierungs-Habbit entwickelt, mit dem die Frage "Was ist, wenn es sich um eine Zeichenfolge handelt?" Im Wesentlichen muss die Konstante im booleschen Ausdruck an erster Stelle stehen. Zum Beispiel, anstatt zu überprüfen, überprüfe passwordCheck == false
ich false == passwordCheck
. Dies vermeidet auch das in C ++ mögliche versehentliche Zuweisungsproblem. Bei dieser Vorgehensweise beschwert sich der Compiler, wenn ich =
statt tippe ==
. In Sprachen wie Java und C # würde der Compiler die Zuweisung in der if-Klausel als Fehler behandeln, aber C ++ wird dies gerne akzeptieren. Aus diesem Grund neige ich auch dazu, Nullprüfungen beim null
Ersten durchzuführen .
Wenn Sie routinemäßig die Sprache wechseln, ist es sehr hilfreich, die Konstante an die erste Stelle zu setzen. In meinem Team widerspricht dies jedoch dem Kodierungsstandard, und der Compiler erkennt diese Probleme trotzdem. Es kann schwierig sein, sich davon zu lösen.