SCW-Symbole
Held-Hintergrund ohne Trennlinie
Blog

Java-Problem – Bitweise Operatoren und Boolesche Operatoren

Alan Richardson
Veröffentlicht Feb 07, 2021
Zuletzt aktualisiert am 09. März 2026

Java-Problem – Bitweise Operatoren und Boolesche Operatoren

> „Java Gotcha“ – Dies ist ein häufiges Fehlermuster, das leicht versehentlich implementiert werden kann.

Eines der einfachsten Probleme, das man in Java versehentlich übersehen kann, ist die Verwendung von Bit-Operatoren anstelle von Booleschen Vergleichsoperatoren.

Beispielsweise kann es vorkommen, dass man eigentlich „&&“ eingeben wollte, aber aufgrund eines einfachen Tippfehlers stattdessen „&“ eingibt.

Die folgenden Heuristiken werden häufig beim Überprüfen von Code gelernt.

Die Verwendung von „&“ oder „|“ in einer Bedingung ist möglicherweise nicht beabsichtigt.

In diesem Blogbeitrag werden wir uns mit Heuristiken befassen und herausfinden, wie wir dieses Codierungsproblem erkennen und lösen können.


Was ist das Problem? Bitweise Operationen funktionieren gut mit Booleschen Werten.


Die Verwendung von Bitoperatoren zusammen mit Booleschen Werten ist völlig zulässig, daher meldet Java keinen Syntaxfehler.

Wenn Sie einen JUnit-Test erstellen, um die Wahrheitstabellen für Bitwise OR (|) und Bitwise AND (&) zu untersuchen, können Sie sehen, dass die Ausgabe des Bitoperators mit der Wahrheitstabelle übereinstimmt. In Anbetracht dessen könnte man meinen, dass die Verwendung des Bitoperators kein Problem darstellt.

UND Wahrheitstabelle

Drei Spalten, eine mit a, eine mit b und die letzte mit (a^b)


@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}


Der Test wurde bestanden. Dies ist vollkommen gültiges Java.


ODER-Wahrheitstabelle


Drei Spalten, eine mit a, eine mit b und die letzte mit (a v b)


@Test
무효 비트 연산자 또는 진실 테이블 () {
어설션. 어설션 같음 (참, 참 | 참);
어설션. 어설션 같음 (참, 참 | 거짓);
어설션. 같음 어설션 (참, 거짓 | 참);
어설션. 같음 어설션 (거짓, 거짓 | 거짓);
}


Auch dieser Test wurde bestanden, warum also „&&“ und „||“ bevorzugen?


Das Wahrheitsfeld wurde mit folgenden Mitteln erstellt. Wahrheitstabellen-Tool ... von web.standfor.edu.


Problem: Kurzschluss


Das eigentliche Problem ist der Unterschied in der Funktionsweise zwischen Bitoperatoren (&, |) und Booleschen Operatoren (&&, ||).

Der Boolean-Operator ist ein Kurzschlussoperator und wird nur so oft wie nötig ausgewertet.

Beispiel:

만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}


In diesem Code werden Bitweise-Operatoren verwendet, sodass beide Booleschen Bedingungen ausgewertet werden.

  • Erwerb != Null
  • Annahme. Länge () > 23

Wenn der Parameter null ist, wird mein Code mit einer NullPointerException geöffnet. Da beide booleschen Bedingungen ausgewertet werden müssen, wird die args.length-Prüfung auch dann immer durchgeführt, wenn der Parameter null ist.


Bewertung von Booleschen Operatoren und Kurzschlüssen


Beispiel für die Verwendung von &&:

만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}


Sobald wir diese Übernahme erfahren! = Wenn null als false ausgewertet wird, wird die Auswertung des Bedingungsausdrucks beendet.

Es ist nicht notwendig, die rechte Seite zu bewerten.

Unabhängig vom Ergebnis der rechten Bedingung ist der endgültige Wert des booleschen Ausdrucks false.


Aber in der Produktionsumgebung wird so etwas niemals passieren.


Dies ist ein Fehler, der sehr leicht gemacht werden kann und nicht immer von statischen Analysewerkzeugen erkannt wird.

Ich habe überprüft, ob mit dem folgenden Google Dork öffentliche Fälle dieses Musters gefunden werden können.

Dateiformat: „! Java=null &“
Diese Suche hat einen Teil des Android-Codes in den Root-Windows-Container gebracht.
ISDocument = Intent!= null & Intent.isDocument ()


Da bei der Eingabe häufig Bitoperatoren zum Maskieren von Werten verwendet werden, handelt es sich um einen Code-Typ, der die Codeüberprüfung bestehen kann. In diesem Fall entspricht das Ergebnis jedoch dem obigen Beispiel für eine if-Anweisung. Wenn die Absicht immer null ist, tritt eine NullPointerException auf.

Wir verwenden diese Syntax oft nicht, weil wir häufig defensiv programmieren und doppelten Code schreiben. Überprüfen Sie es! = null kann in den meisten Anwendungsfällen doppelt vorhanden sein.

Dies ist ein Fehler, den der Programmierer im Produktionscode gemacht hat.

