เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ Crazy

Hey Habr!

เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เบšเปเบฅเบดเบชเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบกเบฑเบเบˆเบฐเบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบฅเบฐเบซเบฑเบ”เบชเบฐเบ–เบดเบ” (SAST). เบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบชเบฐเป€เบฅเปˆเบ. เปเบ™เปˆเบ™เบญเบ™, เบกเบฑเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เปเบฅเบฐเป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบกเบฑเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบงเปˆเบฒเป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเบ„เบธเป‰เบกเบ„เบญเบ‡เป‚เบ”เบเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบ™เบงเปƒเบ”. เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบซเบ™เบถเปˆเบ‡เปƒเบ™เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบชเบธเบ”เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฅเบทเบญเบเป€เบ„เบทเปˆเบญเบ‡เบกเบท SAST เปเบกเปˆเบ™เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ›เบฑเบšเปเบ•เปˆเบ‡เบกเบฑเบ™เปƒเบซเป‰เบเบฑเบšเบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบ„เบท, เบ‚เบฝเบ™เปเบฅเบฐเบ›เปˆเบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบซเบผเบท, เบเป‰เบญเบ™เบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเบ–เบทเบเป€เบญเบตเป‰เบ™เป€เบฅเบทเป‰เบญเบเป†, Custom Queries.

เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ Crazy

เบžเบงเบเป€เบฎเบปเบฒเบชเปˆเบงเบ™เบซเบผเบฒเบเบกเบฑเบเปƒเบŠเป‰ Checkmarx - เป€เบ›เบฑเบ™เบ•เบปเบงเบงเบดเป€เบ„เบฒเบฐเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปเบฅเบฐเบกเบตเบญเปเบฒเบ™เบฒเบ”เบซเบผเบฒเบ. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบญเบเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปƒเบ™เบเบฒเบ™เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบชเปเบฒเบฅเบฑเบšเบกเบฑเบ™.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เป€เบ™เบทเป‰เบญเบซเบฒ

เป€เบ‚เบปเป‰เบฒ

เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเปเบ™เบฐเบ™เปเบฒเบซเบ™เบถเปˆเบ‡เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบเปƒเบ™เบžเบฒเบชเบฒเบฅเบฑเบ”เป€เบŠเบเบเปˆเบฝเบงเบเบฑเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™เบ„เปเบฒเบ–เบฒเบกเบชเปเบฒเบฅเบฑเบš Checkmarx. เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบˆเบฑเบ”เบžเบตเบกเบกเบฒเปƒเบ™Habrรฉเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡ 2019 เบžเบฒเบเปƒเบ•เป‰เบซเบปเบงเบ‚เปเป‰: "เบชเบฐเบšเบฒเบเบ”เบต, Checkmarx!" เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบ„เปเบฒเบ–เบฒเบก Checkmarx SAST เปเบฅเบฐเบŠเบญเบเบซเบฒเบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเป€เบขเบฑเบ™.

เบกเบฑเบ™เบเบงเบ”เบชเบญเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบ„เปเบฒเบ–เบฒเบกเบ—เปเบฒเบญเบดเบ”เปƒเบ™ CxQL (Checkmarx Query Language) เบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบšเบฒเบ‡เบขเปˆเบฒเบ‡เปเบฅเบฐเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบซเบผเบฑเบเบเบฒเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเป„เบงเป‰เปƒเบ™เบ™เบฑเป‰เบ™, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฒเบ‡เบ—เบฒเบ‡เบ•เบฑเบ”เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆ. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ‚เบญเบ‡เบ‚เป‰เบญเบเบ‚เป‰เบญเบเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเบฅเบงเบšเบฅเบงเบกเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ "เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบชเบนเบ”", เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบชเบฐเป€เบžเบฒเบฐเบ—เบตเปˆเบ‚เป‰เบญเบเบžเบปเบšเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš Checkmarx. เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบ•เป‰เบญเบ‡ rack เบชเบฐโ€‹เบซเบกเบญเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบเปˆเบฝเบงโ€‹เบเบฑเบšโ€‹เบซเบผเบฒเบโ€‹เบšเบฑเบ™โ€‹เบซเบฒโ€‹เป€เบซเบผเบปเปˆเบฒโ€‹เบ™เบตเป‰. เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบžเบฝเบ‡เบžเปเปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™, เปเบฅเบฐเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบกเบฑเบ™เบเปเปˆเบเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™. เบ‚เป‰เบญเบเบซเบงเบฑเบ‡เบงเปˆเบฒเบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปเบฅเบฐเบเบฒเบ™เบ™เบญเบ™เบšเปเปˆเบซเบผเบฑเบšเบ‚เบญเบ‡เบ‚เป‰เบญเบเบˆเบฐเบšเปเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”, เปเบฅเบฐ "เบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบชเบนเบ”เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ—เบตเปˆเบเปเบฒเบซเบ™เบปเบ”เป€เบญเบ‡" เบ™เบตเป‰เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ›เบฐเบซเบเบฑเบ”เป€เบงเบฅเบฒเบชเบญเบ‡เบชเบฒเบกเบŠเบปเปˆเบงเป‚เบกเบ‡เบซเบผเบทเบชเบญเบ‡เบชเบฒเบกเบŠเบปเปˆเบงเป‚เบกเบ‡เบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™เบ›เบฐเบชเบฒเบ”. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™!

เบ‚เปเป‰เบกเบนเบ™เบ—เบปเปˆเบงเป„เบ›เบเปˆเบฝเบงเบเบฑเบšเบเบปเบ”เบฅเบฐเบšเบฝเบš

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบžเบทเป‰เบ™เบ–เบฒเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบ™เป‰เบญเบเปเบฅเบฐเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบเบปเบ”เบฅเบฐเบšเบฝเบš, เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ”เบตเบ‚เบถเป‰เบ™เบเปˆเบฝเบงเบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบˆเบฐเป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ•เปเปˆเป„เบ›. เปเบฅเบฐเบเป‰เบญเบ™เบงเปˆเบฒเป€เบญเบเบฐเบชเบฒเบ™เบšเปเปˆเป„เบ”เป‰เป€เบงเบปเป‰เบฒเบซเบเบฑเบ‡เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เบซเบผเบทเบ–เบทเบเป€เบœเบตเบเปเบœเปˆเบซเบผเบฒเบเปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเบชเบฐเบ”เบงเบเบซเบผเบฒเบ.

  1. เบเบปเบ”โ€‹เบฅเบฐโ€‹เบšเบฝเบšโ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เปƒเบ™โ€‹เบฅเบฐโ€‹เบซเบงเปˆเบฒเบ‡โ€‹เบเบฒเบ™โ€‹เบชเบฐโ€‹เปเบเบ™โ€‹เป‚เบ”เบโ€‹เบญเบตเบ‡โ€‹เปƒเบชเปˆโ€‹เบเบฒเบ™ preset เป€เบฅเบทเบญเบโ€‹เป„เบงเป‰โ€‹เปƒเบ™โ€‹เบ•เบญเบ™โ€‹เป€เบฅเบตเปˆเบกโ€‹เบ•เบปเป‰เบ™ (เบŠเบธเบ”โ€‹เบ‚เบญเบ‡โ€‹เบเบปเบ”โ€‹เบฅเบฐโ€‹เบšเบฝเบšโ€‹เบเบฒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹)โ€‹. เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบชเป‰เบฒเบ‡โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบšเปเปˆโ€‹เบˆเปเบฒโ€‹เบเบฑเบ” presets เป„เบ”เป‰โ€‹, เปเบฅเบฐโ€‹เปเบ™เปˆโ€‹เบ™เบญเบ™โ€‹เบงเปˆเบฒโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบˆเบฑเบ”โ€‹เป‚เบ„เบ‡โ€‹เบชเป‰เบฒเบ‡โ€‹เปƒเบซเป‰โ€‹เป€เบ‚เบปเบฒโ€‹เป€เบˆเบปเป‰เบฒโ€‹เปเบกเปˆเบ™โ€‹เบ‚เบถเป‰เบ™โ€‹เบเบฑเบšโ€‹เบชเบฐโ€‹เป€เบžเบฒเบฐโ€‹เบ‚เบญเบ‡โ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ—เปˆเบฒเบ™โ€‹. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบˆเบฑเบ”เบเบธเปˆเบกเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบ•เบฒเบกเบžเบฒเบชเบฒเบซเบผเบทเป€เบฅเบทเบญเบ presets เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเป‚เบ„เบ‡เบเบฒเบ™. เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบ„เบงเบฒเบกเป„เบงเปเบฅเบฐเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเปเบเบ™.

    เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ Crazyเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Preset เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Checkmarx

  2. เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ–เบทเบเปเบเป‰เป„เบ‚เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบžเบดเป€เบชเบ”เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒ CxAudit. เบ™เบตเป‰เปเบกเปˆเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ desktop เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเปƒเบŠเป‰ Checkmarx. เป€เบ„เบทเปˆเบญเบ‡โ€‹เบกเบทโ€‹เบ™เบตเป‰โ€‹เบกเบตโ€‹เบชเบญเบ‡โ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹เบเบฒเบ™โ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบ‡เบฒเบ™โ€‹: เบเบปเบ”โ€‹เบฅเบฐโ€‹เบšเบฝเบšโ€‹เบเบฒเบ™โ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบงเบดโ€‹เป€เบ„เบฒเบฐโ€‹เบœเบปเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบ‚เบญเบ‡ scan เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เปเบฅเป‰เบงโ€‹.

    เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ Crazyเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš CxAudit

  3. เบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบ™ Checkmarx เบ–เบทเบเปเบšเปˆเบ‡เบญเบญเบเป‚เบ”เบเบžเบฒเบชเบฒ, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เปเบ•เปˆเบฅเบฐเบžเบฒเบชเบฒเบกเบตเบŠเบธเบ”เบ„เปเบฒเบ–เบฒเบกเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡. เบเบฑเบ‡เบกเบตเบšเบฒเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบšเปเปˆเบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡เบžเบฒเบชเบฒ, เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบญเบฑเบ™เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบžเบทเป‰เบ™เบ–เบฒเบ™. เบชเปเบฒเบฅเบฑเบšเบชเปˆเบงเบ™เปƒเบซเบเปˆ, เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบžเบทเป‰เบ™เบ–เบฒเบ™เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบŠเบญเบเบซเบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบเบปเบ”เบฅเบฐเบšเบฝเบšเบญเบทเปˆเบ™เป†เปƒเบŠเป‰.

    เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ Crazyเบเบฒเบ™โ€‹เปเบšเปˆเบ‡โ€‹เบ›เบฑเบ™โ€‹เบฅเบฐโ€‹เบšเบฝเบšโ€‹เป‚เบ”เบโ€‹เบžเบฒโ€‹เบชเบฒโ€‹

  4. เบเบปเบ”เบฅเบฐเบšเบฝเบšเปเบกเปˆเบ™ "เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰" เปเบฅเบฐ "เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰" (เบ›เบฐเบ•เบดเบšเบฑเบ”เปเบฅเบฐเบšเปเปˆเป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”). เบšเปเปˆเปเบกเปˆเบ™เบŠเบทเปˆเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡, เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เปเบ•เปˆเบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบฑเบ™เป€เบ›เบฑเบ™. เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบฅเบธเปˆเบกเปเบกเปˆเบ™เบงเปˆเบฒเบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบš "เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰" เบˆเบฐเบ–เบทเบเบชเบฐเปเบ”เบ‡เบขเบนเปˆเปƒเบ™เบœเบปเบ™เบเบฒเบ™เบชเบฐเปเบเบ™เปƒเบ™ UI, เปเบฅเบฐเบเบปเบ”เบฅเบฐเบšเบฝเบš "เบšเปเปˆเบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰" เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปƒเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบญเบทเปˆเบ™เป† (เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบง, เบžเบฝเบ‡เปเบ•เปˆเบซเบ™เป‰เบฒเบ—เบตเปˆ).

    เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ Crazyเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบ›เบฐเป€เบžเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบ™เป€เบงเบฅเบฒเบชเป‰เบฒเบ‡

  5. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบซเบกเปˆเบซเบผเบทเป€เบชเบตเบก / เบ‚เบฝเบ™เปƒเบซเบกเปˆเบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง. เป€เบžเบทเปˆเบญเบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบซเบกเปˆ, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ•เบปเป‰เบ™เป„เบกเป‰, เบ„เบฅเบดเบเบ‚เบงเบฒเปเบฅเบฐเป€เบฅเบทเบญเบ "เบเบปเบเป€เบฅเบตเบ" เบˆเบฒเบเป€เบกเบ™เบนเป€เบฅเบทเปˆเบญเบ™เบฅเบปเบ‡. เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบˆเบทเปˆเบˆเปเบฒเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เบงเปˆเบฒเบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบซเบกเปˆเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™เปเบฅเบฐเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง. เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบ›เบตเบ”เปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เป€เบกเบ™เบน "Preset Manager" เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบกเบท. เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบ‚เบฝเบ™เบ„เบทเบ™เปƒเบซเบกเปˆเบเบฑเบ‡เบ„เบปเบ‡เบฎเบฑเบเบชเบฒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ–เป‰เบฒเบเบปเบ”เบฅเบฐเบšเบฝเบšเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง, เบกเบฑเบ™เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆเปเบฅเบฐเบˆเบฐเบ–เบทเบเบ™เปเบฒเป„เบ›เปƒเบŠเป‰เปƒเบ™เบ—เบฑเบ™เบ—เบต.

    เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ Crazyเบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบซเบกเปˆเปƒเบ™เบชเปˆเบงเบ™เบ•เบดเบ”เบ•เปเปˆ Preset Manager

  6. เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, "เบ•เบปเป‰เบ™เป„เบกเป‰" เบ‚เบญเบ‡เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเปเบกเปˆเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™, เป€เบŠเบดเปˆเบ‡เบ‚เบถเป‰เบ™เบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆ. เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเป€เบเบฑเบšเบเปเบฒเบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”, เปเบฅเบฐเบœเบนเป‰เบ—เบตเปˆเปƒเบŠเป‰เบกเบฑเบ™เบ—เบตเบชเบญเบ‡. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป„เบ”เป‰เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ–เป‰เบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เปเบ™เบงเบ™เบฑเป‰เบ™, เบ™เบตเป‰เบˆเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒเบเบฒเบ™เบชเบฐเปเบเบ™.

  7. เบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ•เปˆเบฒเบ‡เป†:

  • เบชเปเบฒเบฅเบฑเบšเบฅเบฐเบšเบปเบšเบ—เบฑเบ‡เบซเบกเบปเบ” - เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบฐเปเบเบ™เป‚เบ„เบ‡เบเบฒเบ™เปƒเบ”เป†

  • เปƒเบ™เบฅเบฐเบ”เบฑเบšเบ—เบตเบกเบ‡เบฒเบ™ (เบ—เบตเบกเบ‡เบฒเบ™) - เบžเบฝเบ‡เปเบ•เปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบชเบฐเปเบเบ™เป‚เบ„เบ‡เบเบฒเบ™เปƒเบ™เบ—เบตเบกเบ‡เบฒเบ™เบ—เบตเปˆเป€เบฅเบทเบญเบ.

  • เปƒเบ™เบฅเบฐเบ”เบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ - เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡

    เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ Crazyเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบฅเบฐเบ”เบฑเบšเบ—เบตเปˆเบเบปเบ”เบฅเบฐเบšเบฝเบšเบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰

"เบงเบฑเบ”เบˆเบฐเบ™เบฒเบ™เบธเบเบปเบก" เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™

เปเบฅเบฐเบ‚เป‰เบญเบเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบšเบฒเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เป‰เบญเบเบกเบตเบ„เปเบฒเบ–เบฒเบก, เปเบฅเบฐเบ‚เป‰เบญเบเบˆเบฐเบชเบฐเปเบ”เบ‡เป€เบ•เบฑเบเบ™เบดเบเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบŠเบตเบงเบดเบ”เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เบซเบผเบฒเบ.

เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ—เบตเปˆเบกเบตเบฅเบฒเบเบŠเบทเปˆ

- ะฒั‹ั‡ะธั‚ะฐะฝะธะต ะพะดะฝะพะณะพ ะธะท ะดั€ัƒะณะพะณะพ (list2 - list1)
* ะฟะตั€ะตัะตั‡ะตะฝะธะต ัะฟะธัะบะพะฒ (list1 * list2)
+ ัะปะพะถะตะฝะธะต ัะฟะธัะบะพะฒ (list1 + list2)

& (ะปะพะณะธั‡ะตัะบะพะต ะ˜) - ะพะฑัŠะตะดะธะฝัะตั‚ ัะฟะธัะบะธ ะฟะพ ัะพะฒะฟะฐะดะตะฝะธัŽ (list1 & list2), ะฐะฝะฐะปะพะณะธั‡ะฝะพ ะฟะตั€ะตัะตั‡ะตะฝะธัŽ (list1 * list2)
| (ะปะพะณะธั‡ะตัะบะพะต ะ˜ะ›ะ˜) - ะพะฑัŠะตะดะธะฝัะตั‚ ัะฟะธัะบะธ ะฟะพ ัˆะธั€ะพะบะพะผัƒ ะฟะพะธัะบัƒ (list1 | list2)

ะกะพ ัะฟะธัะบะฐะผะธ ะฝะต ั€ะฐะฑะพั‚ะฐะตั‚:  ^  &&  ||  %  / 

เบฅเบฒเบเบเบฒเบ™เบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™เบ—เบฑเบ‡เปเบปเบ”

เบžเบฒเบเปƒเบ™เบžเบฒเบชเบฒเบ—เบตเปˆเบชเบฐเปเบเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆ Checkmarx เป„เบ”เป‰เบเปเบฒเบ™เบปเบ” (เบชเบฐเบ•เบดเบ‡, เบซเบ™เป‰เบฒเบ—เบตเปˆ, เบซเป‰เบญเบ‡เบฎเบฝเบ™, เบงเบดเบ—เบตเบเบฒเบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†). เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฒเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป„เบ”เป‰เป‚เบ”เบเบœเปˆเบฒเบ™ All. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ„เบปเป‰เบ™เบซเบฒเบงเบฑเบ”เบ–เบธเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฐเป€เบžเบฒเบฐ searchMe, เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ„เบปเป‰เบ™โ€‹เบซเบฒโ€‹, เบเบปเบโ€‹เบ•เบปเบงโ€‹เบขเปˆเบฒเบ‡โ€‹, เป‚เบ”เบโ€‹เบŠเบทเปˆโ€‹เปƒเบ™โ€‹เบ—เบปเปˆเบงโ€‹เบงเบฑเบ”โ€‹เบ–เบธโ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ—เบตเปˆโ€‹เบžเบปเบšโ€‹เป€เบซเบฑเบ™โ€‹:

// ะขะฐะบะพะน ะทะฐะฟั€ะพั ะฒั‹ะดะฐัั‚ ะฒัะต ัะปะตะผะตะฝั‚ั‹
result = All;

// ะขะฐะบะพะน ะทะฐะฟั€ะพั ะฒั‹ะดะฐัั‚ ะฒัะต ัะปะตะผะตะฝั‚ั‹, ะฒ ะธะผะตะฝะธ ะบะพั‚ะพั€ั‹ั… ะฟั€ะธััƒั‚ัั‚ะฒัƒะตั‚ โ€œsearchMeโ€œ
result = All.FindByName("searchMe");

เปเบ•เปˆ, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ„เบปเป‰เบ™เบซเบฒเปƒเบ™เบžเบฒเบชเบฒเบญเบทเปˆเบ™, เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบฅเบงเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เบชเบฐเปเบเบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, groovy เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ Android), เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฐเบซเบเบฒเบเบžเบทเป‰เบ™เบ—เบตเปˆเบงเบฑเบ”เบ–เบธเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป‚เบ”เบเบœเปˆเบฒเบ™เบ•เบปเบงเปเบ›:

result = AllMembers.All.FindByName("searchMe");

เบŸเบฑเบ‡เบŠเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ Flow

เบŸเบฑเบ‡เบŠเบฑเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเปƒเบŠเป‰เปƒเบ™เบซเบผเบฒเบเบเบปเบ”เบฅเบฐเบšเบฝเบšเปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เป€เบญเบเบฐเบชเบฒเบ™ cheat เป€เบฅเบฑเบเบ™เป‰เบญเบเบ‚เบญเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบ‚เบปเบฒเบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ:

// ะšะฐะบะธะต ะดะฐะฝะฝั‹ะต second ะฒะปะธััŽั‚ ะฝะฐ first.
// ะ”ั€ัƒะณะธะผะธ ัะปะพะฒะฐะผะธ - ะขะž (second) ั‡ั‚ะพ ะฒะปะธัะตั‚ ะฝะฐ  ะœะ•ะะฏ (first).
result = first.DataInfluencedBy(second);

// ะšะฐะบะธะต ะดะฐะฝะฝั‹ะต first ะฒะปะธััŽั‚ ะฝะฐ second.
// ะ”ั€ัƒะณะธะผะธ ัะปะพะฒะฐะผะธ - ะฏ (first) ะฒะปะธััŽ ะฝะฐ ะขะž (second).
result = first.DataInfluencingOn(second);

เบเบณเบฅเบฑเบ‡เบฎเบฑเบšเบŠเบทเปˆ/เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡

เบกเบตเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบซเบผเบฒเบเบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบˆเบฒเบเบœเบปเบ™เบ‚เบญเบ‡เบเบฒเบ™เบชเบญเบšเบ–เบฒเบก (เบŠเบทเปˆเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบžเบปเบš, เบชเบฐเบ•เบดเบ‡, เปเบฅเบฐเบญเบทเปˆเบ™เป†), เปเบ•เปˆเป€เบญเบเบฐเบชเบฒเบ™เบšเปเปˆเป„เบ”เป‰เบšเบญเบเบงเบดเบ—เบตเบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบฅเบฐเบ™เปเบฒเปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบŠเบฑเบšเบชเบดเบ™ LinePragma เปเบฅเบฐเบงเบฑเบ”เบ–เบธเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบˆเบฐเบ•เบฑเป‰เบ‡เบขเบนเปˆเบžเบฒเบเปƒเบ™เบกเบฑเบ™:

// ะ”ะปั ะฟั€ะธะผะตั€ะฐ ะฝะฐะนะดะตะผ ะฒัะต ะผะตั‚ะพะดั‹
CxList methods = Find_Methods();

// ะ’ ะผะตั‚ะพะดะฐั… ะฝะฐะนะดะตะผ ะฟะพ ะธะผะตะฝะธ ะผะตั‚ะพะด scope
CxList scope = methods.FindByName("scope");

// ะขะฐะบะธะผ ะพะฑั€ะฐะทะพะผ ะผะพะถะพ ะฟะพะปัƒั‡ะธั‚ัŒ ะฟัƒั‚ัŒ ะบ ั„ะฐะนะปัƒ
string current_filename = scope.GetFirstGraph().LinePragma.FileName;

// ะ ะฒะพั‚ ั‚ะฐะบะธะผ - ัั‚ั€ะพะบัƒ, ะณะดะต ะฝะฐัˆะปะพััŒ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธะต
int current_line = scope.GetFirstGraph().LinePragma.Line;

// ะญั‚ะธ ะฟะฐั€ะฐะผะตั‚ั€ั‹ ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะฟะพ ั€ะฐะทะฝะพะผัƒ
// ะะฐะฟั€ะธะผะตั€ ะฟะพะปัƒั‡ะธั‚ัŒ ะฒัะต ะพะฑัŠะตะบั‚ั‹ ะฒ ั„ะฐะนะปะต
CxList inFile = All.FindByFileName(current_filename);

// ะ˜ะปะธ ะฝะฐะนั‚ะธ ั‡ั‚ะพ ะฟั€ะพะธัั…ะพะดะธั‚ ะฒ ะบะพะฝะบั€ะตั‚ะฝะพะน ัั‚ั€ะพะบะต
CxList inLine = inFile.FindByPosition(current_line);

เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเบฎเบฑเบเบชเบฒเบขเบนเปˆเปƒเบ™เปƒเบˆเบงเปˆเบฒ FileName เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเบกเบตเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เป„เบ›เบซเบฒเป„เบŸเบฅเปŒ, เป€เบžเบฒเบฐเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ GetFirstGraph.

เบœเบปเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹

เบกเบตเบ•เบปเบงเปเบ›เบžเบดเป€เบชเบ”เบžเบฒเบเปƒเบ™ CxQL result, เป€เบŠเบดเปˆเบ‡เบชเบปเปˆเบ‡เบœเบปเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบšเบฅเบฒเบเบฅเบฑเบเบญเบฑเบเบชเบญเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™. เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบ™เบ—เบฑเบ™เบ—เบตเปเบฅเบฐเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบฅเบฐเบ”เบฑเบšเบ›เบฒเบ™เบเบฒเบ‡เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™, เบ›เปˆเบฝเบ™เปเบ›เบ‡เปเบฅเบฐเบ›เบฑเบšเบ›เบธเบ‡เบžเบงเบเบกเบฑเบ™เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ. เปเบ•เปˆ, เบ–เป‰เบฒเบšเปเปˆเบกเบตเบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰เบ•เบปเบงเปเบ›เบ™เบตเป‰เบซเบผเบทเบซเบ™เป‰เบฒเบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบš returnโ€” เบœเบปเบ™โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบˆเบฐโ€‹เป€เบ›เบฑเบ™โ€‹เบชเบนเบ™โ€‹เบชเบฐโ€‹เป€เบซเบกเบตโ€‹เป„เบ›โ€‹.

เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบ•เปเปˆเป„เบ›เบ™เบตเป‰เบˆเบฐเบšเปเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™เบญเบฑเบ™เปƒเบ”เบญเบฑเบ™เปœเบถเปˆเบ‡เปƒเบซเป‰เบเบฑเบšเบžเบงเบเป€เบฎเบปเบฒเป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบ”เบณเป€เบ™เบตเบ™เบเบฒเบ™ เปเบฅเบฐเบˆเบฐเบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒเบชเบฐเป€เปเบต:

// ะะฐั…ะพะดะธะผ ัะปะตะผะตะฝั‚ั‹ foo
CxList libraries = All.FindByName("foo");

เปเบ•เปˆ, เป‚เบ”เบเป„เบ”เป‰เบกเบญเบšเบซเบกเบฒเบเบœเบปเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบซเป‰เบเบฑเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡ magic, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบซเบฑเบ™เบงเปˆเบฒเบเบฒเบ™เป€เบญเบตเป‰เบ™เบ™เบตเป‰เบเบฑเบšเบ„เบทเบ™เบกเบฒเบซเบฒเบžเบงเบเป€เบฎเบปเบฒ:

// ะะฐั…ะพะดะธะผ ัะปะตะผะตะฝั‚ั‹ foo
CxList libraries = All.FindByName("foo");

// ะ’ั‹ะฒะพะดะธะผ, ะบะฐะบ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒั‹ะฟะพะปะฝะตะฝะธั ะฟั€ะฐะฒะธะปะฐ
result = libraries

// ะ˜ะปะธ ะตั‰ะต ะบะพั€ะพั‡ะต
result = All.FindByName("foo");

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบญเบทเปˆเบ™เป†

เบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบ™ Checkmarx เบชเบฒเบกเบฒเบ”เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบกเบ›เบปเบเบเบฐเบ•เบด. เป€เบกเบทเปˆเบญเบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบš, เป€เบˆเบปเป‰เบฒเบญเบฒเบ”เบˆเบฐเปƒเบŠเป‰เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบญเบทเปˆเบ™เป†. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เป‚เบ—เบซเบฒเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ—เบธเบเบ„เบฑเป‰เบ‡, เบžเบฝเบ‡เปเบ•เปˆเป‚เบ—เบซเบฒเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™:

// ะŸะพะปัƒั‡ะฐะตะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒั‹ะฟะพะปะฝะตะฝะธั ะดั€ัƒะณะพะณะพ ะฟั€ะฐะฒะธะปะฐ
CxList methods = Find_Methods();

// ะ˜ั‰ะตะผ ะฒะฝัƒั‚ั€ะธ ะผะตั‚ะพะด foo. 
// ะ’ั‚ะพั€ะพะน ะฟะฐั€ะฐะผะตั‚ั€ false ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ะธั‰ะตะผ ะฑะตะท ั‡ัƒะฒัั‚ะฒะธั‚ะตะปัŒะฝะพัั‚ะธ ะบ ั€ะตะณะธัั‚ั€ัƒ
result = methods.FindByShortName("foo", false);

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฐเบซเบฑเบ”เบชเบฑเป‰เบ™เบฅเบปเบ‡เปเบฅเบฐเบซเบผเบธเบ”เบœเปˆเบญเบ™เป€เบงเบฅเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบšเบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ.

เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ

เบเบฒเบ™เบ•เบฑเบ”เป„เบกเป‰

เป€เบกเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบกเบท, เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบกเบฑเบ™เบเปเปˆเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ‚เบฝเบ™เบ„เปเบฒเบ–เบฒเบกเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป„เบ”เป‰เบ—เบฑเบ™เบ—เบตเปเบฅเบฐเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบ—เบปเบ”เบฅเบญเบ‡, เบžเบฐเบเบฒเบเบฒเบกเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบ•เบฑเบ”เป„เบกเป‰, เป€เบŠเบดเปˆเบ‡เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

// ะะฐั…ะพะดะธะผ ั‡ั‚ะพ-ั‚ะพ
CxList toLog = All.FindByShortName("log");

// ะคะพั€ะผะธั€ัƒะตะผ ัั‚ั€ะพะบัƒ ะธ ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฒ ะปะพะณ
cxLog.WriteDebugMessage (โ€œnumber of DOM elements =โ€ + All.Count);

เปเบ•เปˆเบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบžเบฝเบ‡เปเบ•เปˆเบเบญเบกเบฎเบฑเบšเป€เบ›เบฑเบ™เบเบฒเบ™เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™ เบชเบฒเบ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบฑเบ™เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบชเบฐเปเบ”เบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ„เบปเบšเบ–เป‰เบงเบ™เบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบžเบปเบšเป€เบซเบฑเบ™เป€เบ›เบฑเบ™เบœเบปเบ™เบกเบฒเบˆเบฒเบเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ„เบฑเป‰เบ‡เบ—เปเบฒเบญเบดเบ”. เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเบชเบญเบ‡, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ debugging, เปเบกเปˆเบ™เบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเปƒเบซเป‰เบ•เบปเบงเปเบ› magic เป€เบ›เบฑเบ™เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ„เบฒเบง result เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเปเบฅเบฐเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™. เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเบชเบฐเบ”เบงเบเบซเบผเบฒเบ; เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบšเปเปˆเบกเบตเบเบฒเบ™ overrides เบซเบผเบทเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบเบฑเบšเบ™เบตเป‰เปƒเบ™เบฅเบฐเบซเบฑเบ”เบซเบผเบฑเบ‡เบˆเบฒเบ. result เบซเบผเบทเบžเบฝเบ‡เปเบ•เปˆเบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰. เบซเบผเบทเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”, เป€เบŠเบฑเปˆเบ™เบ‚เป‰เบญเบ, เบฅเบทเบกเป€เบญเบปเบฒเบเบฒเบ™เป‚เบ—เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบญเบญเบเบซเบผเบฒเบเบ„เบฑเป‰เบ‡เบˆเบฒเบเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบเบฝเบกเบžเป‰เบญเบกเปเบฅเป‰เบง เปเบฅเบฐเบชเบปเบ‡เป„เบชเบงเปˆเบฒเป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบ.

เบงเบดเบ—เบตเบ—เบตเปˆเบชเบฐเบ”เบงเบเบเบงเปˆเบฒเปเบกเปˆเบ™เบเบฒเบ™เป‚เบ—เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™ return เบเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™. เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰, เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ‚เบญเบ‡โ€‹เบฅเบฐโ€‹เบšเบฝเบšโ€‹เบเบฒเบ™โ€‹เบˆเบฐโ€‹เบชเบดเป‰เบ™โ€‹เบชเบธเบ”โ€‹เบฅเบปเบ‡โ€‹เปเบฅเบฐโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป€เบšเบดเปˆเบ‡โ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เป€เบเบตเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹เป€เบ›เบฑเบ™โ€‹เบœเบปเบ™โ€‹เบ‚เบญเบ‡โ€‹เบชเบดเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เป„เบ”เป‰โ€‹เบ‚เบฝเบ™โ€‹เบงเปˆเบฒ:

// ะะฐั…ะพะดะธะผ ั‡ั‚ะพ-ั‚ะพ
CxList toLog = All.FindByShortName("log");

// ะ’ั‹ะฒะพะดะธะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒั‹ะฟะพะปะฝะตะฝะธั
return toLog

//ะ’ัะต, ั‡ั‚ะพ ะฝะฐะฟะธัะฐะฝะพ ะดะฐะปัŒัˆะต ะฝะต ะฑัƒะดะตั‚ ะฒั‹ะฟะพะปะฝะตะฝะพ
result = All.DataInfluencedBy(toLog)

เบšเบฑเบ™เบซเบฒเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš

เบกเบตเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบท CxAudit (เบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบš). เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เบกเบตเบซเบผเบฒเบเป€เบซเบ”เบœเบปเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เบตเป‰, เบฅเบงเบกเบ—เบฑเบ‡เบเบฒเบ™เบ‚เบฑเบ”เบ‚เป‰เบญเบ‡, เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡ Windows เบขเปˆเบฒเบ‡เบเบฐเบ—เบฑเบ™เบซเบฑเบ™, BSOD เปเบฅเบฐเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เบ„เบฒเบ”เป„เบงเป‰เบญเบทเปˆเบ™เป†เบ—เบตเปˆเป€เบเบตเบ™เบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบกเบตเบเบญเบ‡เบ›เบฐเบŠเบธเบกเบ—เบตเปˆเบšเปเปˆเบชเปเบฒเป€เบฅเบฑเบ”เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบดเปˆเบ‡เบ›เป‰เบญเบ‡เบเบฑเบ™เบšเปเปˆเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบกเบฑเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบซเบผเบฒเบ:

เบชเปเบฒเบฅเบฑเบš Checkmarx เบเปˆเบญเบ™ 8.6:

// ะŸั€ะพะฒะตั€ัะตะผ, ั‡ั‚ะพ ะตัั‚ัŒ ะทะฐะปะพะณะธะฝะตะฝั‹ะต ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะธ, ะฒั‹ะฟะพะปะฝะธะฒ ะทะฐะฟั€ะพั ะฒ ะ‘ะ”
SELECT COUNT(*) FROM [CxDB].[dbo].LoggedinUser WHERE [ClientType] = 6;
 
// ะ•ัะปะธ ั‡ั‚ะพ-ั‚ะพ ะตัั‚ัŒ, ะฐ ะฝะฐ ัะฐะผะพะผ ะดะตะปะต ะดะฐะถะต ะตัะปะธ ะธ ะฝะตั‚, ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะฒั‹ะฟะพะปะฝะธั‚ัŒ ะทะฐะฟั€ะพั
DELETE FROM [CxDB].[dbo].LoggedinUser WHERE [ClientType] = 6;

เบชเปเบฒเบฅเบฑเบš Checkmarx เบซเบผเบฑเบ‡เบˆเบฒเบ 8.6:

// ะŸั€ะพะฒะตั€ัะตะผ, ั‡ั‚ะพ ะตัั‚ัŒ ะทะฐะปะพะณะธะฝะตะฝั‹ะต ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะธ, ะฒั‹ะฟะพะปะฝะธะฒ ะทะฐะฟั€ะพั ะฒ ะ‘ะ”
SELECT COUNT(*) FROM LoggedinUser WHERE (ClientType = 'Audit');
 
// ะ•ัะปะธ ั‡ั‚ะพ-ั‚ะพ ะตัั‚ัŒ, ะฐ ะฝะฐ ัะฐะผะพะผ ะดะตะปะต ะดะฐะถะต ะตัะปะธ ะธ ะฝะตั‚, ะฟะพะฟั€ะพะฑะพะฒะฐั‚ัŒ ะฒั‹ะฟะพะปะฝะธั‚ัŒ ะทะฐะฟั€ะพั
DELETE FROM [CxDB].[dbo].LoggedinUser WHERE (ClientType = 'Audit');

เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบ‚เบฝเบ™

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเบกเบฒเบฎเบญเบ”เบชเปˆเบงเบ™เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบซเบผเบฒเบเบ—เบตเปˆเบชเบธเบ”. เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป€เบฅเบตเปˆเบกเบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบ™ CxQL, เบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบกเบฑเบเบˆเบฐเบ‚เบฒเบ”เปเบกเปˆเบ™เบšเปเปˆเบกเบตเป€เบญเบเบฐเบชเบฒเบ™เบซเบผเบฒเบเป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบกเบตเบŠเบตเบงเบดเบ”เบŠเบตเบงเบฒเปƒเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบšเบฒเบ‡เบขเปˆเบฒเบ‡เปเบฅเบฐเบญเบฐเบ—เบดเบšเบฒเบเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›.

เบ‚เป‰เบญเบเบˆเบฐเบžเบฐเบเบฒเบเบฒเบกเป€เบฎเบฑเบ”เปƒเบซเป‰เบŠเบตเบงเบดเบ”เบ‡เปˆเบฒเบเบ‚เบถเป‰เบ™เป€เบฅเบฑเบเบ™เป‰เบญเบเบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เป€เบฅเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบžเบฒเบชเบฒเปเบšเบšเบชเบญเบšเบ–เบฒเบกเปเบฅเบฐเปƒเบซเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปƒเบŠเป‰ Custom Queries เป€เบžเบทเปˆเบญเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบšเบฒเบ‡เบขเปˆเบฒเบ‡. เบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ—เบปเปˆเบงเป„เบ›เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบšเปเบฅเบดเบชเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เบ„เบปเบ™เบญเบทเปˆเบ™เปเบกเปˆเบ™เบชเบฐเป€เบžเบฒเบฐเบซเบผเบฒเบ, เปเบ•เปˆเบžเบงเบเป€เบ‚เบปเบฒเบเบฑเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบเบฒเบ™เบ›เปˆเบฝเบ™เบฅเบฐเบซเบฑเบ”เปƒเบซเป‰เป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ™เบตเป‰เปเบกเปˆเบ™เบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบžเบปเบšเป€เบฅเบทเป‰เบญเบเบ—เบตเปˆเบชเบธเบ”:

เปœเป‰เบฒ เบงเบฝเบ: เบกเบตเบซเบผเบฒเบ Flows เปƒเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบšเปเบฅเบฐเบซเบ™เบถเปˆเบ‡เปƒเบ™เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เบฎเบฑเบ‡เบ‚เบญเบ‡เบ„เบปเบ™เบญเบทเปˆเบ™, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบญเบญเบเบˆเบฒเบเบซเบ™เบถเปˆเบ‡เปƒเบ™เบ™เบฑเป‰เบ™.

เบเบฒเบ™เปเบเป‰เป„เบ‚: เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบšเบฒเบ‡เบ„เบฑเป‰เบ‡ Checkmarx เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบเบฒเบ™เป„เบซเบผเป€เบ‚เบปเป‰เบฒเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบญเบฒเบ”เบˆเบฐเบ—เบฑเบšเบŠเป‰เบญเบ™เบเบฑเบ™เปเบฅเบฐเป€เบ›เบฑเบ™เบชเบฐเบšเบฑเบšเบซเบเปเป‰เบ‚เบญเบ‡เบ„เบปเบ™เบญเบทเปˆเบ™. เบกเบตเบงเบดเบ—เบตเบเบฒเบ™เบžเบดเป€เบชเบ”เบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง เบซเบผเบธเบ”เบเบฐเปเบชเป„เบŸเบŸเป‰เบฒ. เบ‚เบถเป‰เบ™เบขเบนเปˆเบเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต, เบกเบฑเบ™เบˆเบฐเป€เบฅเบทเบญเบ Flow เบ—เบตเปˆเบชเบฑเป‰เบ™เบ—เบตเปˆเบชเบธเบ”เบซเบผเบทเบเบฒเบงเบ—เบตเปˆเบชเบธเบ”:

// ะžัั‚ะฐะฒะธั‚ัŒ ั‚ะพะปัŒะบะพ ะดะปะธะฝะฝั‹ะต Flow
result = result.ReduceFlow(CxList.ReduceFlowType.ReduceSmallFlow);

// ะžัั‚ะฐะฒะธั‚ัŒ ั‚ะพะปัŒะบะพ ะบะพั€ะพั‚ะบะธะต Flow
result = result.ReduceFlow(CxList.ReduceFlowType.ReduceBigFlow);

เปœเป‰เบฒ เบงเบฝเบ: เบ‚เบฐเบซเบเบฒเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบฅเบฐเบญเบฝเบ”เบญเปˆเบญเบ™เบ—เบตเปˆเป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ›เบฐเบ•เบดเบเบดเบฅเบดเบเบฒ

เบเบฒเบ™เปเบเป‰เป„เบ‚: Checkmarx เบกเบตเบเบปเบ”เบฅเบฐเบšเบฝเบšเบžเบทเป‰เบ™เบ–เบฒเบ™, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป‚เบ”เบเบเบฒเบ™เบชเบญเบšเบ–เบฒเบกเบญเบทเปˆเบ™เป†เบˆเปเบฒเบ™เบงเบ™เบซเบผเบฒเบ. เป‚เบ”เบเบเบฒเบ™เป€เบชเบตเบกเบšเบฒเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ”เป‰เบงเบเบ‚เปเป‰เบกเบนเบ™เบชเบฐเป€เบžเบฒเบฐเบเบฑเบšเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เบœเบปเบ™เบเบฒเบ™เบชเบฐเปเบเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰เบ—เบฑเบ™เบ—เบต. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™:

General_privacy_violation_list

เปƒเบซเป‰เป€เบžเบตเปˆเบกเบ•เบปเบงเปเบ›เบซเบผเบฒเบเบญเบฑเบ™เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบทเปˆเบญเป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบฅเบฐเบญเบฝเบ”เบญเปˆเบญเบ™:

// ะŸะพะปัƒั‡ะฐะตะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒั‹ะฟะพะปะฝะตะฝะธั ะฑะฐะทะพะฒะพะณะพ ะฟั€ะฐะฒะธะปะฐ
result = base.General_privacy_violation_list();

// ะ˜ั‰ะตะผ ัะปะตะผะตะฝั‚ั‹, ะบะพั‚ะพั€ั‹ะต ะฟะพะฟะฐะดะฐัŽั‚ ะฟะพะด ะฟั€ะพัั‚ั‹ะต ั€ะตะณัƒะปัั€ะฝั‹ะต ะฒั‹ั€ะฐะถะตะฝะธั. ะœะพะถะฝะพ ะดะพะฟะพะปะฝะธั‚ัŒ ั…ะฐั€ะฐะบั‚ะตั€ะฝั‹ะผะธ ะดะปั ะฒะฐั ะฟะฐั‚ั‚ะตั€ะฝะฐะผะธ.
CxList personalList = All.FindByShortNames(new List<string> {
	"*securityToken*", "*sessionId*"}, false);

// ะ”ะพะฑะฐะฒะปัะตะผ ะบ ะบะพะฝะตั‡ะฝะพะผัƒ ั€ะตะทัƒะปัŒั‚ะฐั‚ัƒ
result.Add(personalList);

เปœเป‰เบฒ เบงเบฝเบ: เบ‚เบฐเบซเบเบฒเบเบฅเบฒเบเบŠเบทเปˆเบ•เบปเบงเปเบ›เบ”เป‰เบงเบเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™

เบเบฒเบ™เปเบเป‰เป„เบ‚: เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ‚เปเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบ—เบฑเบ™เบ—เบตเป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบปเบ”เบฅเบฐเบšเบฝเบšเบžเบทเป‰เบ™เบ–เบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เปƒเบ™เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเป€เบžเบตเปˆเบกเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ‚เบญเบ‡เบŠเบทเปˆเบ•เบปเบงเปเบ›เบ—เบตเปˆเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบ—เบปเปˆเบงเป„เบ›เปƒเบ™เบšเปเบฅเบดเบชเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

password_privacy_violation_list

CxList allStrings = All.FindByType("String"); 
allStrings.Add(All.FindByType(typeof(StringLiteral))); 
allStrings.Add(Find_UnknownReference());
allStrings.Add(All.FindByType(typeof (Declarator)));
allStrings.Add(All.FindByType(typeof (MemberAccess)));
allStrings.Add(All.FindByType(typeof(EnumMemberDecl))); 
allStrings.Add(Find_Methods().FindByShortName("get*"));

// ะ”ะพะฟะพะปะฝัะตะผ ะดะตั„ะพะปั‚ะฝั‹ะน ัะฟะธัะพะบ ะฟะตั€ะตะผะตะฝะฝั‹ั…
List < string > pswdIncludeList = new List<string>{"*password*", "*psw", "psw*", "pwd*", "*pwd", "*authKey*", "pass*", "cipher*", "*cipher", "pass", "adgangskode", "benutzerkennwort", "chiffre", "clave", "codewort", "contrasena", "contrasenya", "geheimcode", "geslo", "heslo", "jelszo", "kennwort", "losenord", "losung", "losungswort", "lozinka", "modpas", "motdepasse", "parol", "parola", "parole", "pasahitza", "pasfhocal", "passe", "passord", "passwort", "pasvorto", "paswoord", "salasana", "schluessel", "schluesselwort", "senha", "sifre", "wachtwoord", "wagwoord", "watchword", "zugangswort", "PAROLACHIAVE", "PAROLA CHIAVE", "PAROLECHIAVI", "PAROLE CHIAVI", "paroladordine", "verschluesselt", "sisma",
                "pincode",
								"pin"};
								
List < string > pswdExcludeList = new List<string>{"*pass", "*passable*", "*passage*", "*passenger*", "*passer*", "*passing*", "*passion*", "*passive*", "*passover*", "*passport*", "*passed*", "*compass*", "*bypass*", "pass-through", "passthru", "passthrough", "passbytes", "passcount", "passratio"};

CxList tempResult = allStrings.FindByShortNames(pswdIncludeList, false);
CxList toRemove = tempResult.FindByShortNames(pswdExcludeList, false);
tempResult -= toRemove;
tempResult.Add(allStrings.FindByShortName("pass", false));

foreach (CxList r in tempResult)
{
	CSharpGraph g = r.data.GetByIndex(0) as CSharpGraph;
	if(g != null && g.ShortName != null && g.ShortName.Length < 50)
	{
		result.Add(r);
	}
}

เปœเป‰เบฒ เบงเบฝเบ: เป€เบžเบตเปˆเบกเบเบญเบšเบ—เบตเปˆเปƒเบŠเป‰เปเบฅเป‰เบงเบ—เบตเปˆเบšเปเปˆเบฎเบญเบ‡เบฎเบฑเบšเป‚เบ”เบ Checkmarx

เบเบฒเบ™เปเบเป‰เป„เบ‚: เบ„เปเบฒเบ–เบฒเบกเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™ Checkmarx เปเบกเปˆเบ™เปเบšเปˆเบ‡เบญเบญเบเบ•เบฒเบกเบžเบฒเบชเบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบžเบฒเบชเบฒ. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบšเบฒเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เบ–เป‰เบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ–เบทเบเปƒเบŠเป‰เบ—เบตเปˆเป€เบชเบตเบกเบซเบผเบทเบ›เปˆเบฝเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบžเบตเปˆเบกเป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบžเบทเป‰เบ™เบ–เบฒเบ™เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เบธเบเบ„เบปเบ™เบ—เบตเปˆเปƒเบŠเป‰เบกเบฑเบ™เบ—เบฑเบ™เบ—เบตเบˆเบฐเบฎเบฝเบ™เบฎเบนเป‰เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เปเบ™เบฐเบ™เปเบฒเปƒเบซเบกเปˆ. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš Android เปเบกเปˆเบ™ Timber เปเบฅเบฐ Loggi. เปƒเบ™เบŠเบธเบ”เบžเบทเป‰เบ™เบ–เบฒเบ™, เบšเปเปˆเบกเบตเบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป‚เบ—เบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™เบฅเบฐเบšเบปเบš, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ–เป‰เบฒเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบซเบผเบทเบ•เบปเบงเบฅเบฐเบšเบธเป€เบŠเบ”เบŠเบฑเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบšเบฑเบ™เบ—เบถเบ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบฎเบนเป‰เบเปˆเบฝเบงเบเบฑเบšเบกเบฑเบ™. เปƒเบซเป‰เบžเบฐเบเบฒเบเบฒเบกเป€เบžเบตเปˆเบกเบ„เปเบฒเบ™เบดเบเบฒเบกเบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปƒเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบš Checkmarx.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ”เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” Timber เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเบฑเบ™เบ—เบถเบ:

package com.death.timberdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import timber.log.Timber;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Timber.e("Error Message");
        Timber.d("Debug Message");

        Timber.tag("Some Different tag").e("And error message");
    }
}

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป Checkmarx, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบ„เปเบฒเบ™เบดเบเบฒเบกเบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เบซเบฒเบงเบดเบ—เบตเบเบฒเบ™ Timber เป€เบ›เบฑเบ™เบˆเบธเบ”เบญเบญเบเบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ:

FindAndroidOutputs

// ะŸะพะปัƒั‡ะฐะตะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒั‹ะฟะพะปะฝะตะฝะธั ะฑะฐะทะพะฒะพะณะพ ะฟั€ะฐะฒะธะปะฐ
result = base.Find_Android_Outputs();

// ะ”ะพะฟะพะปะฝัะตะผ ะฒั‹ะทะพะฒะฐะผะธ, ะบะพั‚ะพั€ั‹ะต ะฟั€ะธั…ะพะดัั‚ ะธะท ะฑะธะฑะปะธะพั‚ะตะบะธ Timber
CxList timber = All.FindByExactMemberAccess("Timber.*") +
    All.FindByShortName("Timber").GetMembersOfTarget();

// ะ”ะพะฑะฐะฒะปัะตะผ ะบ ะบะพะฝะตั‡ะฝะพะผัƒ ั€ะตะทัƒะปัŒั‚ะฐั‚ัƒ
result.Add(timber);

เปเบฅเบฐเบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เป€เบžเบตเปˆเบกเบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบเป‰เบ„เบฝเบ‡, เปเบ•เปˆเบญเบฑเบ™เบ™เบตเป‰เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เป‚เบ”เบเบเบปเบ‡เบเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš Android:

เบŠเบญเบเบซเบฒAndroidLog_Outputs

// ะŸะพะปัƒั‡ะฐะตะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒั‹ะฟะพะปะฝะตะฝะธั ะฑะฐะทะพะฒะพะณะพ ะฟั€ะฐะฒะธะปะฐ
result = base.Find_Android_Log_Outputs();

// ะ”ะพะฟะพะปะฝัะตะผ ะฒั‹ะทะพะฒะฐะผะธ, ะบะพั‚ะพั€ั‹ะต ะฟั€ะธั…ะพะดัั‚ ะธะท ะฑะธะฑะปะธะพั‚ะตะบะธ Timber
result.Add(
  All.FindByExactMemberAccess("Timber.*") +
  All.FindByShortName("Timber").GetMembersOfTarget()
);

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ–เป‰เบฒเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ Android เปƒเบŠเป‰ เบœเบนเป‰เบˆเบฑเบ”เบเบฒเบ™เบงเบฝเบ เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเปเบšเบš asynchronous, เบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเปเบˆเป‰เบ‡ Checkmarx เบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเบงเบดเบ—เบตเบเบฒเบ™เบฎเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบซเบ™เป‰เบฒเบงเบฝเบ. getInputData:

FindAndroidRead

// ะŸะพะปัƒั‡ะฐะตะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒั‹ะฟะพะปะฝะตะฝะธั ะฑะฐะทะพะฒะพะณะพ ะฟั€ะฐะฒะธะปะฐ
result = base.Find_Android_Read();

// ะ”ะพะฟะพะปะฝัะตะผ ะฒั‹ะทะพะฒะพะผ ั„ัƒะฝะบั†ะธะธ getInputData, ะบะพั‚ะพั€ะฐั ะธัะฟะพะปัŒะทัƒะตั‚ัั ะฒ WorkManager
CxList getInputData = All.FindByShortName("getInputData");

// ะ”ะพะฑะฐะฒะปัะตะผ ะบ ะบะพะฝะตั‡ะฝะพะผัƒ ั€ะตะทัƒะปัŒั‚ะฐั‚ัƒ
result.Add(getInputData.GetMembersOfTarget());

เปœเป‰เบฒ เบงเบฝเบ: เบเบณเบฅเบฑเบ‡เบŠเบญเบเบซเบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบฅเบฐเบญเบฝเบ”เบญเปˆเบญเบ™เปƒเบ™ plist เบชเบณเบฅเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ iOS

เบเบฒเบ™เปเบเป‰เป„เบ‚: iOS เบกเบฑเบเบˆเบฐเปƒเบŠเป‰เป„เบŸเบฅเปŒเบžเบดเป€เบชเบ”เบ—เบตเปˆเบกเบตเบ™เบฒเบกเบชเบฐเบเบธเบ™ .plist เป€เบžเบทเปˆเบญเบˆเบฑเบ”เป€เบเบฑเบšเบ•เบปเบงเปเบ› เปเบฅเบฐเบ„เปˆเบฒเบ•เปˆเบฒเบ‡เป†. เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™, เป‚เบ—เป€เบ„เบฑเบ™, เบเบฐเปเบˆ เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบฅเบฐเบญเบฝเบ”เบญเปˆเบญเบ™เบญเบทเปˆเบ™เป†เบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบšเปเปˆเปเบ™เบฐเบ™เปเบฒ, เบเป‰เบญเบ™เบงเปˆเบฒเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบเบฑเบ”เบญเบญเบเบˆเบฒเบเบญเบธเบ›เบฐเบเบญเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเปƒเบ”เป†.

เป„เบŸเบฅเปŒ Plist เบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ—เบตเปˆเบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™เบเบฑเบšเบ•เบฒเป€เบ›เบปเปˆเบฒ, เปเบ•เปˆเบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบเบฑเบš Checkmarx. เปƒเบซเป‰เบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบˆเบฐเบ„เบปเป‰เบ™เบซเบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบฅเบฐเบšเบญเบเบžเบงเบเป€เบฎเบปเบฒเบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบซเบผเบท tokens เบ–เบทเบเบเปˆเบฒเบงเป€เบ–เบดเบ‡เบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบเบญเบšเบกเบต token เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบšเปเบฅเบดเบเบฒเบ™ backend:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>DeviceDictionary</key>
	<dict>
		<key>phone</key>
		<string>iPhone 6s</string>
	</dict>
	<key>privatekey</key>
	<string>MIICXAIBAAKBgQCqGKukO1De7zhZj6+</string>
</dict>
</plist>

เปเบฅเบฐเบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx, เป€เบŠเบดเปˆเบ‡เบกเบตเบซเบผเบฒเบ nuances เบ—เบตเปˆเบ„เบงเบ™เบˆเบฐเบ–เบทเบเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเปƒเบ™เป€เบงเบฅเบฒเบ‚เบฝเบ™:

// ะ˜ัะฟะพะปัŒะทัƒะตะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฒั‹ะฟะพะปะฝะตะฝะธั ะฟั€ะฐะฒะธะปะฐ ะฟะพ ะฟะพะธัะบัƒ ั„ะฐะนะปะพะฒ plist, ั‡ั‚ะพะฑั‹ ัƒะผะตะฝัŒัˆะธั‚ัŒ ะฒั€ะตะผั ั€ะฐะฑะพั‚ั‹ ะฟั€ะฐะฒะธะปะฐ ะธ 
CxList plist = Find_Plist_Elements();

// ะ˜ะฝะธั†ะธะฐะปะธะทะธั€ัƒะตะผ ะฝะพะฒัƒัŽ ะฟะตั€ะตะผะตะฝะฝัƒัŽ
CxList dictionarySettings = All.NewCxList();

// ะขะตะฟะตั€ัŒ ะดะพะฑะฐะฒะธะผ ะฟะพะธัะบ ะฒัะตั… ะธะฝั‚ะตั€ะตััƒัŽั‰ะธั… ะฝะฐั ะทะฝะฐั‡ะตะฝะธะน. ะ’ ะดะฐะปัŒะฝะตะนัˆะตะผ ะผะพะถะฝะพ ั€ะฐััˆะธั€ัั‚ัŒ ัั‚ะพั‚ ัะฟะธัะพะบ.
// ะ”ะปั ะฟะพะธัะบะฐ ะทะฝะฐั‡ะตะฝะธะน, ะบะฐะบ ะฝะธ ัั‚ั€ะฐะฝะฝะพ, ะธัะฟะพะปัŒะทัƒะตั‚ัั FindByMemberAccess - ะฟะพะธัะบ ะพะฑั€ะฐั‰ะตะฝะธะน ะบ ะผะตั‚ะพะดะฐะผ. ะ’ั‚ะพั€ะพะน ะฟะฐั€ะฐะผะตั‚ั€ ะฒะฝัƒั‚ั€ะธ ั„ัƒะฝะบั†ะธะธ, false, ะพะทะฝะฐั‡ะฐะตั‚, ั‡ั‚ะพ ะฟะพะธัะบ ะฝะตั‡ัƒะฒัั‚ะฒะธั‚ะตะปะตะฝ ะบ ั€ะตะณะธัั‚ั€ัƒ
dictionarySettings.Add(plist.FindByMemberAccess("privatekey", false));
dictionarySettings.Add(plist.FindByMemberAccess("privatetoken", false));

// ะ”ะปั ะบะพั€ั€ะตะบั‚ะฝะพะณะพ ะฟะพะธัะบะฐ ะธะท-ะทะฐ ะพัะพะฑะตะฝะฝะพัั‚ะตะน ัั‚ั€ัƒะบั‚ัƒั€ั‹ plist - ะฝัƒะถะฝะพ ะธัะบะฐั‚ัŒ ะฟะพ ั‚ะธะฟัƒ "If statement"
CxList ifStatements = plist.FindByType(typeof(IfStmt));

// ะ”ะพะฑะฐะฒะปัะตะผ ะฒ ั€ะตะทัƒะปัŒั‚ะฐั‚, ะฟะตั€ะตะด ัั‚ะธะผ ะฟะพะปัƒั‡ะธะฒ ั€ะพะดะธั‚ะตะปัŒัะบะธะน ัƒะทะตะป - ะดะปั ะฟั€ะฐะฒะธะปัŒะฝะพะณะพ ะพั‚ะพะฑั€ะฐะถะตะฝะธั
result = dictionarySettings.FindByFathers(ifStatements);

เปœเป‰เบฒ เบงเบฝเบ: เบŠเบญเบเบซเบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบ™ XML

เบเบฒเบ™เปเบเป‰เป„เบ‚: Checkmarx เบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบฐเบ”เบงเบเบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš XML เปเบฅเบฐเบเบฒเบ™เบŠเบญเบเบซเบฒเบ„เบธเบ™เบ„เปˆเบฒ, tags, เบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเปเบฅเบฐเบญเบทเปˆเบ™เป†. เปเบ•เปˆ, เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบกเบตเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบ•เบปเบงเบขเปˆเบฒเบ‡เบ”เบฝเบงเป€เบฎเบฑเบ”เบงเบฝเบ. เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเบฅเบปเบšเบฅเป‰เบฒเบ‡เปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™เบชเบฐเบšเบฑเบšเบซเบฅเป‰เบฒเบชเบธเบ”, เบˆเบปเปˆเบ‡เบฅเบฐเบกเบฑเบ”เบฅเบฐเบงเบฑเบ‡เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰เป€เบญเบเบฐเบชเบฒเบ™เบชเบฐเบšเบฑเบšเบเปˆเบญเบ™เบซเบ™เป‰เบฒ.

เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบˆเบฒเบเป€เบญเบเบฐเบชเบฒเบ™:

// ะšะพะด ั€ะฐะฑะพั‚ะฐั‚ัŒ ะฝะต ะฑัƒะดะตั‚
result = All.FindXmlAttributesByNameAndValue("*.app", 8, โ€œidโ€, "error- section", false, true);

เป€เบ›เบฑเบ™เบœเบปเบ™เบกเบฒเบˆเบฒเบเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบ›เบฐเบ•เบดเบšเบฑเบ”, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆ All เบšเปเปˆเบกเบตเบงเบดเบ—เบตเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง ... เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบˆเบดเบ‡, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบตเบžเบทเป‰เบ™เบ—เบตเปˆเบงเบฑเบ”เบ–เบธเบžเบดเป€เบชเบ”เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš XML - cxXPath. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบ„เปเบฒเบ–เบฒเบกเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเปƒเบ™ Android เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™ HTTP:

// ะŸั€ะฐะฒะธะปัŒะฝั‹ะน ะฒะฐั€ะธะฐะฝั‚ ั ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะตะผ cxXPath
result = cxXPath.FindXmlAttributesByNameAndValue("*.xml", 8, "cleartextTrafficPermitted", "true", false, true);

เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบกเบฑเบ™เปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบฅเบฑเบเบ™เป‰เบญเบ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ syntax เบชเปเบฒเบฅเบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ—เบตเปˆเบ—เปˆเบฒเบ™เป„เบ”เป‰เบ„เบดเบ”เบญเบญเบเบซเบ™เบถเปˆเบ‡, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฅเบทเบญเบเบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเบ•เบฒเบกเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™:

  • "*.xml"- เบซเบ™เป‰เบฒเบเบฒเบเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบˆเบฐเบŠเบญเบเบซเบฒ

  • 8 โ€” id เบ‚เบญเบ‡เบžเบฒเบชเบฒเบ—เบตเปˆเปƒเบŠเป‰เบเบปเบ”เบฅเบฐเบšเบฝเบš

  • "cleartextTrafficPermitted"- เบŠเบทเปˆเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เปƒเบ™ xml

  • "true" โ€” เบ„เบธเบ™โ€‹เบ„เปˆเบฒโ€‹เบ‚เบญเบ‡โ€‹เบ„เบธเบ™โ€‹เบชเบปเบกโ€‹เบšเบฑเบ”โ€‹เบ™เบตเป‰โ€‹

  • false โ€” เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบชเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ›เบปเบโ€‹เบเบฐโ€‹เบ•เบดโ€‹เปƒเบ™โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ—เบตเปˆโ€‹เบŠเบญเบโ€‹เบซเบฒโ€‹

  • true โ€” เบซเบกเบฒเบโ€‹เบ„เบงเบฒเบกโ€‹เบงเปˆเบฒโ€‹เบเบฒเบ™โ€‹เบ„เบปเป‰เบ™โ€‹เบซเบฒโ€‹เบˆเบฐโ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบเบฒเบ™โ€‹เบฅเบฐโ€‹เป€เบฅเบตเบโ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹, เบ™เบฑเป‰เบ™โ€‹เปเบกเปˆเบ™โ€‹, case-insensitiveโ€‹

เป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบŠเป‰เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบฅเบฐเบšเบธเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡, เบˆเบฒเบเบˆเบธเบ”เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบ—เบฑเบ”เบชเบฐเบ™เบฐ, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบ„เบทเบญเบ‚เปˆเบฒเบเปƒเบ™ Android เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป‚เบ”เบเบœเปˆเบฒเบ™ HTTP protocol. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” cleartextTrafficPermitted เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ„เบงเบฒเบกโ€‹เบซเบกเบฒเบโ€‹ true:

<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
        <domain-config cleartextTrafficPermitted="true">
            <domain includeSubdomains="true">secure.example.com</domain>
        </domain-config>
    </domain-config>
</network-security-config>

เปœเป‰เบฒ เบงเบฝเบ: เบˆเปเบฒเบเบฑเบ”เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป‚เบ”เบเบŠเบทเปˆเป„เบŸเบฅเปŒ / เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡

เบเบฒเบ™เปเบเป‰เป„เบ‚: เปƒเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบกเบทเบ–เบทเบชเปเบฒเบฅเบฑเบš Android, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบžเบปเบšเบ‚เปเป‰เบ”เบตเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ obfuscation. เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบเบปเบ”เบฅเบฐเบšเบฝเบšเบญเบญเบเบˆเบฒเบเบ›เปˆเบญเบ‡เบŠเบญเบเบซเบฒเบขเบนเปˆเปƒเบ™เป„เบŸเบฅเปŒ build.gradle เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ—เบตเปˆเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบปเบ”เบฅเบฐเบšเบฝเบš obfuscation เบชเปเบฒเบฅเบฑเบšเบชเบฐเบšเบฑเบšเบ›เปˆเบญเบเบ‚เบญเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ.

