SCW 아이콘
영웅 배경, 구분선 없음
블로그

자바 오류: 비트 연산자와 부울 연산자의 차이

앨런 리처드슨
게시됨 Feb 07, 2021
마지막 업데이트: 2026년 3월 6일

자바 오류: 비트 연산자와 부울 연산자의 차이

«Java Gotcha»: 실수로 쉽게 구현할 수 있는 흔한 오류 패턴.

자바에서 실수로 빠지기 쉬운 꽤 간단한 함정은: 부울 비교 연산자 대신 비트 연산자를 사용하는 것입니다.

예를 들어, 단순한 오타로 인해 실제로 "&&"를 입력하려던 것이 "&"로 입력될 수 있습니다.

코드를 검토할 때 배우는 일반적인 경험적 규칙은 다음과 같습니다:

조건문에서 «&» 또는 «|»가 사용된 경우 의도된 것이 아닐 가능성이 높습니다.

이 블로그 글에서는 휴리스틱을 탐구하고, 이러한 코딩 문제를 식별하고 해결할 수 있는 방법을 알아보겠습니다.


문제가 무엇인가요? 비트 단위 연산은 부울 값과 함께 잘 작동합니다.


부울 값에 비트 연산자를 사용하는 것은 완벽히 유효하므로, Java는 어떤 구문 오류도 발생시키지 않습니다.