Ich weiß nicht, wie aktuell die Suchergebnisse sind, aber als ich die Suche durchgeführt habe, wurden Ergebnisse von Google, Amazon, Apache ... und mein Code angezeigt.

Ich musste genau diesen Fehler kürzlich in einem meiner Open-Source-Projekte in Pull Requests beheben.

만약 (입력!=null 및 type.trim (). 길이 () >0) {
미디어 유형 정의 목록을 승인합니다. 추가 (type.trim ());
}


Wie man dies findet


Bei der Überprüfung des Beispielcodes durch mehrere statische Analysatoren hat keiner diesen versteckten selbstzerstörerischen Code entdeckt.

Als Team von Secure Code Warrior haben wir ein sehr einfaches Sensei-Rezept erstellt und überprüft, mit dem dieses Problem gelöst werden kann.

Bitwise Operatoren sind vollkommen gültig und werden häufig in Zuweisungen verwendet. Daher haben wir uns auf Anwendungsfälle für if-Anweisungen und die Verwendung von Bitwise & konzentriert, um problematischen Code zu finden.

검색:
표현식:
다음 중 하나:
- 입력:
조건: {}
값:
대소문자 구분: 거짓
일치: “.* &.*”


Dies entspricht „&“ in einer Bedingungsausdruck, wenn reguläre Ausdrücke verwendet werden (z. B. in einer if-Anweisung).

Um dieses Problem zu lösen, haben wir erneut reguläre Ausdrücke verwendet. Dieses Mal haben wir die sed-Funktion von QuickFix verwendet, um das & im Ausdruck global durch && zu ersetzen.

