보안 누출에 대한 코드의 가정은 사용중인 언어에 따라 사실 일 수도 있고 그렇지 않을 수도 있습니다 . C 코드에서 문제가 될 수 있습니다 (특히 C에서 부울은 0이 아닌 0이 아닌 정수).하지만 passwordCheck
변수가 부울로 선언 된 경우 가장 강력하게 유형이 지정된 언어 (예 : 런타임 유형 검사) 에서 그것에 다른 것을 할당 할 방법이 없습니다. 실제로, if
부울 연산자를 사용하거나 단순히 값을 사용하는지 여부에 관계없이 술어의 모든 것이 부울로 해석되어야합니다. passwordCheck
런타임에 다른 유형의 객체가 바인딩되어 있으면 일부 유형의 잘못된 캐스트 예외가 발생합니다.
간단한 if / else 구문은 if / if 구문보다 읽기가 훨씬 쉽고 누군가가 구문을 뒤집으려고 할 때 부주의 한 문제가 덜 발생합니다. 잠시 동안 동일한 예를 보자.
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
위에서 실행하려는 상호 배타적 인 절의 의미가 손실됩니다. 이것이 if / else 구문이 전달하는 것입니다. 상호 배타적 인 두 가지 실행 분기 중 하나가 항상 실행됩니다. 이것은 보안의 중요한 부분입니다 . letThemIn
전화 를 한 후에 는 갈 수있는 방법이 없습니다 denyAccess
.
코드의 명확성을 위해 그리고 중요한 섹션을 가장 안전하게 보호하기 위해 기본 절 ( if
부분) 안에 있어야합니다 . 기본 비준수 동작은 대체 절 ( else
부분)에 있어야합니다 . 예를 들면 다음과 같습니다.
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
참고 : 다른 언어로 작업 할 때 "문자열 인 경우 어떻게됩니까?"라는 질문을 피하는 데 도움이되는 코딩 habbit를 개발했습니다. 본질적으로, 부울 표현식에서 상수를 먼저 두는 것입니다. 예를 들어, 확인하는 대신 passwordCheck == false
확인하는 중 false == passwordCheck
입니다. 또한 C ++에서 우연히 할당 문제를 피할 수 있습니다. 이 방법을 사용하면 컴파일러 =
대신에 입력하면 불평합니다 ==
. Java 및 C #과 같은 언어에서 컴파일러는 if 절의 할당을 오류로 취급하지만 C ++은이를 행복하게 받아들입니다. 그래서 null
첫 번째로 null 검사를하는 경향이 있습니다.
상수를 먼저 배치하면 언어를 정기적으로 변경하면 매우 도움이됩니다. 그러나 우리 팀에서는 코딩 표준과 반대이며 컴파일러는 어쨌든 이러한 문제를 포착합니다. 깨는 것은 어려운 습관 일 수 있습니다.