비트 연산자(Bitwise OR(|) 및 비트 연산자(Bitwise AND(&))에 대한 진리값 표를 탐색하기 위해 JUnit 테스트를 작성하면, 비트 연산자의 출력이 진리값 표와 일치함을 확인할 수 있습니다. 이를 고려할 때, 비트 연산자 사용이 문제가 되지 않는다고 생각할 수 있습니다.

진실의 표

a가 있는 세 개의 열, b가 있는 열, 마지막 열(a^b)이 있는 열


@Test
void BitwiseOperatorsAndTruthTable () {
Assertions.assertEquals (verdadero, verdadero y verdadero);
Assertions.assertEquals (falso, verdadero y falso);
Assertions.assertEquals (falso, falso y verdadero);
Assertions.assertEquals (falso, falso y falso);
}


테스트가 통과합니다. 이것은 완벽하게 유효한 자바입니다.


진리의 표


a가 있는 세 개의 열, b가 있는 열, 마지막 열(a v b)이 있는 열


@Test
anular BitwiseOperatorSorTruthTable () {
Assertions.assertEquals (verdadero, verdadero | verdadero);
Assertions.assertEquals (verdadero, verdadero | falso);
Assertions.assertEquals (verdadero, falso | verdadero);
Assertions.assertEquals (falso, falso | falso);
}


이 테스트도 통과하는데, 왜 우리는 '&&'와 '||'를 선호할까?


진리표 도구는 진리표 도구 를 사용하여 생성되었습니다. 웹사이트(web.standfor.edu)의를 사용하여 생성되었습니다.


문제: 단락 작동


진정한 문제는 비트 연산자(&, |)와 부울 연산자(&&, ||) 간의 동작 차이입니다.

부울 연산자는 단락 연산자이며 필요한 만큼만 평가합니다.

예를 들어

si (args! = nulo & args.length () > 23) {
System.out.println (argumentos);
}


위의 코드에서는 비트 연산자를 사용했기 때문에 두 부울 조건이 모두 평가됩니다:

  • argumentos! = nulo
  • args.length() > 23

이 코드는 args가 null일 경우 NullPointerException에 취약합니다. args가 null인 경우에도 args.length 검사를 항상 수행하기 때문입니다. 두 부울 조건을 모두 평가해야 하기 때문입니다.


부울 연산자 단락 평가


&&를 사용할 때, 예를 들어

si (args! = nulo && args.length () > 23) {
System.out.println (argumentos);
}


¡En cuanto sepamos que es un argumento! = null은 false로 평가되며, 조건식의 평가가 중단됩니다.

우측을 평가할 필요가 없습니다.

오른쪽 조건의 결과가 무엇이든, 부울 표현식의 최종 값은 거짓이 될 것이다.


그러나 이는 프로덕션 코드에서는 절대 발생하지 않을 것입니다.


이것은 매우 쉽게 저지를 수 있는 오류이며 정적 분석 도구가 항상 이를 탐지하지는 않습니다.

다음 Google Dork를 사용하여 이 패턴의 공개된 예시를 찾을 수 있는지 확인했습니다:

파일 유형: java인 경우 «! = null &»
이 검색은 RootWindowContainer에서 Android 코드를 반환했습니다
isDocument = intent! = null & intent.isDocument()


이 코드는 코드 검토를 통과할 수 있는 유형입니다. 값을 가리기 위해 할당문에서 비트 연산자를 자주 사용하기 때문입니다. 하지만 이 경우 결과는 이전 if 문 예제와 동일합니다. 의도가 null인 경우 NullPointerException이 발생합니다.

우리는 종종 이 구문으로 원하는 대로 해치우곤 합니다. 왜냐하면 우리는 방어적으로 코딩하고 중복 코드를 작성하는 경우가 많기 때문입니다. `!= null` 검사는 대부분의 사용 사례에서 중복일 수 있습니다.

이는 프로그래머들이 생산 코드에서 저지른 오류입니다.

검색 결과가 얼마나 최신인지는 모르겠지만, 실행했을 때 Google, Amazon, Apache... 그리고 저의 코드가 포함된 결과가 나타났습니다.

최근 제 오픈소스 프로젝트 중 하나에서 발생한 추출 요청은 정확히 이 오류를 해결하기 위한 것이었습니다.

si (escriba! =nulo y escribe.trim () .length () >0) {
Aceptar MediaTypeDefinitionsList.add (type.trim ());
}


이것을 찾는 방법


일부 정적 분석기에서 내 샘플 코드를 확인했을 때, 그 어떤 것도 이 숨겨진 자동 파괴 코드를 탐지하지 못했습니다.

Secure Code Warrior 팀으로서, 우리는 이 질문에 답할 수 있는 Sensei 간단한 Sensei 레시피를 만들고 검토했습니다.

비트 연산자는 완벽히 유효하며 할당문에서 자주 사용되므로, 우리는 if 문 사용 사례와 문제 코드를 찾기 위한 비트wise & 연산자 사용에 집중합니다.

buscar:
expresión:
Cualquiera de:
- en:
condición: {}
valor:
Sensible a mayúsculas y minúsculas: falso
coincidencias: «.* & . *»


이것은 정규 표현식을 사용하여 조건 표현식(예: if 문)에서 "&»"와 일치하도록 합니다.

이를 해결하기 위해 정규 표현식에 다시 의존했습니다. 이번에는 QuickFix의 sed 기능을 사용하여 표현식 내의 &를 &&로 전역적으로 교체했습니다.

Correcciones disponibles:
- nombre: «Reemplazar el operador AND bit a bit por el operador AND lógico»
acciones:
- reescribir:
a: «{{#sed}} s/&/&&/g, {{{.}}} {{/sed}}»


마지막 메모

이것은 비트 연산자를 부적절하게 사용하는 가장 흔한 경우를 다룹니다. 즉, 실제로는 부울 연산자를 사용하려 했던 경우를 말합니다.

다른 상황에서도 이 문제가 발생할 수 있습니다. 예를 들어 작업 예시에서 그렇습니다. 그러나 레시피를 작성할 때는 오탐지 식별을 피해야 합니다. 그렇지 않으면 레시피가 무시되거나 비활성화될 수 있습니다. 우리는 가장 흔한 발생 사례에 부합하도록 레시피를 만듭니다. Sensei 따라 더 많은 일치 조건을 커버하기 위해 검색 기능에 추가적인 특이성을 부여할 가능성이 매우 높습니다.

현재 형태로 이 레시피는 현재의 많은 사용 사례를 식별할 수 있으며, 무엇보다도 제 프로젝트에서 보고된 사례를 포함합니다.

참고: 이 예시와 레시피 검토에는 소수의 코드 전사들이 기여했습니다: Charlie Eriksen, Matthieu Calie, Robin Claerhaut, Brysen Ackx, Nathan Desmet, Downey Robersscheuten. 도움에 감사드립니다.


---


Sensei 설치하려면 Mac의 경우 「Preferencias\ Plugins」, Windows의 경우 「Configuración\ Plugins」로 이동한 후 「código seguro de sensei를 검색하세요.

Secure Code Warrior GitHub 계정의 `sensei` 저장소에는 이 블로그 게시물을 포함한 다양한 예제 코드와 레시피가 있습니다.

https://github.com/securecodewarrior/sensei-blog-examples

Sensei에 대한 자세한 정보


리소스 보기
리소스 보기

이 블로그 글에서는 자바에서 흔히 발생하는 코딩 오류(조건 연산자 대신 비트 연산자를 사용하는 경우)를 분석하고, 이 오류가 코드를 취약하게 만드는 이유, 그리고 Sensei 문제를 수정하고 탐지하는 Sensei 살펴봅니다.

더 알고 싶으신가요?

Alan Richardson은 20년 이상의 전문 IT 경험을 보유하고 있으며, 개발자로 일하며 테스터부터 테스트 책임자까지 모든 수준의 테스트 계층 구조에서 일하고 있습니다. 개발자 관계 책임자 Secure Code Warrior 그는 팀과 직접 협력하여 품질 보안 코드 의 개발을 개선합니다. 앨런은 "친애하는 악테터", "테스터를위한 자바"를 포함하여 네 권의 책의 저자입니다. 앨런은 또한 온라인 교육을 만들었습니다 courses 사람들이 자바와 기술 웹 테스트 및 셀레늄 웹 드라이버를 배울 수 있도록. 앨런은 SeleniumSimplified.com, EvilTester.com, JavaForTesters.com, CompendiumDev.co.uk 자신의 글과 트레이닝 비디오를 게시합니다.

더 알아보세요

Secure Code Warrior 귀사의 조직이 소프트웨어 개발 라이프사이클 전반에 걸쳐 코드를 보호하고 사이버보안을 최우선으로 하는 문화를 조성하도록 Secure Code Warrior . AppSec 관리자, 개발자, CISO 또는 보안 관련 담당자라면 누구든, 저희는 귀사의 조직이 안전하지 않은 코드와 관련된 위험을 줄일 수 있도록 돕습니다.

데모 예약하기
공유하기:
링크드인 브랜드사회적x 로고
저자
앨런 리처드슨
게시일: Feb 07, 2021

Alan Richardson은 20년 이상의 전문 IT 경험을 보유하고 있으며, 개발자로 일하며 테스터부터 테스트 책임자까지 모든 수준의 테스트 계층 구조에서 일하고 있습니다. 개발자 관계 책임자 Secure Code Warrior 그는 팀과 직접 협력하여 품질 보안 코드 의 개발을 개선합니다. 앨런은 "친애하는 악테터", "테스터를위한 자바"를 포함하여 네 권의 책의 저자입니다. 앨런은 또한 온라인 교육을 만들었습니다 courses 사람들이 자바와 기술 웹 테스트 및 셀레늄 웹 드라이버를 배울 수 있도록. 앨런은 SeleniumSimplified.com, EvilTester.com, JavaForTesters.com, CompendiumDev.co.uk 자신의 글과 트레이닝 비디오를 게시합니다.

공유하기:
링크드인 브랜드사회적x 로고

자바 오류: 비트 연산자와 부울 연산자의 차이

«Java Gotcha»: 실수로 쉽게 구현할 수 있는 흔한 오류 패턴.

자바에서 실수로 빠지기 쉬운 꽤 간단한 함정은: 부울 비교 연산자 대신 비트 연산자를 사용하는 것입니다.

예를 들어, 단순한 오타로 인해 실제로 "&&"를 입력하려던 것이 "&"로 입력될 수 있습니다.

코드를 검토할 때 배우는 일반적인 경험적 규칙은 다음과 같습니다:

조건문에서 «&» 또는 «|»가 사용된 경우 의도된 것이 아닐 가능성이 높습니다.

이 블로그 글에서는 휴리스틱을 탐구하고, 이러한 코딩 문제를 식별하고 해결할 수 있는 방법을 알아보겠습니다.


문제가 무엇인가요? 비트 단위 연산은 부울 값과 함께 잘 작동합니다.


부울 값에 비트 연산자를 사용하는 것은 완벽히 유효하므로, Java는 어떤 구문 오류도 발생시키지 않습니다.

비트 연산자(Bitwise OR(|) 및 비트 연산자(Bitwise AND(&))에 대한 진리값 표를 탐색하기 위해 JUnit 테스트를 작성하면, 비트 연산자의 출력이 진리값 표와 일치함을 확인할 수 있습니다. 이를 고려할 때, 비트 연산자 사용이 문제가 되지 않는다고 생각할 수 있습니다.

진실의 표

a가 있는 세 개의 열, b가 있는 열, 마지막 열(a^b)이 있는 열


@Test
void BitwiseOperatorsAndTruthTable () {
Assertions.assertEquals (verdadero, verdadero y verdadero);
Assertions.assertEquals (falso, verdadero y falso);
Assertions.assertEquals (falso, falso y verdadero);
Assertions.assertEquals (falso, falso y falso);
}


테스트가 통과합니다. 이것은 완벽하게 유효한 자바입니다.


진리의 표


a가 있는 세 개의 열, b가 있는 열, 마지막 열(a v b)이 있는 열


@Test
anular BitwiseOperatorSorTruthTable () {
Assertions.assertEquals (verdadero, verdadero | verdadero);
Assertions.assertEquals (verdadero, verdadero | falso);
Assertions.assertEquals (verdadero, falso | verdadero);
Assertions.assertEquals (falso, falso | falso);
}


이 테스트도 통과하는데, 왜 우리는 '&&'와 '||'를 선호할까?


진리표 도구는 진리표 도구 를 사용하여 생성되었습니다. 웹사이트(web.standfor.edu)의를 사용하여 생성되었습니다.


문제: 단락 작동


진정한 문제는 비트 연산자(&, |)와 부울 연산자(&&, ||) 간의 동작 차이입니다.

부울 연산자는 단락 연산자이며 필요한 만큼만 평가합니다.

예를 들어

si (args! = nulo & args.length () > 23) {
System.out.println (argumentos);
}


위의 코드에서는 비트 연산자를 사용했기 때문에 두 부울 조건이 모두 평가됩니다:

  • argumentos! = nulo
  • args.length() > 23

이 코드는 args가 null일 경우 NullPointerException에 취약합니다. args가 null인 경우에도 args.length 검사를 항상 수행하기 때문입니다. 두 부울 조건을 모두 평가해야 하기 때문입니다.


부울 연산자 단락 평가


&&를 사용할 때, 예를 들어

si (args! = nulo && args.length () > 23) {
System.out.println (argumentos);
}


¡En cuanto sepamos que es un argumento! = null은 false로 평가되며, 조건식의 평가가 중단됩니다.

우측을 평가할 필요가 없습니다.

오른쪽 조건의 결과가 무엇이든, 부울 표현식의 최종 값은 거짓이 될 것이다.


그러나 이는 프로덕션 코드에서는 절대 발생하지 않을 것입니다.


이것은 매우 쉽게 저지를 수 있는 오류이며 정적 분석 도구가 항상 이를 탐지하지는 않습니다.

다음 Google Dork를 사용하여 이 패턴의 공개된 예시를 찾을 수 있는지 확인했습니다:

파일 유형: java인 경우 «! = null &»
이 검색은 RootWindowContainer에서 Android 코드를 반환했습니다
isDocument = intent! = null & intent.isDocument()


이 코드는 코드 검토를 통과할 수 있는 유형입니다. 값을 가리기 위해 할당문에서 비트 연산자를 자주 사용하기 때문입니다. 하지만 이 경우 결과는 이전 if 문 예제와 동일합니다. 의도가 null인 경우 NullPointerException이 발생합니다.

우리는 종종 이 구문으로 원하는 대로 해치우곤 합니다. 왜냐하면 우리는 방어적으로 코딩하고 중복 코드를 작성하는 경우가 많기 때문입니다. `!= null` 검사는 대부분의 사용 사례에서 중복일 수 있습니다.

이는 프로그래머들이 생산 코드에서 저지른 오류입니다.

검색 결과가 얼마나 최신인지는 모르겠지만, 실행했을 때 Google, Amazon, Apache... 그리고 저의 코드가 포함된 결과가 나타났습니다.

최근 제 오픈소스 프로젝트 중 하나에서 발생한 추출 요청은 정확히 이 오류를 해결하기 위한 것이었습니다.

si (escriba! =nulo y escribe.trim () .length () >0) {
Aceptar MediaTypeDefinitionsList.add (type.trim ());
}


이것을 찾는 방법


일부 정적 분석기에서 내 샘플 코드를 확인했을 때, 그 어떤 것도 이 숨겨진 자동 파괴 코드를 탐지하지 못했습니다.

Secure Code Warrior 팀으로서, 우리는 이 질문에 답할 수 있는 Sensei 간단한 Sensei 레시피를 만들고 검토했습니다.

비트 연산자는 완벽히 유효하며 할당문에서 자주 사용되므로, 우리는 if 문 사용 사례와 문제 코드를 찾기 위한 비트wise & 연산자 사용에 집중합니다.

buscar:
expresión:
Cualquiera de:
- en:
condición: {}
valor:
Sensible a mayúsculas y minúsculas: falso
coincidencias: «.* & . *»


이것은 정규 표현식을 사용하여 조건 표현식(예: if 문)에서 "&»"와 일치하도록 합니다.

이를 해결하기 위해 정규 표현식에 다시 의존했습니다. 이번에는 QuickFix의 sed 기능을 사용하여 표현식 내의 &를 &&로 전역적으로 교체했습니다.

Correcciones disponibles:
- nombre: «Reemplazar el operador AND bit a bit por el operador AND lógico»
acciones:
- reescribir:
a: «{{#sed}} s/&/&&/g, {{{.}}} {{/sed}}»


마지막 메모

이것은 비트 연산자를 부적절하게 사용하는 가장 흔한 경우를 다룹니다. 즉, 실제로는 부울 연산자를 사용하려 했던 경우를 말합니다.

다른 상황에서도 이 문제가 발생할 수 있습니다. 예를 들어 작업 예시에서 그렇습니다. 그러나 레시피를 작성할 때는 오탐지 식별을 피해야 합니다. 그렇지 않으면 레시피가 무시되거나 비활성화될 수 있습니다. 우리는 가장 흔한 발생 사례에 부합하도록 레시피를 만듭니다. Sensei 따라 더 많은 일치 조건을 커버하기 위해 검색 기능에 추가적인 특이성을 부여할 가능성이 매우 높습니다.

현재 형태로 이 레시피는 현재의 많은 사용 사례를 식별할 수 있으며, 무엇보다도 제 프로젝트에서 보고된 사례를 포함합니다.

참고: 이 예시와 레시피 검토에는 소수의 코드 전사들이 기여했습니다: Charlie Eriksen, Matthieu Calie, Robin Claerhaut, Brysen Ackx, Nathan Desmet, Downey Robersscheuten. 도움에 감사드립니다.


---


Sensei 설치하려면 Mac의 경우 「Preferencias\ Plugins」, Windows의 경우 「Configuración\ Plugins」로 이동한 후 「código seguro de sensei를 검색하세요.

Secure Code Warrior GitHub 계정의 `sensei` 저장소에는 이 블로그 게시물을 포함한 다양한 예제 코드와 레시피가 있습니다.

https://github.com/securecodewarrior/sensei-blog-examples

Sensei에 대한 자세한 정보


리소스 보기
리소스 보기

다음 양식을 작성하여 보고서를 다운로드하십시오.

귀하의 허락을 받아 당사 제품 또는 안전한 암호화 관련 주제에 대한 정보를 보내드리고자 합니다. 귀하의 개인정보는 항상 최대한 신중하게 처리하며, 마케팅 목적으로 타사에 판매하지 않을 것을 약속드립니다.

보내기
scw 성공 아이콘
scw 오류 아이콘
양식을 보내려면 '분석' 쿠키를 활성화하세요. 완료 후에는 언제든지 다시 비활성화해도 됩니다.

자바 오류: 비트 연산자와 부울 연산자의 차이

«Java Gotcha»: 실수로 쉽게 구현할 수 있는 흔한 오류 패턴.

자바에서 실수로 빠지기 쉬운 꽤 간단한 함정은: 부울 비교 연산자 대신 비트 연산자를 사용하는 것입니다.

예를 들어, 단순한 오타로 인해 실제로 "&&"를 입력하려던 것이 "&"로 입력될 수 있습니다.

코드를 검토할 때 배우는 일반적인 경험적 규칙은 다음과 같습니다:

조건문에서 «&» 또는 «|»가 사용된 경우 의도된 것이 아닐 가능성이 높습니다.

이 블로그 글에서는 휴리스틱을 탐구하고, 이러한 코딩 문제를 식별하고 해결할 수 있는 방법을 알아보겠습니다.


문제가 무엇인가요? 비트 단위 연산은 부울 값과 함께 잘 작동합니다.


부울 값에 비트 연산자를 사용하는 것은 완벽히 유효하므로, Java는 어떤 구문 오류도 발생시키지 않습니다.

비트 연산자(Bitwise OR(|) 및 비트 연산자(Bitwise AND(&))에 대한 진리값 표를 탐색하기 위해 JUnit 테스트를 작성하면, 비트 연산자의 출력이 진리값 표와 일치함을 확인할 수 있습니다. 이를 고려할 때, 비트 연산자 사용이 문제가 되지 않는다고 생각할 수 있습니다.

진실의 표

a가 있는 세 개의 열, b가 있는 열, 마지막 열(a^b)이 있는 열


@Test
void BitwiseOperatorsAndTruthTable () {
Assertions.assertEquals (verdadero, verdadero y verdadero);
Assertions.assertEquals (falso, verdadero y falso);
Assertions.assertEquals (falso, falso y verdadero);
Assertions.assertEquals (falso, falso y falso);
}


테스트가 통과합니다. 이것은 완벽하게 유효한 자바입니다.


진리의 표


a가 있는 세 개의 열, b가 있는 열, 마지막 열(a v b)이 있는 열


@Test
anular BitwiseOperatorSorTruthTable () {
Assertions.assertEquals (verdadero, verdadero | verdadero);
Assertions.assertEquals (verdadero, verdadero | falso);
Assertions.assertEquals (verdadero, falso | verdadero);
Assertions.assertEquals (falso, falso | falso);
}


이 테스트도 통과하는데, 왜 우리는 '&&'와 '||'를 선호할까?


진리표 도구는 진리표 도구 를 사용하여 생성되었습니다. 웹사이트(web.standfor.edu)의를 사용하여 생성되었습니다.


문제: 단락 작동


진정한 문제는 비트 연산자(&, |)와 부울 연산자(&&, ||) 간의 동작 차이입니다.

부울 연산자는 단락 연산자이며 필요한 만큼만 평가합니다.

예를 들어

si (args! = nulo & args.length () > 23) {
System.out.println (argumentos);
}


위의 코드에서는 비트 연산자를 사용했기 때문에 두 부울 조건이 모두 평가됩니다:

  • argumentos! = nulo
  • args.length() > 23

이 코드는 args가 null일 경우 NullPointerException에 취약합니다. args가 null인 경우에도 args.length 검사를 항상 수행하기 때문입니다. 두 부울 조건을 모두 평가해야 하기 때문입니다.


부울 연산자 단락 평가


&&를 사용할 때, 예를 들어

si (args! = nulo && args.length () > 23) {
System.out.println (argumentos);
}


¡En cuanto sepamos que es un argumento! = null은 false로 평가되며, 조건식의 평가가 중단됩니다.

우측을 평가할 필요가 없습니다.

오른쪽 조건의 결과가 무엇이든, 부울 표현식의 최종 값은 거짓이 될 것이다.


그러나 이는 프로덕션 코드에서는 절대 발생하지 않을 것입니다.


이것은 매우 쉽게 저지를 수 있는 오류이며 정적 분석 도구가 항상 이를 탐지하지는 않습니다.

다음 Google Dork를 사용하여 이 패턴의 공개된 예시를 찾을 수 있는지 확인했습니다:

파일 유형: java인 경우 «! = null &»
이 검색은 RootWindowContainer에서 Android 코드를 반환했습니다
isDocument = intent! = null & intent.isDocument()


이 코드는 코드 검토를 통과할 수 있는 유형입니다. 값을 가리기 위해 할당문에서 비트 연산자를 자주 사용하기 때문입니다. 하지만 이 경우 결과는 이전 if 문 예제와 동일합니다. 의도가 null인 경우 NullPointerException이 발생합니다.

우리는 종종 이 구문으로 원하는 대로 해치우곤 합니다. 왜냐하면 우리는 방어적으로 코딩하고 중복 코드를 작성하는 경우가 많기 때문입니다. `!= null` 검사는 대부분의 사용 사례에서 중복일 수 있습니다.

이는 프로그래머들이 생산 코드에서 저지른 오류입니다.

검색 결과가 얼마나 최신인지는 모르겠지만, 실행했을 때 Google, Amazon, Apache... 그리고 저의 코드가 포함된 결과가 나타났습니다.

최근 제 오픈소스 프로젝트 중 하나에서 발생한 추출 요청은 정확히 이 오류를 해결하기 위한 것이었습니다.

si (escriba! =nulo y escribe.trim () .length () >0) {
Aceptar MediaTypeDefinitionsList.add (type.trim ());
}


이것을 찾는 방법


일부 정적 분석기에서 내 샘플 코드를 확인했을 때, 그 어떤 것도 이 숨겨진 자동 파괴 코드를 탐지하지 못했습니다.

Secure Code Warrior 팀으로서, 우리는 이 질문에 답할 수 있는 Sensei 간단한 Sensei 레시피를 만들고 검토했습니다.

비트 연산자는 완벽히 유효하며 할당문에서 자주 사용되므로, 우리는 if 문 사용 사례와 문제 코드를 찾기 위한 비트wise & 연산자 사용에 집중합니다.

buscar:
expresión:
Cualquiera de:
- en:
condición: {}
valor:
Sensible a mayúsculas y minúsculas: falso
coincidencias: «.* & . *»


이것은 정규 표현식을 사용하여 조건 표현식(예: if 문)에서 "&»"와 일치하도록 합니다.

이를 해결하기 위해 정규 표현식에 다시 의존했습니다. 이번에는 QuickFix의 sed 기능을 사용하여 표현식 내의 &를 &&로 전역적으로 교체했습니다.

Correcciones disponibles:
- nombre: «Reemplazar el operador AND bit a bit por el operador AND lógico»
acciones:
- reescribir:
a: «{{#sed}} s/&/&&/g, {{{.}}} {{/sed}}»


마지막 메모

이것은 비트 연산자를 부적절하게 사용하는 가장 흔한 경우를 다룹니다. 즉, 실제로는 부울 연산자를 사용하려 했던 경우를 말합니다.

다른 상황에서도 이 문제가 발생할 수 있습니다. 예를 들어 작업 예시에서 그렇습니다. 그러나 레시피를 작성할 때는 오탐지 식별을 피해야 합니다. 그렇지 않으면 레시피가 무시되거나 비활성화될 수 있습니다. 우리는 가장 흔한 발생 사례에 부합하도록 레시피를 만듭니다. Sensei 따라 더 많은 일치 조건을 커버하기 위해 검색 기능에 추가적인 특이성을 부여할 가능성이 매우 높습니다.

현재 형태로 이 레시피는 현재의 많은 사용 사례를 식별할 수 있으며, 무엇보다도 제 프로젝트에서 보고된 사례를 포함합니다.

참고: 이 예시와 레시피 검토에는 소수의 코드 전사들이 기여했습니다: Charlie Eriksen, Matthieu Calie, Robin Claerhaut, Brysen Ackx, Nathan Desmet, Downey Robersscheuten. 도움에 감사드립니다.


---


Sensei 설치하려면 Mac의 경우 「Preferencias\ Plugins」, Windows의 경우 「Configuración\ Plugins」로 이동한 후 「código seguro de sensei를 검색하세요.

Secure Code Warrior GitHub 계정의 `sensei` 저장소에는 이 블로그 게시물을 포함한 다양한 예제 코드와 레시피가 있습니다.

https://github.com/securecodewarrior/sensei-blog-examples

Sensei에 대한 자세한 정보


웹 세미나 보기
시작하다
더 알아보세요

아래 링크를 클릭하고 이 자료의 PDF를 다운로드하세요.

Secure Code Warrior 귀사의 조직이 소프트웨어 개발 라이프사이클 전반에 걸쳐 코드를 보호하고 사이버보안을 최우선으로 하는 문화를 조성하도록 Secure Code Warrior . AppSec 관리자, 개발자, CISO 또는 보안 관련 담당자라면 누구든, 저희는 귀사의 조직이 안전하지 않은 코드와 관련된 위험을 줄일 수 있도록 돕습니다.

보고서 보기데모 예약하기
리소스 보기
공유하기:
링크드인 브랜드사회적x 로고
더 알고 싶으신가요?

공유하기:
링크드인 브랜드사회적x 로고
저자
앨런 리처드슨
게시일: Feb 07, 2021

Alan Richardson은 20년 이상의 전문 IT 경험을 보유하고 있으며, 개발자로 일하며 테스터부터 테스트 책임자까지 모든 수준의 테스트 계층 구조에서 일하고 있습니다. 개발자 관계 책임자 Secure Code Warrior 그는 팀과 직접 협력하여 품질 보안 코드 의 개발을 개선합니다. 앨런은 "친애하는 악테터", "테스터를위한 자바"를 포함하여 네 권의 책의 저자입니다. 앨런은 또한 온라인 교육을 만들었습니다 courses 사람들이 자바와 기술 웹 테스트 및 셀레늄 웹 드라이버를 배울 수 있도록. 앨런은 SeleniumSimplified.com, EvilTester.com, JavaForTesters.com, CompendiumDev.co.uk 자신의 글과 트레이닝 비디오를 게시합니다.

공유하기:
링크드인 브랜드사회적x 로고

자바 오류: 비트 연산자와 부울 연산자의 차이

«Java Gotcha»: 실수로 쉽게 구현할 수 있는 흔한 오류 패턴.

자바에서 실수로 빠지기 쉬운 꽤 간단한 함정은: 부울 비교 연산자 대신 비트 연산자를 사용하는 것입니다.

예를 들어, 단순한 오타로 인해 실제로 "&&"를 입력하려던 것이 "&"로 입력될 수 있습니다.

코드를 검토할 때 배우는 일반적인 경험적 규칙은 다음과 같습니다:

조건문에서 «&» 또는 «|»가 사용된 경우 의도된 것이 아닐 가능성이 높습니다.

이 블로그 글에서는 휴리스틱을 탐구하고, 이러한 코딩 문제를 식별하고 해결할 수 있는 방법을 알아보겠습니다.


문제가 무엇인가요? 비트 단위 연산은 부울 값과 함께 잘 작동합니다.


부울 값에 비트 연산자를 사용하는 것은 완벽히 유효하므로, Java는 어떤 구문 오류도 발생시키지 않습니다.

비트 연산자(Bitwise OR(|) 및 비트 연산자(Bitwise AND(&))에 대한 진리값 표를 탐색하기 위해 JUnit 테스트를 작성하면, 비트 연산자의 출력이 진리값 표와 일치함을 확인할 수 있습니다. 이를 고려할 때, 비트 연산자 사용이 문제가 되지 않는다고 생각할 수 있습니다.

진실의 표

a가 있는 세 개의 열, b가 있는 열, 마지막 열(a^b)이 있는 열


@Test
void BitwiseOperatorsAndTruthTable () {
Assertions.assertEquals (verdadero, verdadero y verdadero);
Assertions.assertEquals (falso, verdadero y falso);
Assertions.assertEquals (falso, falso y verdadero);
Assertions.assertEquals (falso, falso y falso);
}


테스트가 통과합니다. 이것은 완벽하게 유효한 자바입니다.


진리의 표


a가 있는 세 개의 열, b가 있는 열, 마지막 열(a v b)이 있는 열


@Test
anular BitwiseOperatorSorTruthTable () {
Assertions.assertEquals (verdadero, verdadero | verdadero);
Assertions.assertEquals (verdadero, verdadero | falso);
Assertions.assertEquals (verdadero, falso | verdadero);
Assertions.assertEquals (falso, falso | falso);
}


이 테스트도 통과하는데, 왜 우리는 '&&'와 '||'를 선호할까?


진리표 도구는 진리표 도구 를 사용하여 생성되었습니다. 웹사이트(web.standfor.edu)의를 사용하여 생성되었습니다.


문제: 단락 작동


진정한 문제는 비트 연산자(&, |)와 부울 연산자(&&, ||) 간의 동작 차이입니다.

부울 연산자는 단락 연산자이며 필요한 만큼만 평가합니다.

예를 들어

si (args! = nulo & args.length () > 23) {
System.out.println (argumentos);
}


위의 코드에서는 비트 연산자를 사용했기 때문에 두 부울 조건이 모두 평가됩니다:

  • argumentos! = nulo
  • args.length() > 23

이 코드는 args가 null일 경우 NullPointerException에 취약합니다. args가 null인 경우에도 args.length 검사를 항상 수행하기 때문입니다. 두 부울 조건을 모두 평가해야 하기 때문입니다.


부울 연산자 단락 평가


&&를 사용할 때, 예를 들어

si (args! = nulo && args.length () > 23) {
System.out.println (argumentos);
}


¡En cuanto sepamos que es un argumento! = null은 false로 평가되며, 조건식의 평가가 중단됩니다.

우측을 평가할 필요가 없습니다.

오른쪽 조건의 결과가 무엇이든, 부울 표현식의 최종 값은 거짓이 될 것이다.


그러나 이는 프로덕션 코드에서는 절대 발생하지 않을 것입니다.


이것은 매우 쉽게 저지를 수 있는 오류이며 정적 분석 도구가 항상 이를 탐지하지는 않습니다.

다음 Google Dork를 사용하여 이 패턴의 공개된 예시를 찾을 수 있는지 확인했습니다:

파일 유형: java인 경우 «! = null &»
이 검색은 RootWindowContainer에서 Android 코드를 반환했습니다
isDocument = intent! = null & intent.isDocument()


이 코드는 코드 검토를 통과할 수 있는 유형입니다. 값을 가리기 위해 할당문에서 비트 연산자를 자주 사용하기 때문입니다. 하지만 이 경우 결과는 이전 if 문 예제와 동일합니다. 의도가 null인 경우 NullPointerException이 발생합니다.

우리는 종종 이 구문으로 원하는 대로 해치우곤 합니다. 왜냐하면 우리는 방어적으로 코딩하고 중복 코드를 작성하는 경우가 많기 때문입니다. `!= null` 검사는 대부분의 사용 사례에서 중복일 수 있습니다.

이는 프로그래머들이 생산 코드에서 저지른 오류입니다.

검색 결과가 얼마나 최신인지는 모르겠지만, 실행했을 때 Google, Amazon, Apache... 그리고 저의 코드가 포함된 결과가 나타났습니다.

최근 제 오픈소스 프로젝트 중 하나에서 발생한 추출 요청은 정확히 이 오류를 해결하기 위한 것이었습니다.

si (escriba! =nulo y escribe.trim () .length () >0) {
Aceptar MediaTypeDefinitionsList.add (type.trim ());
}


이것을 찾는 방법


일부 정적 분석기에서 내 샘플 코드를 확인했을 때, 그 어떤 것도 이 숨겨진 자동 파괴 코드를 탐지하지 못했습니다.

Secure Code Warrior 팀으로서, 우리는 이 질문에 답할 수 있는 Sensei 간단한 Sensei 레시피를 만들고 검토했습니다.

비트 연산자는 완벽히 유효하며 할당문에서 자주 사용되므로, 우리는 if 문 사용 사례와 문제 코드를 찾기 위한 비트wise & 연산자 사용에 집중합니다.

buscar:
expresión:
Cualquiera de:
- en:
condición: {}
valor:
Sensible a mayúsculas y minúsculas: falso
coincidencias: «.* & . *»


이것은 정규 표현식을 사용하여 조건 표현식(예: if 문)에서 "&»"와 일치하도록 합니다.

이를 해결하기 위해 정규 표현식에 다시 의존했습니다. 이번에는 QuickFix의 sed 기능을 사용하여 표현식 내의 &를 &&로 전역적으로 교체했습니다.

Correcciones disponibles:
- nombre: «Reemplazar el operador AND bit a bit por el operador AND lógico»
acciones:
- reescribir:
a: «{{#sed}} s/&/&&/g, {{{.}}} {{/sed}}»


마지막 메모

이것은 비트 연산자를 부적절하게 사용하는 가장 흔한 경우를 다룹니다. 즉, 실제로는 부울 연산자를 사용하려 했던 경우를 말합니다.

다른 상황에서도 이 문제가 발생할 수 있습니다. 예를 들어 작업 예시에서 그렇습니다. 그러나 레시피를 작성할 때는 오탐지 식별을 피해야 합니다. 그렇지 않으면 레시피가 무시되거나 비활성화될 수 있습니다. 우리는 가장 흔한 발생 사례에 부합하도록 레시피를 만듭니다. Sensei 따라 더 많은 일치 조건을 커버하기 위해 검색 기능에 추가적인 특이성을 부여할 가능성이 매우 높습니다.

현재 형태로 이 레시피는 현재의 많은 사용 사례를 식별할 수 있으며, 무엇보다도 제 프로젝트에서 보고된 사례를 포함합니다.

참고: 이 예시와 레시피 검토에는 소수의 코드 전사들이 기여했습니다: Charlie Eriksen, Matthieu Calie, Robin Claerhaut, Brysen Ackx, Nathan Desmet, Downey Robersscheuten. 도움에 감사드립니다.


---


Sensei 설치하려면 Mac의 경우 「Preferencias\ Plugins」, Windows의 경우 「Configuración\ Plugins」로 이동한 후 「código seguro de sensei를 검색하세요.

Secure Code Warrior GitHub 계정의 `sensei` 저장소에는 이 블로그 게시물을 포함한 다양한 예제 코드와 레시피가 있습니다.

https://github.com/securecodewarrior/sensei-blog-examples

Sensei에 대한 자세한 정보


목차

PDF 다운로드
리소스 보기
더 알고 싶으신가요?

Alan Richardson은 20년 이상의 전문 IT 경험을 보유하고 있으며, 개발자로 일하며 테스터부터 테스트 책임자까지 모든 수준의 테스트 계층 구조에서 일하고 있습니다. 개발자 관계 책임자 Secure Code Warrior 그는 팀과 직접 협력하여 품질 보안 코드 의 개발을 개선합니다. 앨런은 "친애하는 악테터", "테스터를위한 자바"를 포함하여 네 권의 책의 저자입니다. 앨런은 또한 온라인 교육을 만들었습니다 courses 사람들이 자바와 기술 웹 테스트 및 셀레늄 웹 드라이버를 배울 수 있도록. 앨런은 SeleniumSimplified.com, EvilTester.com, JavaForTesters.com, CompendiumDev.co.uk 자신의 글과 트레이닝 비디오를 게시합니다.

더 알아보세요

Secure Code Warrior 귀사의 조직이 소프트웨어 개발 라이프사이클 전반에 걸쳐 코드를 보호하고 사이버보안을 최우선으로 하는 문화를 조성하도록 Secure Code Warrior . AppSec 관리자, 개발자, CISO 또는 보안 관련 담당자라면 누구든, 저희는 귀사의 조직이 안전하지 않은 코드와 관련된 위험을 줄일 수 있도록 돕습니다.

데모 예약하기다운로드
공유하기:
링크드인 브랜드사회적x 로고
자원 센터

시작하기 위한 자료

더 많은 게시물
자원 센터

시작하기 위한 자료

더 많은 게시물