사용 가능한 수정 사항:
- 이름: “비트 AND 연산자를 논리 AND 연산자로 바꾸기”
조치:
- 다시 작성:
받는 사람: “{{#sed}} s/&/&/g, {{{.}}} {{/sed}}”


Endnote

Hier geht es um die häufigsten Fehlverwendungen von Bitoperatoren, d. h. um Fälle, in denen eigentlich Boolesche Operatoren gemeint waren.

Es können zwar andere Situationen auftreten, wie beispielsweise bei der Hochschulzulassung, aber beim Erstellen von Rezepten sollte eine falsche Identifizierung vermieden werden. Andernfalls wird das Rezept ignoriert oder deaktiviert. Wir erstellen Rezepte, die den am häufigsten auftretenden Situationen entsprechen. Mit der Weiterentwicklung von Sensei werden wir bestimmte Funktionen zur Suchfunktion hinzufügen, um mehr Übereinstimmungsbedingungen abzudecken.

In seiner aktuellen Form lässt sich dieses Rezept auf viele reale Anwendungsfälle anwenden. Am wichtigsten sind die Ergebnisse, die in meinem Projekt berichtet wurden.

Hinweis: Charlie Eriksen, Mathieu Calley, Robin Clairhout, Bryson Ax, Nathan Desmet, Downey Robershoten und andere Code-Krieger haben zu diesem Beispiel und der Rezeptüberprüfung beigetragen. Vielen Dank für Ihre Hilfe.


---


Installieren Sie Sensei in IntelliJ über „Einstellungen\Plugins“ (Mac) oder „Einstellungen\Plugins“ (Windows) und suchen Sie dann einfach nach „Sensei-Sicherheitscode“.

Secure Code Warrior Das Repository „sensei“ enthält zahlreiche Quellcodes und Rezepte zu diesen Blogbeiträgen (einschließlich dieses Beitrags).

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

Mehr über Sensei erfahren


Ressourcen anzeigen
Ressourcen anzeigen

In diesem Blogbeitrag werden wir uns mit häufigen Java-Codierungsfehlern (Verwendung von Bitoperatoren anstelle von Bedingungsoperatoren), den dadurch verursachten Fehlern, die den Code anfällig machen, und der Verwendung von Sensei zur Fehlerbehebung und -erkennung befassen.

Sind Sie an weiteren Informationen interessiert?

Alan Richardson verfügt über mehr als zwanzig Jahre Berufserfahrung in der IT-Branche. Er arbeitete als Entwickler und auf jeder Ebene der Testhierarchie, vom Tester bis hin zum Head of Testing. Als Head of Developer Relations bei Secure Code Warrior arbeitet er direkt mit Teams zusammen, um die Entwicklung von hochwertigem, sicherem Code zu verbessern. Alan ist der Autor von vier Büchern, darunter "Dear Evil Tester" und "Java For Testers". Alan hat auch Online-Schulungen courses erstellt, um Menschen beim Erlernen von technischen Web-Tests und Selenium WebDriver mit Java zu helfen. Alan veröffentlicht seine Schriften und Schulungsvideos auf SeleniumSimplified.com, EvilTester.com, JavaForTesters.com und CompendiumDev.co.uk.

mehr erfahren

Secure Code Warrior ist für Unternehmen da, um den Code während des gesamten Softwareentwicklungszyklus zu schützen und eine Kultur zu schaffen, in der Cybersicherheit oberste Priorität hat. Unabhängig davon, ob Sie AppSec-Manager, Entwickler, CISO oder in einem anderen Bereich der Sicherheit tätig sind, können wir Ihnen dabei helfen, die Risiken zu reduzieren, die mit unsicherem Code verbunden sind.

Demo-Termin vereinbaren
Freigabeziel:
LinkedIn-MarkenSozialx Logo
Verfasser
Alan Richardson
Veröffentlicht Feb 07, 2021

Alan Richardson verfügt über mehr als zwanzig Jahre Berufserfahrung in der IT-Branche. Er arbeitete als Entwickler und auf jeder Ebene der Testhierarchie, vom Tester bis hin zum Head of Testing. Als Head of Developer Relations bei Secure Code Warrior arbeitet er direkt mit Teams zusammen, um die Entwicklung von hochwertigem, sicherem Code zu verbessern. Alan ist der Autor von vier Büchern, darunter "Dear Evil Tester" und "Java For Testers". Alan hat auch Online-Schulungen courses erstellt, um Menschen beim Erlernen von technischen Web-Tests und Selenium WebDriver mit Java zu helfen. Alan veröffentlicht seine Schriften und Schulungsvideos auf SeleniumSimplified.com, EvilTester.com, JavaForTesters.com und CompendiumDev.co.uk.

Freigabeziel:
LinkedIn-MarkenSozialx Logo

Java-Problem – Bitweise Operatoren und Boolesche Operatoren

> „Java Gotcha“ – Dies ist ein häufiges Fehlermuster, das leicht versehentlich implementiert werden kann.

Eines der einfachsten Probleme, das man in Java versehentlich übersehen kann, ist die Verwendung von Bit-Operatoren anstelle von Booleschen Vergleichsoperatoren.

Beispielsweise kann es vorkommen, dass man eigentlich „&&“ eingeben wollte, aber aufgrund eines einfachen Tippfehlers stattdessen „&“ eingibt.

Die folgenden Heuristiken werden häufig beim Überprüfen von Code gelernt.

Die Verwendung von „&“ oder „|“ in einer Bedingung ist möglicherweise nicht beabsichtigt.

In diesem Blogbeitrag werden wir uns mit Heuristiken befassen und herausfinden, wie wir dieses Codierungsproblem erkennen und lösen können.


Was ist das Problem? Bitweise Operationen funktionieren gut mit Booleschen Werten.


Die Verwendung von Bitoperatoren zusammen mit Booleschen Werten ist völlig zulässig, daher meldet Java keinen Syntaxfehler.

Wenn Sie einen JUnit-Test erstellen, um die Wahrheitstabellen für Bitwise OR (|) und Bitwise AND (&) zu untersuchen, können Sie sehen, dass die Ausgabe des Bitoperators mit der Wahrheitstabelle übereinstimmt. In Anbetracht dessen könnte man meinen, dass die Verwendung des Bitoperators kein Problem darstellt.

UND Wahrheitstabelle

Drei Spalten, eine mit a, eine mit b und die letzte mit (a^b)


@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}


Der Test wurde bestanden. Dies ist vollkommen gültiges Java.


ODER-Wahrheitstabelle


Drei Spalten, eine mit a, eine mit b und die letzte mit (a v b)


@Test
무효 비트 연산자 또는 진실 테이블 () {
어설션. 어설션 같음 (참, 참 | 참);
어설션. 어설션 같음 (참, 참 | 거짓);
어설션. 같음 어설션 (참, 거짓 | 참);
어설션. 같음 어설션 (거짓, 거짓 | 거짓);
}


Auch dieser Test wurde bestanden, warum also „&&“ und „||“ bevorzugen?


Das Wahrheitsfeld wurde mit folgenden Mitteln erstellt. Wahrheitstabellen-Tool ... von web.standfor.edu.


Problem: Kurzschluss


Das eigentliche Problem ist der Unterschied in der Funktionsweise zwischen Bitoperatoren (&, |) und Booleschen Operatoren (&&, ||).

Der Boolean-Operator ist ein Kurzschlussoperator und wird nur so oft wie nötig ausgewertet.

Beispiel:

만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}


In diesem Code werden Bitweise-Operatoren verwendet, sodass beide Booleschen Bedingungen ausgewertet werden.

  • Erwerb != Null
  • Annahme. Länge () > 23

Wenn der Parameter null ist, wird mein Code mit einer NullPointerException geöffnet. Da beide booleschen Bedingungen ausgewertet werden müssen, wird die args.length-Prüfung auch dann immer durchgeführt, wenn der Parameter null ist.


Bewertung von Booleschen Operatoren und Kurzschlüssen


Beispiel für die Verwendung von &&:

만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}


Sobald wir diese Übernahme erfahren! = Wenn null als false ausgewertet wird, wird die Auswertung des Bedingungsausdrucks beendet.

Es ist nicht notwendig, die rechte Seite zu bewerten.

Unabhängig vom Ergebnis der rechten Bedingung ist der endgültige Wert des booleschen Ausdrucks false.


Aber in der Produktionsumgebung wird so etwas niemals passieren.


Dies ist ein Fehler, der sehr leicht gemacht werden kann und nicht immer von statischen Analysewerkzeugen erkannt wird.

Ich habe überprüft, ob mit dem folgenden Google Dork öffentliche Fälle dieses Musters gefunden werden können.