เปเบ•เปˆเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบกเบตเป„เบŸเบฅเปŒเป€เบ”เบฑเบเบ™เป‰เบญเบ build.gradle, เป€เบŠเบดเปˆเบ‡เบซเบกเบฒเบเป€เบ–เบดเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบฅเบงเบกเบขเบนเปˆเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™. peculiarity เปเบกเปˆเบ™เบงเปˆเบฒเป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเป„เบŸเบฅเปŒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ obfuscation, เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เป€เบญเบเบฐเบชเบฒเบ™เบ›เบฐเบเบญเบšเบžเปเปˆเปเบกเปˆเบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบฅเบงเบšเบฅเบงเบก.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบงเบฝเบเบ‡เบฒเบ™เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ•เบฑเบ” triggers เปƒเบ™เป„เบŸเบฅเปŒเป€เบ”เบฑเบเบ™เป‰เบญเบเบ—เบตเปˆเป€เบ›เบฑเบ™เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”. เบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบ–เบทเบเบเปเบฒเบ™เบปเบ”เป‚เบ”เบเบเบฒเบ™เบกเบตเบชเบฒเบ apply 'com.android.library'.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ”เบˆเบฒเบเป„เบŸเบฅเปŒ build.gradle, เป€เบŠเบดเปˆเบ‡เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบชเปเบฒเบฅเบฑเบš obfuscation:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.2"
    defaultConfig {
        ...
    }

    buildTypes {
        release {
            minifyEnabled true
            ...
        }
    }
}

dependencies {
  ...
}

เบ•เบปเบงเบขเปˆเบฒเบ‡เป„เบŸเบฅเปŒ build.gradle เบชเปเบฒเบฅเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบฅเบงเบกเบขเบนเปˆเปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ™เบตเป‰:

apply plugin: 'android-library'

dependencies {
  compile 'com.android.support:support-v4:18.0.+'
}

android {
  compileSdkVersion 14
  buildToolsVersion '17.0.0'
  ...
}

เปเบฅเบฐเบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx:

ProGuardObfuscation เบšเปเปˆเปƒเบŠเป‰

// ะŸะพะธัะบ ะผะตั‚ะพะดะฐ release ัั€ะตะดะธ ะฒัะตั… ะผะตั‚ะพะดะพะฒ ะฒ Gradle ั„ะฐะนะปะฐั…
CxList releaseMethod = Find_Gradle_Method("release");

// ะ’ัะต ะพะฑัŠะตะบั‚ั‹ ะธะท ั„ะฐะนะปะพะฒ build.gradle
CxList gradleBuildObjects = Find_Gradle_Build_Objects();

// ะŸะพะธัะบ ั‚ะพะณะพ, ั‡ั‚ะพ ะฝะฐั…ะพะดะธั‚ัั ะฒะฝัƒั‚ั€ะธ ะผะตั‚ะพะดะฐ "release" ัั€ะตะดะธ ะฒัะตั… ะพะฑัŠะตะบั‚ะพะฒ ะธะท ั„ะฐะนะปะพะฒ build.gradle
CxList methodInvokesUnderRelease = gradleBuildObjects.FindByType(typeof(MethodInvokeExpr)).GetByAncs(releaseMethod);

// ะ˜ั‰ะตะผ ะฒะฝัƒั‚ั€ะธ gradle-ั„ะฐะนะปะพะฒ ัั‚ั€ะพะบัƒ "com.android.library" - ัั‚ะพ ะทะฝะฐั‡ะธั‚, ั‡ั‚ะพ ะดะฐะฝะฝั‹ะน ั„ะฐะนะป ะพั‚ะฝะพัะธั‚ัั ะบ ะฑะธะฑะปะธะพั‚ะตะบะต ะธ ะตะณะพ ะฝะตะพะฑั…ะพะดะธะผะพ ะธัะบะปัŽั‡ะธั‚ัŒ ะธะท ะฟั€ะฐะฒะธะปะฐ
CxList android_library = gradleBuildObjects.FindByName("com.android.library");

// ะ˜ะฝะธั†ะธะฐะปะธะทะฐั†ะธั ะฟัƒัั‚ะพะณะพ ะผะฐััะธะฒะฐ
List<string> libraries_path = new List<string> {};

// ะŸั€ะพั…ะพะดะธะผ ั‡ะตั€ะตะท ะฒัะต ะฝะฐะนะดะตะฝะฝั‹ะต "ะดะพั‡ะตั€ะฝะธะต" ั„ะฐะนะปั‹
foreach(CxList library in android_library)
{
    // ะŸะพะปัƒั‡ะฐะตะผ ะฟัƒั‚ัŒ ะบ ะบะฐะถะดะพะผัƒ ั„ะฐะนะปัƒ
	string file_name_library = library.GetFirstGraph().LinePragma.FileName;
    
    // ะ”ะพะฑะฐะฒะปัะตะผ ะตะณะพ ะฒ ะฝะฐัˆ ะผะฐััะธะฒ
	libraries_path.Add(file_name_library);
}

// ะ˜ั‰ะตะผ ะฒัะต ะฒั‹ะทะพะฒั‹ ะฒะบะปัŽั‡ะตะฝะธั ะพะฑั„ัƒัะบะฐั†ะธะธ ะฒ ั€ะตะปะธะทะฝั‹ั… ะฝะฐัั‚ั€ะพะนะบะฐั…
CxList minifyEnabled = methodInvokesUnderRelease.FindByShortName("minifyEnabled");

// ะŸะพะปัƒั‡ะฐะตะผ ะฟะฐั€ะฐะผะตั‚ั€ั‹ ัั‚ะธั… ะฒั‹ะทะพะฒะพะฒ
CxList minifyValue = gradleBuildObjects.GetParameters(minifyEnabled, 0);

// ะ˜ั‰ะตะผ ัั€ะตะดะธ ะฝะธั… ะฒะบะปัŽั‡ะตะฝะฝั‹ะต
CxList minifyValueTrue = minifyValue.FindByShortName("true");

// ะะตะผะฝะพะณะพ ะผะฐะณะธะธ, ะตัะปะธ ะฝะต ะฝะฐัˆะปะธ ัั‚ะฐะฝะดะฐั€ั‚ะฝั‹ะผ ัะฟะพัะพะฑะพะผ :D
if (minifyValueTrue.Count == 0) {
	minifyValue = minifyValue.FindByAbstractValue(abstractValue => abstractValue is TrueAbstractValue);
} else {
    // ะ ะตัะปะธ ะฒัั‘-ั‚ะฐะบะธ ะฝะฐัˆะปะธ, ั‚ะพ ะฟั€ะตะดั‹ะดัƒั‰ะธะน ั€ะตะทัƒะปัŒั‚ะฐั‚ ะธ ะพัั‚ะฐะฒะปัะตะผ
	minifyValue = minifyValueTrue;	
}

// ะ•ัะปะธ ะฝะต ะฝะฐัˆะปะพััŒ ั‚ะฐะบะธั… ะผะตั‚ะพะดะพะฒ
if (minifyValue.Count == 0)
{
    // ะ”ะปั ะฑะพะปะตะต ะบะพั€ั€ะตะบั‚ะฝะพะณะพ ะพั‚ะพะฑั€ะฐะถะตะฝะธั ะผะตัั‚ะฐ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธั ะฒ ั„ะฐะนะปะต ะธั‰ะตะผ ะธะปะธ buildTypes ะธะปะธ android
	CxList tempResult = All.NewCxList();
	CxList buildTypes = Find_Gradle_Method("buildTypes");
	if (buildTypes.Count > 0) {
		tempResult = buildTypes;
	} else {
		tempResult = Find_Gradle_Method("android");
	}
	
	// ะ”ะปั ะบะฐะถะดะพะณะพ ะธะท ะฝะฐะนะดะตะฝะฝั‹ั… ะผะตัั‚ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธั ะฟั€ะพั…ะพะดะธะผ ะธ ะพะฟั€ะตะดะตะปัะตะผ, ะดะพั‡ะตั€ะฝะธะน ะธะปะธ ะพัะฝะพะฒะฝะพะน ั„ะฐะนะปั‹ ัะฑะพั€ะบะธ
	foreach(CxList res in tempResult)
	{
        // ะžะฟั€ะตะดะตะปัะตะผ, ะฒ ะบะฐะบะพะผ ั„ะฐะนะปะต ะฑั‹ะป ะฝะฐะนะดะตะฝ buildType ะธะปะธ android ะผะตั‚ะพะดั‹
		string file_name_result = res.GetFirstGraph().LinePragma.FileName;
        
        // ะ•ัะปะธ ั‚ะฐะบะพะณะพ ั„ะฐะนะปะฐ ะฝะตั‚ ะฒ ะฝะฐัˆะตะผ ัะฟะธัะบะต "ะดะพั‡ะตั€ะฝะธั…" ั„ะฐะนะปะพะฒ - ะทะฝะฐั‡ะธั‚ ัั‚ะพ ะพัะฝะพะฒะฝะพะน ั„ะฐะนะป ะธ ะตะณะพ ะผะพะถะฝะพ ะดะพะฑะฐะฒะธั‚ัŒ ะฒ ั€ะตะทัƒะปัŒั‚ะฐั‚
		if (libraries_path.Contains(file_name_result) == false){
			result.Add(res);
		}
	}
}

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ—เบปเปˆเบงเป„เบ›เปเบฅเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ Android, เปเบ•เปˆเบเบฑเบ‡เบชเปเบฒเบฅเบฑเบšเบเปเบฅเบฐเบ™เบตเบญเบทเปˆเบ™เป†เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบงเปˆเบฒเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป€เบ›เบฑเบ™เบ‚เบญเบ‡เป„เบŸเบฅเปŒเบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡.

เปœเป‰เบฒ เบงเบฝเบ: เป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเบชเบฒเบกเบ–เป‰เบฒ syntax เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆ

เบเบฒเบ™เปเบเป‰เป„เบ‚: เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเบญเบšเบ•เปˆเบฒเบ‡เป†เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบญเบญเบเบˆเบฒเบเบ•เบฒเบ•เบฐเบฅเบฒเบ‡. เปเบ™เปˆเบ™เบญเบ™, Checkmarx เบšเปเปˆเบชเบฐเป€เบซเบกเบตเบฎเบนเป‰เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบกเบตเบขเบนเปˆเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ, เปเบฅเบฐเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบชเบญเบ™เบกเบฑเบ™เปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบชเบฐเป€เบžเบฒเบฐเบ‚เบญเบ‡เบเบญเบšเบ™เบตเป‰. เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบชเบฑเบšเบชเบปเบ™เป‚เบ”เบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบเบญเบšเปƒเบŠเป‰เบŠเบทเปˆเบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบžเบปเบšเป€เบฅเบทเป‰เบญเบเบซเบผเบฒเบเปเบฅเบฐเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบชเปเบฒเบžเบฑเบ™เบ‚เบญเบ‡เบเบฒเบ™เป‚เบ—เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบชเบฐเป€เบžเบฒเบฐ.

เบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเปเบกเปˆเบ™เบงเปˆเบฒ syntax เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบฎเบฑเบšเบฎเบนเป‰เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡เปเบฅเบฐเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบ—เบปเบ”เบฅเบญเบ‡เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เป„เบ”เป‰เบฎเบฑเบšเบˆเปเบฒเบ™เบงเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ‚เบญเบ‡เบœเบปเบ™เบšเบงเบเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. เบกเบตเบซเบผเบฒเบเบ—เบฒเบ‡เป€เบฅเบทเบญเบเป€เบžเบทเปˆเบญเบ›เบฑเบšเบ›เบธเบ‡เบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบชเบฐเปเบเบ™เปเบฅเบฐเปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒ:

  • เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เปเบฒเบญเบดเบ”, เบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เปเบ™เปˆเบ™เบญเบ™เบงเปˆเบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบชเบฐเป€เบžเบฒเบฐเปƒเบ”เบซเบ™เบถเปˆเบ‡เปเบฅเบฐเบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบเบปเบ”เบฅเบฐเบšเบฝเบšเปƒเบ™เบฅเบฐเบ”เบฑเบšเบ—เบตเบกเบ‡เบฒเบ™. เปเบ•เปˆเบ–เป‰เบฒเบ—เบตเบกเบ‡เบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เบงเบดเบ—เบตเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบทเปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบซเบผเบฒเบเบšเปˆเบญเบ™เบ—เบตเปˆเบŠเบทเปˆเบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบฑเบšเบŠเป‰เบญเบ™เบเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป„เบ”เป‰เบฎเบฑเบšเบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบšเปเปˆเบซเบ™เป‰เบฒเบžเปเปƒเบˆเบ‚เบญเบ‡เบœเบปเบ™เบšเบงเบเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบ.

  • เบ—เบฒเบ‡โ€‹เป€เบฅเบทเบญเบโ€‹เบ—เบตเปˆโ€‹เบชเบญเบ‡โ€‹เปเบกเปˆเบ™โ€‹เบเบฒเบ™โ€‹เบ„เบปเป‰เบ™โ€‹เบซเบฒโ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เป„เบŸเบฅโ€‹เปŒโ€‹เบ—เบตเปˆโ€‹เบซเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบธเบ”โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบ™เปเบฒโ€‹เป€เบ‚เบปเป‰เบฒโ€‹เบขเปˆเบฒเบ‡โ€‹เบˆเบฐโ€‹เปเบˆเป‰เบ‡โ€‹. เบ”เป‰เบงเบเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบกเปˆเบ™เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡เปƒเบ™เป„เบŸเบฅเปŒเบ™เบตเป‰.

  • เปเบฅเบฐเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเบชเบฒเบกเปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบชเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เบฎเปˆเบงเบกเบเบฑเบ™.