Dateiformat: „! Java=null &“
Diese Suche hat einen Teil des Android-Codes in den Root-Windows-Container gebracht.
ISDocument = Intent!= null & Intent.isDocument ()


Da bei der Eingabe häufig Bitoperatoren zum Maskieren von Werten verwendet werden, handelt es sich um einen Code-Typ, der die Codeüberprüfung bestehen kann. In diesem Fall entspricht das Ergebnis jedoch dem obigen Beispiel für eine if-Anweisung. Wenn die Absicht immer null ist, tritt eine NullPointerException auf.

Wir verwenden diese Syntax oft nicht, weil wir häufig defensiv programmieren und doppelten Code schreiben. Überprüfen Sie es! = null kann in den meisten Anwendungsfällen doppelt vorhanden sein.

Dies ist ein Fehler, den der Programmierer im Produktionscode gemacht hat.

Ich weiß nicht, wie aktuell die Suchergebnisse sind, aber als ich die Suche durchgeführt habe, wurden Ergebnisse von Google, Amazon, Apache ... und mein Code angezeigt.

Ich musste genau diesen Fehler kürzlich in einem meiner Open-Source-Projekte in Pull Requests beheben.

만약 (입력!=null 및 type.trim (). 길이 () >0) {
미디어 유형 정의 목록을 승인합니다. 추가 (type.trim ());
}


Wie man dies findet


Bei der Überprüfung des Beispielcodes durch mehrere statische Analysatoren hat keiner diesen versteckten selbstzerstörerischen Code entdeckt.

Als Team von Secure Code Warrior haben wir ein sehr einfaches Sensei-Rezept erstellt und überprüft, mit dem dieses Problem gelöst werden kann.

Bitwise Operatoren sind vollkommen gültig und werden häufig in Zuweisungen verwendet. Daher haben wir uns auf Anwendungsfälle für if-Anweisungen und die Verwendung von Bitwise & konzentriert, um problematischen Code zu finden.

검색:
표현식:
다음 중 하나:
- 입력:
조건: {}
값:
대소문자 구분: 거짓
일치: “.* &.*”


Dies entspricht „&“ in einer Bedingungsausdruck, wenn reguläre Ausdrücke verwendet werden (z. B. in einer if-Anweisung).

Um dieses Problem zu lösen, haben wir erneut reguläre Ausdrücke verwendet. Dieses Mal haben wir die sed-Funktion von QuickFix verwendet, um das & im Ausdruck global durch && zu ersetzen.

사용 가능한 수정 사항:
- 이름: “비트 AND 연산자를 논리 AND 연산자로 바꾸기”
조치:
- 다시 작성:
받는 사람: “{{#sed}} s/&/&/g, {{{.}}} {{/sed}}”


Endnote

Hier geht es um die häufigsten Fehlverwendungen von Bitoperatoren, d. h. um Fälle, in denen eigentlich Boolesche Operatoren gemeint waren.

Es können zwar andere Situationen auftreten, wie beispielsweise bei der Hochschulzulassung, aber beim Erstellen von Rezepten sollte eine falsche Identifizierung vermieden werden. Andernfalls wird das Rezept ignoriert oder deaktiviert. Wir erstellen Rezepte, die den am häufigsten auftretenden Situationen entsprechen. Mit der Weiterentwicklung von Sensei werden wir bestimmte Funktionen zur Suchfunktion hinzufügen, um mehr Übereinstimmungsbedingungen abzudecken.

In seiner aktuellen Form lässt sich dieses Rezept auf viele reale Anwendungsfälle anwenden. Am wichtigsten sind die Ergebnisse, die in meinem Projekt berichtet wurden.

Hinweis: Charlie Eriksen, Mathieu Calley, Robin Clairhout, Bryson Ax, Nathan Desmet, Downey Robershoten und andere Code-Krieger haben zu diesem Beispiel und der Rezeptüberprüfung beigetragen. Vielen Dank für Ihre Hilfe.


---


Installieren Sie Sensei in IntelliJ über „Einstellungen\Plugins“ (Mac) oder „Einstellungen\Plugins“ (Windows) und suchen Sie dann einfach nach „Sensei-Sicherheitscode“.

Secure Code Warrior Das Repository „sensei“ enthält zahlreiche Quellcodes und Rezepte zu diesen Blogbeiträgen (einschließlich dieses Beitrags).

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

Mehr über Sensei erfahren


Ressourcen anzeigen
Ressourcen anzeigen

Um den Bericht herunterzuladen, füllen Sie bitte das folgende Formular aus.

Wir bitten um Ihre Zustimmung, Ihnen Informationen zu unseren Produkten und/oder verwandten Themen der Sicherheitscodierung zukommen zu lassen. Wir behandeln Ihre personenbezogenen Daten stets mit größter Sorgfalt und verkaufen sie niemals zu Marketingzwecken an andere Unternehmen.

Einreichung
scw Erfolgssymbol
scw-Fehlersymbol
Um das Formular zu senden, aktivieren Sie bitte das „Analytics“-Cookie. Nach Abschluss können Sie es jederzeit wieder deaktivieren.

Java-Problem – Bitweise Operatoren und Boolesche Operatoren

> „Java Gotcha“ – Dies ist ein häufiges Fehlermuster, das leicht versehentlich implementiert werden kann.

Eines der einfachsten Probleme, das man in Java versehentlich übersehen kann, ist die Verwendung von Bit-Operatoren anstelle von Booleschen Vergleichsoperatoren.

Beispielsweise kann es vorkommen, dass man eigentlich „&&“ eingeben wollte, aber aufgrund eines einfachen Tippfehlers stattdessen „&“ eingibt.

Die folgenden Heuristiken werden häufig beim Überprüfen von Code gelernt.

Die Verwendung von „&“ oder „|“ in einer Bedingung ist möglicherweise nicht beabsichtigt.

In diesem Blogbeitrag werden wir uns mit Heuristiken befassen und herausfinden, wie wir dieses Codierungsproblem erkennen und lösen können.


Was ist das Problem? Bitweise Operationen funktionieren gut mit Booleschen Werten.


Die Verwendung von Bitoperatoren zusammen mit Booleschen Werten ist völlig zulässig, daher meldet Java keinen Syntaxfehler.

Wenn Sie einen JUnit-Test erstellen, um die Wahrheitstabellen für Bitwise OR (|) und Bitwise AND (&) zu untersuchen, können Sie sehen, dass die Ausgabe des Bitoperators mit der Wahrheitstabelle übereinstimmt. In Anbetracht dessen könnte man meinen, dass die Verwendung des Bitoperators kein Problem darstellt.

UND Wahrheitstabelle

Drei Spalten, eine mit a, eine mit b und die letzte mit (a^b)


@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}


Der Test wurde bestanden. Dies ist vollkommen gültiges Java.


ODER-Wahrheitstabelle


Drei Spalten, eine mit a, eine mit b und die letzte mit (a v b)


@Test
무효 비트 연산자 또는 진실 테이블 () {
어설션. 어설션 같음 (참, 참 | 참);
어설션. 어설션 같음 (참, 참 | 거짓);
어설션. 같음 어설션 (참, 거짓 | 참);
어설션. 같음 어설션 (거짓, 거짓 | 거짓);
}


Auch dieser Test wurde bestanden, warum also „&&“ und „||“ bevorzugen?


Das Wahrheitsfeld wurde mit folgenden Mitteln erstellt. Wahrheitstabellen-Tool ... von web.standfor.edu.


Problem: Kurzschluss


Das eigentliche Problem ist der Unterschied in der Funktionsweise zwischen Bitoperatoren (&, |) und Booleschen Operatoren (&&, ||).

Der Boolean-Operator ist ein Kurzschlussoperator und wird nur so oft wie nötig ausgewertet.

Beispiel:

만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}


In diesem Code werden Bitweise-Operatoren verwendet, sodass beide Booleschen Bedingungen ausgewertet werden.

  • Erwerb != Null
  • Annahme. Länge () > 23

Wenn der Parameter null ist, wird mein Code mit einer NullPointerException geöffnet. Da beide booleschen Bedingungen ausgewertet werden müssen, wird die args.length-Prüfung auch dann immer durchgeführt, wenn der Parameter null ist.


Bewertung von Booleschen Operatoren und Kurzschlüssen


Beispiel für die Verwendung von &&:

만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}


Sobald wir diese Übernahme erfahren! = Wenn null als false ausgewertet wird, wird die Auswertung des Bedingungsausdrucks beendet.

Es ist nicht notwendig, die rechte Seite zu bewerten.

Unabhängig vom Ergebnis der rechten Bedingung ist der endgültige Wert des booleschen Ausdrucks false.


Aber in der Produktionsumgebung wird so etwas niemals passieren.


Dies ist ein Fehler, der sehr leicht gemacht werden kann und nicht immer von statischen Analysewerkzeugen erkannt wird.

Ich habe überprüft, ob mit dem folgenden Google Dork öffentliche Fälle dieses Musters gefunden werden können.

Dateiformat: „! Java=null &“
Diese Suche hat einen Teil des Android-Codes in den Root-Windows-Container gebracht.
ISDocument = Intent!= null & Intent.isDocument ()


Da bei der Eingabe häufig Bitoperatoren zum Maskieren von Werten verwendet werden, handelt es sich um einen Code-Typ, der die Codeüberprüfung bestehen kann. In diesem Fall entspricht das Ergebnis jedoch dem obigen Beispiel für eine if-Anweisung. Wenn die Absicht immer null ist, tritt eine NullPointerException auf.

Wir verwenden diese Syntax oft nicht, weil wir häufig defensiv programmieren und doppelten Code schreiben. Überprüfen Sie es! = null kann in den meisten Anwendungsfällen doppelt vorhanden sein.

Dies ist ein Fehler, den der Programmierer im Produktionscode gemacht hat.

Ich weiß nicht, wie aktuell die Suchergebnisse sind, aber als ich die Suche durchgeführt habe, wurden Ergebnisse von Google, Amazon, Apache ... und mein Code angezeigt.

Ich musste genau diesen Fehler kürzlich in einem meiner Open-Source-Projekte in Pull Requests beheben.

만약 (입력!=null 및 type.trim (). 길이 () >0) {
미디어 유형 정의 목록을 승인합니다. 추가 (type.trim ());
}