เป€เบ›เบฑเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฝเบ‡เปƒเบ™เบงเบปเบ‡เปเบ„เบš เบฅเปˆเบญเบ‡ เบชเปเบฒเบฅเบฑเบšเบžเบฒเบชเบฒเบเบฒเบ™เบ‚เบฝเบ™เป‚เบ›เบฅเปเบเบฅเบก Scala, เบ„เบท, เบซเบ™เป‰เบฒเบ—เบตเปˆ Splicing เบ„เปˆเบฒเบ•เบปเบงเบซเบ™เบฑเบ‡เบชเบท. เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เป€เบžเบทเปˆเบญเบœเปˆเบฒเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเป„เบ›เบซเบฒเบ„เปเบฒเบ–เบฒเบก SQL, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ $, เป€เบŠเบดเปˆเบ‡เบ—เบปเบ”เปเบ—เบ™เบ‚เปเป‰เบกเบนเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ SQL query เบ—เบตเปˆเป„เบ”เป‰เบเปเบฒเบ™เบปเบ”เป„เบงเป‰เบเปˆเบญเบ™. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡, เบกเบฑเบ™เปเบกเปˆเบ™เบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบšเป‚เบ”เบเบเบปเบ‡เบ‚เบญเบ‡เบ„เปเบฒเบ–เบฐเปเบซเบผเบ‡เบ—เบตเปˆเบเบฐเบเบฝเบกเปƒเบ™ Java. เปเบ•เปˆ, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เปเบšเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเปเบšเบšเบชเบญเบšเบ–เบฒเบก SQL, เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบœเปˆเบฒเบ™เบŠเบทเปˆเบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™. #$, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบ—เบปเบ”เปเบ—เบ™เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบเบปเบ‡เป€เบ‚เบปเป‰เบฒเปƒเบ™ query (เป€เบเบทเบญเบšเบ„เบทเบเบฑเบš string concatenation).

เบฅเบฐเบซเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡:

// ะ’ ะพะฑั‰ะตะผ ัะปัƒั‡ะฐะต - ะทะฝะฐั‡ะตะฝะธั, ะบะพะฝั‚ั€ะพะปะธั€ัƒะตะผั‹ะต ะฟะพะปัŒะทะพะฒะฐั‚ะตะปะตะผ
val table = "coffees"
sql"select * from #$table where name = $name".as[Coffee].headOption

Checkmarx เบเบฑเบ‡เบšเปเปˆเบ—เบฑเบ™เบฎเบนเป‰เบงเบดเบ—เบตเบเบฒเบ™เบเบงเบ”เบžเบปเบšเบเบฒเบ™เปƒเบŠเป‰ Splicing Literal Values โ€‹โ€‹โ€‹โ€‹เปเบฅเบฐ skip operators #$, เบชเบฐเบ™เบฑเป‰เบ™เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบžเบฐเบเบฒเบเบฒเบกเบชเบญเบ™เบกเบฑเบ™เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบชเบฑเบเบขเบฒ SQL เบ—เบตเปˆเบกเบตเบ—เปˆเบฒเปเบฎเบ‡เปเบฅเบฐเป€เบ™เบฑเป‰เบ™เปƒเบชเปˆเบชเบฐเบ–เบฒเบ™เบ—เบตเปˆเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™เบฅเบฐเบซเบฑเบ”:

// ะะฐั…ะพะดะธะผ ะฒัะต ะธะผะฟะพั€ั‚ั‹
CxList imports = All.FindByType(typeof(Import));

// ะ˜ั‰ะตะผ ะฟะพ ะธะผะตะฝะธ, ะตัั‚ัŒ ะปะธ ะฒ ะธะผะฟะพั€ั‚ะฐั… slick
CxList slick = imports.FindByShortName("slick");

// ะะตะบะพั‚ะพั€ั‹ะน ั„ะปะฐะณ, ะพะฟั€ะตะดะตะปััŽั‰ะธะน, ั‡ั‚ะพ ะธะผะฟะพั€ั‚ ะฑะธะฑะปะธะพั‚ะตะบะธ ะฒ ะบะพะดะต ะฟั€ะธััƒั‚ัั‚ะฒัƒะตั‚
// ะ”ะปั ะฑะพะปะตะต ั‚ะพั‡ะฝะพะณะพ ะพะฟั€ะตะดะตะปะตะฝะธั - ะผะพะถะฝะพ ะฟั€ะธะผะตะฝะธั‚ัŒ ะฟะพะดั…ะพะด ั ะธะผะตะฝะตะผ ั„ะฐะนะปะฐ
bool not_empty_list = false;
foreach (CxList r in slick)
{
    // ะ•ัะปะธ ะฒัั‚ั€ะตั‚ะธะปะธ ะธะผะฟะพั€ั‚, ัั‡ะธั‚ะฐะตะผ, ั‡ั‚ะพ slick ะธัะฟะพะปัŒะทัƒะตั‚ัั
	not_empty_list = true;
}

if (not_empty_list) {
    // ะ˜ั‰ะตะผ ะฒั‹ะทะพะฒั‹, ะฒ ะบะพั‚ะพั€ั‹ะต ะฟะตั€ะตะดะฐะตั‚ัั SQL-ัั‚ั€ะพะบะฐ
	CxList sql = All.FindByShortName("sql");
	sql.Add(All.FindByShortName("sqlu"));
	
	// ะžะฟั€ะตะดะตะปัะตะผ ะดะฐะฝะฝั‹ะต, ะบะพั‚ะพั€ั‹ะต ะฟะพะฟะฐะดะฐัŽั‚ ะฒ ัั‚ะธ ะฒั‹ะทะพะฒั‹
	CxList data_sql = All.DataInfluencingOn(sql);
	
	// ะขะฐะบ ะบะฐะบ ัะธะฝั‚ะฐะบะธั ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั, ะผะพะถะฝะพ ะฟั€ะธะผะตะฝะธั‚ัŒ ะฟะพะดั…ะพะด ั ั€ะตะณัƒะปัั€ะฝั‹ะผะธ ะฒั‹ั€ะฐะถะตะฝะธัะผะธ
	// RegExp ัั‚ะพะธั‚ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะบั€ะฐะนะฝะต ะพัั‚ะพั€ะพะถะฝะพ ะธ ะฝะต ะฟั€ะธะผะตะฝัั‚ัŒ ะตะณะพ ะฝะฐ ะฑะพะปัŒัˆะพะผ ะบะพะปะธั‡ะตัั‚ะฒะต ะดะฐะฝะฝั‹ั…, ั‚ะฐะบ ะบะฐะบ ัั‚ะพ ะผะพะถะตั‚ ัะธะปัŒะฝะพ ะฟะพะฒะปะธัั‚ัŒ ะฝะฐ ะฟั€ะพะธะทะฒะพะดะธั‚ะตะปัŒะฝะพัั‚ัŒ
	CxList find_possible_inj = data_sql.FindByRegex(@"#$", true, true, true);

    // ะ˜ะทะฑะฐะฒะปัะตะผัั ะพั‚ ะปะธัˆะฝะธั… ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธะน, ะตัะปะธ ะพะฝะธ ะตัั‚ัŒ ะธ ะฒั‹ะฒะพะดะธะผ ะฒ ั€ะตะทัƒะปัŒั‚ะฐั‚
	result = find_possible_inj.FindByType(typeof(BinaryExpr));
}

เปœเป‰เบฒ เบงเบฝเบ: เบŠเบญเบเบซเบฒเบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเปˆเบฝเบ‡เบ—เบตเปˆเปƒเบŠเป‰เปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”

เบเบฒเบ™เปเบเป‰เป„เบ‚: เบซเบผเบฒเบเป†เบšเปเบฅเบดเบชเบฑเบ”เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบเบงเบ”เบชเบญเบšเปเบซเบผเปˆเบ‡เป€เบ›เบตเบ” (เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” OSA) เป€เบžเบทเปˆเบญเบเบงเบ”เบซเบฒเบเบฒเบ™เปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบชเบฐเบšเบฑเบšเบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเปˆเบฝเบ‡เปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเป‰เบง. เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบกเบฑเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เบญเบฑเบšเป€เบ”เบ”เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปƒเบซเป‰เป€เบ›เบฑเบ™เป€เบงเบตเบŠเบฑเบ™เบ—เบตเปˆเบ›เบญเบ”เป„เบžเป„เบ”เป‰. เปƒเบ™เบšเบฒเบ‡เบเปเบฅเบฐเบ™เบตเบกเบตเบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”, เปƒเบ™เบšเบฒเบ‡เบเปเบฅเบฐเบ™เบตเบšเปเปˆเบกเบตเบชเบฐเบšเบฑเบšเบ—เบตเปˆเบ›เบญเบ”เป„เบžเบ—เบฑเบ‡เบซเบกเบปเบ”. เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰, เบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” SAST เปเบฅเบฐ OSA เบˆเบฐเบŠเปˆเบงเบเบเปเบฒเบ™เบปเบ”เบงเปˆเบฒเบซเบ™เป‰เบฒเบ—เบตเปˆเบ™เปเบฒเป„เบ›เบชเบนเปˆเบเบฒเบ™เบ‚เบนเบ”เบฎเบตเบ”เบ‚เบญเบ‡เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบšเปเปˆเป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบฅเบฐเบซเบฑเบ”.

เปเบ•เปˆเบšเบฒเบ‡เบ„เบฑเป‰เบ‡, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเป€เบกเบทเปˆเบญเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒ JavaScript, เบ™เบตเป‰เบญเบฒเบ”เบˆเบฐเบšเปเปˆเป€เบ›เบฑเบ™เบงเบฝเบเบ—เบตเปˆเบซเบเบธเป‰เบ‡เบเบฒเบ. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เปเบเป‰เป„เบ‚, เบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก, เปเบ•เปˆเบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบ„เบงเบฒเบกเบญเปˆเบญเบ™เปเบญเปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบš. lodash เปƒเบ™โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹ template ะธ *set.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเปˆเบฝเบ‡เปƒเบ™เป„เบŸเบฅเปŒ JS:

/**
 * Template example
 */

'use strict';
var _ = require("./node_modules/lodash.js");


// Use the "interpolate" delimiter to create a compiled template.
var compiled = _.template('hello <%= js %>!');
console.log(compiled({ 'js': 'lodash' }));
// => 'hello lodash!'

// Use the internal `print` function in "evaluate" delimiters.

var compiled = _.template('<% print("hello " + js); %>!');
console.log(compiled({ 'js': 'lodash' }));
// => 'hello lodash!'

เปเบฅเบฐเป€เบกเบทเปˆเบญเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบเบปเบ‡เปƒเบ™ html:

<!DOCTYPE html>
<html>
<head>
    <title>Lodash Tutorial</title>
    <script src="./node_modules/lodash.js"></script>
    <script type="text/javascript">
  // Lodash chunking array
        nums = [1, 2, 3, 4, 5, 6, 7, 8, 9];

        let c1 = _.template('<% print("hello " + js); %>!');
        console.log(c1);

        let c2 = _.template('<% print("hello " + js); %>!');
        console.log(c2);
    </script>
</head>
<body></body>
</html>

เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เบŠเบญเบเบซเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบชเปˆเบฝเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, เป€เบŠเบดเปˆเบ‡เป„เบ”เป‰เบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบŠเปˆเบญเบ‡เป‚เบซเบงเปˆ:

// ะ˜ั‰ะตะผ ะฒัะต ัั‚ั€ะพะบะธ: ะฒ ะบะพั‚ะพั€ั‹ั… ะฒัั‚ั€ะตั‡ะฐะตั‚ัั ัั‚ั€ะพะบะฐ lodash (ะฟั€ะตะดะฟะพะปะฐะณะฐะตะผ, ั‡ั‚ะพ ัั‚ะพ ะพะฑัŠัะฒะปะตะฝะธะต ะธะผะฟะพั€ั‚ะฐ ะฑะธะฑะปะธะพั‚ะตะบะธ
CxList lodash_strings = Find_String_Literal().FindByShortName("*lodash*");