Wie man dies findet


Bei der Überprüfung des Beispielcodes durch mehrere statische Analysatoren hat keiner diesen versteckten selbstzerstörerischen Code entdeckt.

Als Team von Secure Code Warrior haben wir ein sehr einfaches Sensei-Rezept erstellt und überprüft, mit dem dieses Problem gelöst werden kann.

Bitwise Operatoren sind vollkommen gültig und werden häufig in Zuweisungen verwendet. Daher haben wir uns auf Anwendungsfälle für if-Anweisungen und die Verwendung von Bitwise & konzentriert, um problematischen Code zu finden.

검색:
표현식:
다음 중 하나:
- 입력:
조건: {}
값:
대소문자 구분: 거짓
일치: “.* &.*”


Dies entspricht „&“ in einer Bedingungsausdruck, wenn reguläre Ausdrücke verwendet werden (z. B. in einer if-Anweisung).

Um dieses Problem zu lösen, haben wir erneut reguläre Ausdrücke verwendet. Dieses Mal haben wir die sed-Funktion von QuickFix verwendet, um das & im Ausdruck global durch && zu ersetzen.

사용 가능한 수정 사항:
- 이름: “비트 AND 연산자를 논리 AND 연산자로 바꾸기”
조치:
- 다시 작성:
받는 사람: “{{#sed}} s/&/&/g, {{{.}}} {{/sed}}”


Endnote

Hier geht es um die häufigsten Fehlverwendungen von Bitoperatoren, d. h. um Fälle, in denen eigentlich Boolesche Operatoren gemeint waren.

Es können zwar andere Situationen auftreten, wie beispielsweise bei der Hochschulzulassung, aber beim Erstellen von Rezepten sollte eine falsche Identifizierung vermieden werden. Andernfalls wird das Rezept ignoriert oder deaktiviert. Wir erstellen Rezepte, die den am häufigsten auftretenden Situationen entsprechen. Mit der Weiterentwicklung von Sensei werden wir bestimmte Funktionen zur Suchfunktion hinzufügen, um mehr Übereinstimmungsbedingungen abzudecken.

In seiner aktuellen Form lässt sich dieses Rezept auf viele reale Anwendungsfälle anwenden. Am wichtigsten sind die Ergebnisse, die in meinem Projekt berichtet wurden.

Hinweis: Charlie Eriksen, Mathieu Calley, Robin Clairhout, Bryson Ax, Nathan Desmet, Downey Robershoten und andere Code-Krieger haben zu diesem Beispiel und der Rezeptüberprüfung beigetragen. Vielen Dank für Ihre Hilfe.


---


Installieren Sie Sensei in IntelliJ über „Einstellungen\Plugins“ (Mac) oder „Einstellungen\Plugins“ (Windows) und suchen Sie dann einfach nach „Sensei-Sicherheitscode“.

Secure Code Warrior Das Repository „sensei“ enthält zahlreiche Quellcodes und Rezepte zu diesen Blogbeiträgen (einschließlich dieses Beitrags).

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

Mehr über Sensei erfahren


Webinar ansehen
Beginnen
mehr erfahren

Klicken Sie auf den folgenden Link und laden Sie die PDF-Datei dieser Ressource herunter.

Secure Code Warrior ist für Unternehmen da, um den Code während des gesamten Softwareentwicklungszyklus zu schützen und eine Kultur zu schaffen, in der Cybersicherheit oberste Priorität hat. Unabhängig davon, ob Sie AppSec-Manager, Entwickler, CISO oder in einem anderen Bereich der Sicherheit tätig sind, können wir Ihnen dabei helfen, die Risiken zu reduzieren, die mit unsicherem Code verbunden sind.

Bericht anzeigenDemo-Termin vereinbaren
Ressourcen anzeigen
Freigabeziel:
LinkedIn-MarkenSozialx Logo
Sind Sie an weiteren Informationen interessiert?

Freigabeziel:
LinkedIn-MarkenSozialx Logo
Verfasser
Alan Richardson
Veröffentlicht Feb 07, 2021

Alan Richardson verfügt über mehr als zwanzig Jahre Berufserfahrung in der IT-Branche. Er arbeitete als Entwickler und auf jeder Ebene der Testhierarchie, vom Tester bis hin zum Head of Testing. Als Head of Developer Relations bei Secure Code Warrior arbeitet er direkt mit Teams zusammen, um die Entwicklung von hochwertigem, sicherem Code zu verbessern. Alan ist der Autor von vier Büchern, darunter "Dear Evil Tester" und "Java For Testers". Alan hat auch Online-Schulungen courses erstellt, um Menschen beim Erlernen von technischen Web-Tests und Selenium WebDriver mit Java zu helfen. Alan veröffentlicht seine Schriften und Schulungsvideos auf SeleniumSimplified.com, EvilTester.com, JavaForTesters.com und CompendiumDev.co.uk.

Freigabeziel:
LinkedIn-MarkenSozialx Logo

Java-Problem – Bitweise Operatoren und Boolesche Operatoren

> „Java Gotcha“ – Dies ist ein häufiges Fehlermuster, das leicht versehentlich implementiert werden kann.

Eines der einfachsten Probleme, das man in Java versehentlich übersehen kann, ist die Verwendung von Bit-Operatoren anstelle von Booleschen Vergleichsoperatoren.

Beispielsweise kann es vorkommen, dass man eigentlich „&&“ eingeben wollte, aber aufgrund eines einfachen Tippfehlers stattdessen „&“ eingibt.

Die folgenden Heuristiken werden häufig beim Überprüfen von Code gelernt.

Die Verwendung von „&“ oder „|“ in einer Bedingung ist möglicherweise nicht beabsichtigt.

In diesem Blogbeitrag werden wir uns mit Heuristiken befassen und herausfinden, wie wir dieses Codierungsproblem erkennen und lösen können.


Was ist das Problem? Bitweise Operationen funktionieren gut mit Booleschen Werten.


Die Verwendung von Bitoperatoren zusammen mit Booleschen Werten ist völlig zulässig, daher meldet Java keinen Syntaxfehler.

Wenn Sie einen JUnit-Test erstellen, um die Wahrheitstabellen für Bitwise OR (|) und Bitwise AND (&) zu untersuchen, können Sie sehen, dass die Ausgabe des Bitoperators mit der Wahrheitstabelle übereinstimmt. In Anbetracht dessen könnte man meinen, dass die Verwendung des Bitoperators kein Problem darstellt.

UND Wahrheitstabelle

Drei Spalten, eine mit a, eine mit b und die letzte mit (a^b)


@Test
무효 비트 연산자 및 진실 테이블 () {
어설션. 같음 어설션 (참, 참, 참);
어설션. 같음 어설션 (거짓, 참, 거짓);
어설션. 같음 어설션 (거짓, 거짓, 참);
어설션. 같음 어설션 (거짓, 거짓, 거짓);
}


Der Test wurde bestanden. Dies ist vollkommen gültiges Java.


ODER-Wahrheitstabelle


Drei Spalten, eine mit a, eine mit b und die letzte mit (a v b)


@Test
무효 비트 연산자 또는 진실 테이블 () {
어설션. 어설션 같음 (참, 참 | 참);
어설션. 어설션 같음 (참, 참 | 거짓);
어설션. 같음 어설션 (참, 거짓 | 참);
어설션. 같음 어설션 (거짓, 거짓 | 거짓);
}


Auch dieser Test wurde bestanden, warum also „&&“ und „||“ bevorzugen?


Das Wahrheitsfeld wurde mit folgenden Mitteln erstellt. Wahrheitstabellen-Tool ... von web.standfor.edu.


Problem: Kurzschluss


Das eigentliche Problem ist der Unterschied in der Funktionsweise zwischen Bitoperatoren (&, |) und Booleschen Operatoren (&&, ||).

Der Boolean-Operator ist ein Kurzschlussoperator und wird nur so oft wie nötig ausgewertet.

Beispiel:

만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}


In diesem Code werden Bitweise-Operatoren verwendet, sodass beide Booleschen Bedingungen ausgewertet werden.

  • Erwerb != Null
  • Annahme. Länge () > 23

Wenn der Parameter null ist, wird mein Code mit einer NullPointerException geöffnet. Da beide booleschen Bedingungen ausgewertet werden müssen, wird die args.length-Prüfung auch dann immer durchgeführt, wenn der Parameter null ist.


Bewertung von Booleschen Operatoren und Kurzschlüssen


Beispiel für die Verwendung von &&:

만약 (격언!= null 및 인수. 길이 () > 23) {
시스템.out.printLN (args);
}


Sobald wir diese Übernahme erfahren! = Wenn null als false ausgewertet wird, wird die Auswertung des Bedingungsausdrucks beendet.

Es ist nicht notwendig, die rechte Seite zu bewerten.

Unabhängig vom Ergebnis der rechten Bedingung ist der endgültige Wert des booleschen Ausdrucks false.


Aber in der Produktionsumgebung wird so etwas niemals passieren.


Dies ist ein Fehler, der sehr leicht gemacht werden kann und nicht immer von statischen Analysewerkzeugen erkannt wird.

Ich habe überprüft, ob mit dem folgenden Google Dork öffentliche Fälle dieses Musters gefunden werden können.

Dateiformat: „! Java=null &“
Diese Suche hat einen Teil des Android-Codes in den Root-Windows-Container gebracht.
ISDocument = Intent!= null & Intent.isDocument ()


Da bei der Eingabe häufig Bitoperatoren zum Maskieren von Werten verwendet werden, handelt es sich um einen Code-Typ, der die Codeüberprüfung bestehen kann. In diesem Fall entspricht das Ergebnis jedoch dem obigen Beispiel für eine if-Anweisung. Wenn die Absicht immer null ist, tritt eine NullPointerException auf.

Wir verwenden diese Syntax oft nicht, weil wir häufig defensiv programmieren und doppelten Code schreiben. Überprüfen Sie es! = null kann in den meisten Anwendungsfällen doppelt vorhanden sein.

Dies ist ein Fehler, den der Programmierer im Produktionscode gemacht hat.

Ich weiß nicht, wie aktuell die Suchergebnisse sind, aber als ich die Suche durchgeführt habe, wurden Ergebnisse von Google, Amazon, Apache ... und mein Code angezeigt.

Ich musste genau diesen Fehler kürzlich in einem meiner Open-Source-Projekte in Pull Requests beheben.

만약 (입력!=null 및 type.trim (). 길이 () >0) {
미디어 유형 정의 목록을 승인합니다. 추가 (type.trim ());
}


Wie man dies findet


Bei der Überprüfung des Beispielcodes durch mehrere statische Analysatoren hat keiner diesen versteckten selbstzerstörerischen Code entdeckt.

Als Team von Secure Code Warrior haben wir ein sehr einfaches Sensei-Rezept erstellt und überprüft, mit dem dieses Problem gelöst werden kann.

Bitwise Operatoren sind vollkommen gültig und werden häufig in Zuweisungen verwendet. Daher haben wir uns auf Anwendungsfälle für if-Anweisungen und die Verwendung von Bitwise & konzentriert, um problematischen Code zu finden.

검색:
표현식:
다음 중 하나:
- 입력:
조건: {}
값:
대소문자 구분: 거짓
일치: “.* &.*”


Dies entspricht „&“ in einer Bedingungsausdruck, wenn reguläre Ausdrücke verwendet werden (z. B. in einer if-Anweisung).

Um dieses Problem zu lösen, haben wir erneut reguläre Ausdrücke verwendet. Dieses Mal haben wir die sed-Funktion von QuickFix verwendet, um das & im Ausdruck global durch && zu ersetzen.

사용 가능한 수정 사항:
- 이름: “비트 AND 연산자를 논리 AND 연산자로 바꾸기”
조치:
- 다시 작성:
받는 사람: “{{#sed}} s/&/&/g, {{{.}}} {{/sed}}”


Endnote

Hier geht es um die häufigsten Fehlverwendungen von Bitoperatoren, d. h. um Fälle, in denen eigentlich Boolesche Operatoren gemeint waren.

Es können zwar andere Situationen auftreten, wie beispielsweise bei der Hochschulzulassung, aber beim Erstellen von Rezepten sollte eine falsche Identifizierung vermieden werden. Andernfalls wird das Rezept ignoriert oder deaktiviert. Wir erstellen Rezepte, die den am häufigsten auftretenden Situationen entsprechen. Mit der Weiterentwicklung von Sensei werden wir bestimmte Funktionen zur Suchfunktion hinzufügen, um mehr Übereinstimmungsbedingungen abzudecken.

In seiner aktuellen Form lässt sich dieses Rezept auf viele reale Anwendungsfälle anwenden. Am wichtigsten sind die Ergebnisse, die in meinem Projekt berichtet wurden.

Hinweis: Charlie Eriksen, Mathieu Calley, Robin Clairhout, Bryson Ax, Nathan Desmet, Downey Robershoten und andere Code-Krieger haben zu diesem Beispiel und der Rezeptüberprüfung beigetragen. Vielen Dank für Ihre Hilfe.


---


Installieren Sie Sensei in IntelliJ über „Einstellungen\Plugins“ (Mac) oder „Einstellungen\Plugins“ (Windows) und suchen Sie dann einfach nach „Sensei-Sicherheitscode“.

Secure Code Warrior Das Repository „sensei“ enthält zahlreiche Quellcodes und Rezepte zu diesen Blogbeiträgen (einschließlich dieses Beitrags).

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

Mehr über Sensei erfahren


Inhaltsverzeichnis

PDF herunterladen
Ressourcen anzeigen
Sind Sie an weiteren Informationen interessiert?

Alan Richardson verfügt über mehr als zwanzig Jahre Berufserfahrung in der IT-Branche. Er arbeitete als Entwickler und auf jeder Ebene der Testhierarchie, vom Tester bis hin zum Head of Testing. Als Head of Developer Relations bei Secure Code Warrior arbeitet er direkt mit Teams zusammen, um die Entwicklung von hochwertigem, sicherem Code zu verbessern. Alan ist der Autor von vier Büchern, darunter "Dear Evil Tester" und "Java For Testers". Alan hat auch Online-Schulungen courses erstellt, um Menschen beim Erlernen von technischen Web-Tests und Selenium WebDriver mit Java zu helfen. Alan veröffentlicht seine Schriften und Schulungsvideos auf SeleniumSimplified.com, EvilTester.com, JavaForTesters.com und CompendiumDev.co.uk.

mehr erfahren

Secure Code Warrior ist für Unternehmen da, um den Code während des gesamten Softwareentwicklungszyklus zu schützen und eine Kultur zu schaffen, in der Cybersicherheit oberste Priorität hat. Unabhängig davon, ob Sie AppSec-Manager, Entwickler, CISO oder in einem anderen Bereich der Sicherheit tätig sind, können wir Ihnen dabei helfen, die Risiken zu reduzieren, die mit unsicherem Code verbunden sind.

Demo-Termin vereinbarenDownload
Freigabeziel:
LinkedIn-MarkenSozialx Logo
Ressourcen-Hub

Hilfreiche Ressourcen für den Einstieg

Weitere Beiträge
Ressourcen-Hub

Hilfreiche Ressourcen für den Einstieg

Weitere Beiträge