// ะ˜ั‰ะตะผ ะฒัะต ะดะฐะฝะฝั‹ะต: ะบะพั‚ะพั€ั‹ะต ะฒะทะฐะธะผะพะดะตะนัั‚ะฒัƒัŽั‚ ั ัั‚ะธะผะธ ัั‚ั€ะพะบะฐะผะธ
CxList data_on_lodash = All.InfluencedBy(lodash_strings);


// ะ—ะฐะดะฐะตะผ ัะฟะธัะพะบ ัƒัะทะฒะธะผั‹ั… ะผะตั‚ะพะดะพะฒ
List<string> vulnerable_methods = new List<string> {"template", "*set"};

// ะ˜ั‰ะตะผ ะฒัะต ะฝะฐัˆะธ ัƒัะทะฒะธะผั‹ะต ะผะตั‚ะพะดั‹, ะบะพั‚ะพั€ั‹ะต ะฟะตั€ะตั‡ะธัะปะตะฝะฝั‹ ะฒ ัƒัะทะฒะธะผะพัั‚ัั… ะธ ะพั‚ั„ะธะปัŒั‚ั€ะพะฒั‹ะฒะฐะตะผ ะธั… ั‚ะพะปัŒะบะพ ั‚ะฐะผ, ะณะดะต ะพะฝะธ ะฒั‹ะทั‹ะฒะฐะปะธััŒ
CxList vulnerableMethods = All.FindByShortNames(vulnerable_methods).FindByType(typeof(MethodInvokeExpr));

//ะะฐั…ะพะดะธะผ ะฒัะต ะดะฐะฝะฝั‹ะต: ะบะพั‚ะพั€ั‹ะต ะฒะทะฐะธะผะพะดะตะนัั‚ะฒัƒัŽั‚ ั ะดะฐะฝะฝั‹ะผะธ ะผะตั‚ะพะดะฐะผะธ
CxList vulnFlow = All.InfluencedBy(vulnerableMethods);

// ะ•ัะปะธ ะตัั‚ัŒ ะฟะตั€ะตัะตั‡ะตะฝะธะต ะฟะพ ัั‚ะธะผ ะดะฐะฝะฝั‹ะผ - ะบะปะฐะดะตะผ ะฒ ั€ะตะทัƒะปัŒั‚ะฐั‚
result = vulnFlow * data_on_lodash;

// ะคะพั€ะผะธั€ัƒะตะผ ัะฟะธัะพะบ ะฟัƒั‚ะตะน ะฟะพ ะบะพั‚ะพั€ั‹ะผ ะผั‹ ัƒะถะต ะฟั€ะพัˆะปะธ, ั‡ั‚ะพะฑั‹ ั„ะธะปัŒั‚ั€ะพะฒะฐั‚ัŒ ะฒ ะดะฐะปัŒะฝะตะนัˆะตะผ ะดัƒะฑะปะธ
List<string> lodash_result_path = new List<string> {};

foreach(CxList lodash_result in result)
{
    // ะžั‡ะตั€ะตะดะฝะพะน ั€ะฐะท ะฟะพะปัƒั‡ะฐะตะผ ะฟัƒั‚ะธ ะบ ั„ะฐะนะปะฐะผ
	string file_name = lodash_result.GetFirstGraph().LinePragma.FileName;
	lodash_result_path.Add(file_name);
}

// ะ”ะฐะปัŒัˆะต ะธะดะตั‚ ั‡ะฐัั‚ัŒ ะพั‚ะฝะพััั‰ะฐััั ะบ html ั„ะฐะนะปะฐะผ, ั‚ะฐะบ ะบะฐะบ ะฒ ะฝะธั… ะผั‹ ะฝะต ะผะพะถะตะผ ะฟั€ะพัะปะตะดะธั‚ัŒ ะพั‚ะบัƒะดะฐ ะธะผะตะฝะฝะพ ะธะดะตั‚ ะฒั‹ะทะพะฒ
// ะคะพั€ะผะธั€ัƒะตะผ ะผะฐััะธะฒ ะฟัƒั‚ะตะน ั„ะฐะนะปะพะฒ, ั‡ั‚ะพะฑั‹ ะฑั‹ั‚ัŒ ัƒะฒะตั€ะตะฝะฝั‹ะผะธ, ั‡ั‚ะพ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธั ัƒัะทะฒะธะผั‹ั… ะผะตั‚ะพะดะพะฒ ะฑั‹ะปะธ ะธะผะตะฝะฝะพ ะฒ ั‚ะตั… ั„ะฐะนะปะฐั…, ะฒ ะบะพั‚ะพั€ั‹ั… ะพะฑัŠัะฒะปะตะฝ lodash
List<string> lodash_path = new List<string> {};
foreach(CxList string_lodash in lodash_strings)
{
	string file_name = string_lodash.GetFirstGraph().LinePragma.FileName;
	lodash_path.Add(file_name);
}

// ะŸะตั€ะตะฑะธั€ะฐะตะผ ะฒัะต ัƒัะทะฒะธะผั‹ะต ะผะตั‚ะพะดั‹ ะธ ัƒะฑะตะถะดะฐะตะผัั, ั‡ั‚ะพ ะพะฝะธ ะฒั‹ะทะฒะฐะฝั‹ ะฒ ั‚ะตั… ะถะต ั„ะฐะนะปะฐั…, ั‡ั‚ะพ ะธ ะพะฑัŠัะฒะปะตะฝะธะต/ะฒะบะปัŽั‡ะตะฝะธะต lodash
foreach(CxList method in vulnerableMethods)
{
	string file_name_method = method.GetFirstGraph().LinePragma.FileName;
	if (lodash_path.Contains(file_name_method) == true && lodash_result_path.Contains(file_name_method) == false){
		result.Add(method);
	}
}

// ะฃะฑะธั€ะฐะตะผ ะฒัะต UknownReferences ะธ ะพัั‚ะฐะฒะปัะตะผ ัะฐะผั‹ะน "ะดะปะธะฝะฝั‹ะน" ะธะท ะฟัƒั‚ะตะน, ะตัะปะธ ั‚ะฐะบะธะต ะฒัั‚ั€ะตั‡ะฐัŽั‚ัั
result = result.ReduceFlow(CxList.ReduceFlowType.ReduceSmallFlow) - result.FindByType(typeof(UnknownReference));

เปœเป‰เบฒ เบงเบฝเบ: เบŠเบญเบเบซเบฒเปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เบ—เบตเปˆเบเบฑเบ‡เบขเบนเปˆเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™

เบเบฒเบ™เปเบเป‰เป„เบ‚: เบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เป€เบฅเบทเปˆเบญเบ‡เปเบ›เบเบ—เบตเปˆเบชเปเบฒเบฅเบฑเบšเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเป‚เบ—เบฅเบฐเบชเบฑเบšเบกเบทเบ–เบท, เบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เปƒเบšเบขเบฑเป‰เบ‡เบขเบทเบ™เบซเบผเบทเบเบฐเปเบˆเป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ•เปˆเบฒเบ‡เป†เบซเบผเบทเบเบงเบ”เบชเบญเบš SSL-Pinning. เบˆเบฒเบเบ—เบฑเบ”เบชเบฐเบ™เบฐเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบž, เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบชเบดเปˆเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบงเป‰เปƒเบ™เบฅเบฐเบซเบฑเบ”เบšเปเปˆเปเบกเปˆเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”. เปƒเบซเป‰เบžเบฐเบเบฒเบเบฒเบกเบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ—เบตเปˆเบˆเบฐเบ„เบปเป‰เบ™เบซเบฒเป„เบŸเบฅเปŒเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เปƒเบ™ repository:

// ะะฐะนะดะตะผ ะฒัะต ัะตั€ั‚ะธั„ะธะบะฐั‚ั‹ ะฟะพ ะผะฐัะบะต ั„ะฐะนะปะฐ
CxList find_certs = All.FindByShortNames(new List<string> {"*.der", "*.cer", "*.pem", "*.key"}, false);

// ะŸั€ะพะฒะตั€ะธะผ, ะณะดะต ะฒ ะฟั€ะธะปะพะถะตะฝะธะธ ะพะฝะธ ะธัะฟะพะปัŒะทัƒัŽั‚ัั
CxList data_used_certs = All.DataInfluencedBy(find_certs);

// ะ˜ ะดะปั ะผะพะฑะธะปัŒะฝั‹ั… ะฟั€ะธะปะพะถะตะฝะธะน - ะผะพะถะตะผ ะฟะพะธัะบะฐั‚ัŒ ะผะตั‚ะพะดั‹, ะณะดะต ะฒั‹ะทั‹ะฒะฐะตั‚ัั ั‡ั‚ะตะฝะธะต ัะตั€ั‚ะธั„ะธะบะฐั‚ะพะฒ
// ะ”ะปั ะดั€ัƒะณะธั… ะฟะปะฐั‚ั„ะพั€ะผ ะธ ะฟั€ะธะปะพะถะตะฝะธะน ะผะพะณัƒั‚ ะฑั‹ั‚ัŒ ั€ะฐะทะปะธั‡ะฝั‹ะต ะผะตั‚ะพะดั‹
CxList methods = All.FindByMemberAccess("*.getAssets");

// ะŸะตั€ะตัะตั‡ะตะฝะธะต ะผะฝะพะถะตัั‚ะฒ ะดะฐัั‚ ะฝะฐะผ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฟะพ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธัŽ ะปะพะบะฐะปัŒะฝั‹ั… ัะตั€ั‚ะธั„ะธะบะฐั‚ะพะฒ ะฒ ะฟั€ะธะปะพะถะตะฝะธะธ
result = methods * data_used_certs;

เปœเป‰เบฒ เบงเบฝเบ: เบŠเบญเบเบซเบฒ tokens เบ—เบตเปˆเบ–เบทเบเบ—เปเบฒเบฅเบฒเบเปƒเบ™เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™

เบเบฒเบ™เปเบเป‰เป„เบ‚: เบกเบฑเบ™เบกเบฑเบเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบตเปˆเบˆเบฐเบ–เบญเบ™ tokens เบ—เบตเปˆเบ–เบทเบเบ—เปเบฒเบฅเบฒเบเบซเบผเบทเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบญเบทเปˆเบ™เป†เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”. เปเบ™เปˆเบ™เบญเบ™, เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบžเบงเบเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ”เบต, เปเบ•เปˆเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบ‚เปเบ‚เบญเบšเปƒเบˆเบเบฑเบšเบเบฒเบ™เบชเบญเบšเบ–เบฒเบก CxQL, เบเบฒเบ™เบŠเบญเบเบซเบฒเบชเบดเปˆเบ‡เบ•เปˆเบฒเบ‡เป†เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบ:

// ะŸะพะปัƒั‡ะฐะตะผ ะฒัะต ัั‚ั€ะพะบะธ, ะบะพั‚ะพั€ั‹ะต ัะพะดะตั€ะถะฐั‚ัั ะฒ ะบะพะดะต
CxList strings = base.Find_Strings();

// ะ˜ั‰ะตะผ ัั€ะตะดะธ ะฒัะตั… ัั‚ั€ะพะบ ะฝัƒะถะฝะพะต ะฝะฐะผ ะทะฝะฐั‡ะตะฝะธะต. ะ’ ะฟั€ะธะผะตั€ะต ั‚ะพะบะตะฝ ะฒ ะฒะธะดะต ัั‚ั€ะพะบะธ "qwerty12345"
result = strings.FindByShortName("qwerty12345");

เบชเบฐเบซเบฅเบธเบš

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบซเบงเบฑเบ‡เบงเปˆเบฒเบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบ—เบตเปˆเบเปเบฒเบฅเบฑเบ‡เป€เบฅเบตเปˆเบกเบฎเบนเป‰เบˆเบฑเบเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เบกเบท Checkmarx. เบšเบฒเบ‡เบ—เบตเบœเบนเป‰เบ—เบตเปˆเบ‚เบฝเบ™เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™เบเปเปˆเบˆเบฐเบŠเบญเบเบซเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เปƒเบ™เบ„เบนเปˆเบกเบทเบ™เบตเป‰.

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบกเบตเบเบฒเบ™เบ‚เบฒเบ”เปเบ„เบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เปƒเบซเบกเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบเบปเบ”เบฅเบฐเบšเบฝเบšเบชเปเบฒเบฅเบฑเบš Checkmarx. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡ repository เปƒเบ™ Github, เบšเปˆเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ›เบฐเบเบฒเบ”เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เบธเบเบ„เบปเบ™เบ—เบตเปˆเปƒเบŠเป‰ CxQL เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบชเบดเปˆเบ‡เบ—เบตเปˆเบกเบตเบ›เบฐเป‚เบซเบเบ”เปƒเบ™เบกเบฑเบ™, เปเบฅเบฐเบเบฑเบ‡เบกเบตเป‚เบญเบเบฒเบ”เบ—เบตเปˆเบˆเบฐเปเบšเปˆเบ‡เบ›เบฑเบ™เบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบเบฑเบšเบŠเบธเบกเบŠเบปเบ™. เบ„เบฑเบ‡เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบœเบนเป‰เบ›เบฐเบเบญเบšเบชเปˆเบงเบ™เบเบดเบ™เบ”เบตเบ•เป‰เบญเบ™เบฎเบฑเบš!

เบ‚เบญเบšเปƒเบˆเบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™!

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™