Как Π΄Π° напиша ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Checkmarx, Π±Π΅Π· Π΄Π° полудСя

Π₯Π΅ΠΉ Π₯Π°Π±Ρ€!

Π’ Π½Π°ΡˆΠ°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π°ΡˆΠ°Ρ‚Π° компания ΠΌΠ½ΠΎΠ³ΠΎ чСсто сС Π·Π°Π½ΠΈΠΌΠ°Π²Π° с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ инструмСнти Π·Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° статичСн ΠΊΠΎΠ΄ (SAST). Извън кутията всички работят срСдно. Π Π°Π·Π±ΠΈΡ€Π° сС, всичко зависи ΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈΡ‚Π΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π² Π½Π΅Π³ΠΎ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎ Ρ‚Π΅Π·ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ са ΠΎΠ±Ρ…Π²Π°Π½Π°Ρ‚ΠΈ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° Π°Π½Π°Π»ΠΈΠ·. Π‘ΠΏΠΎΡ€Π΅Π΄ ΠΌΠ΅Π½ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡ‚Π΅ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ ΠΏΡ€ΠΈ ΠΈΠ·Π±ΠΎΡ€Π° Π½Π° SAST инструмСнт Π΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π΄Π° Π³ΠΎ пСрсонализиратС спорСд спСцификата Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ прилоТСния, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΈ промСнятС ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Π°Π½Π°Π»ΠΈΠ· ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΡ‚ΠΎ ΠΏΠΎ-чСсто сС Π½Π°Ρ€ΠΈΡ‡Π°Ρ‚ ​​Custom Queries.

Как Π΄Π° напиша ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Checkmarx, Π±Π΅Π· Π΄Π° полудСя

Най-чСсто ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Checkmarx - ΠΌΠ½ΠΎΠ³ΠΎ интСрСсСн ΠΈ ΠΌΠΎΡ‰Π΅Π½ ΠΊΠΎΠ΄ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ говоря Π·Π° моя ΠΎΠΏΠΈΡ‚ Π² писанСто Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Π°Π½Π°Π»ΠΈΠ· Π·Π° Π½Π΅Π³ΠΎ.

Π’Π°Π±Π»ΠΈΡ†Π° Π½Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ

Π’Π»ΠΈΠ·Π°Π½Π΅

ΠšΠ°Ρ‚ΠΎ Π½Π°Ρ‡Π°Π»ΠΎ Π±ΠΈΡ… искал Π΄Π° ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π°ΠΌ Π΅Π΄Π½Π° ΠΎΡ‚ ΠΌΠ°Π»ΠΊΠΎΡ‚ΠΎ статии Π½Π° руски Π·Π° характСристикитС Π½Π° писанС Π½Π° заявки Π·Π° Checkmarx. Π’ΠΎΠΉ бСшС ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ Π½Π° HabrΓ© Π² края Π½Π° 2019 Π³. ΠΏΠΎΠ΄ Π·Π°Π³Π»Π°Π²ΠΈΠ΅: β€žΠ—Π΄Ρ€Π°Π²Π΅ΠΉ, ЧСкмаркс!β€œ Как Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Checkmarx SAST заявка ΠΈ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ страхотни уязвимости.

Π’ΠΎΠΉ Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ заявки Π² CxQL (Checkmarx Query Language) Π·Π° някои тСстови прилоТСния ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° основнитС ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈ Π½Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ работят ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° Π°Π½Π°Π»ΠΈΠ·.

Няма Π΄Π° повтарям описаното Π² Π½Π΅Π³ΠΎ, Π½ΠΎ някои прСсичания всС ΠΏΠ°ΠΊ Ρ‰Π΅ ΠΈΠΌΠ°. Π’ моята статия Ρ‰Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌ Π΄Π° ΡΡŠΡΡ‚Π°Π²Ρ Π΅Π΄ΠΈΠ½ Π²ΠΈΠ΄ β€žΠΊΠΎΠ»Π΅ΠΊΡ†ΠΈΡ ΠΎΡ‚ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΈβ€œ, списък с Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ срСщнах ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° си с Checkmarx. Π’Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° си набия Π³Π»Π°Π²Π°Ρ‚Π° Π½Π°Π΄ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Понякога Π² докумСнтацията нямашС Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ информация, Π° понякога Π΄ΠΎΡ€ΠΈ бСшС Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π΄Π° сС Ρ€Π°Π·Π±Π΅Ρ€Π΅ ΠΊΠ°ΠΊ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ сС изисква. Надявам сС моят ΠΎΠΏΠΈΡ‚ ΠΈ бСзсънни Π½ΠΎΡ‰ΠΈ Π΄Π° Π½Π΅ са Π½Π°ΠΏΡ€Π°Π·Π½ΠΈ ΠΈ Ρ‚Π°Π·ΠΈ β€žΠΊΠΎΠ»Π΅ΠΊΡ†ΠΈΡ ΠΎΡ‚ Ρ€Π΅Ρ†Π΅ΠΏΡ‚ΠΈ Π·Π° пСрсонализирани Π·Π°ΡΠ²ΠΊΠΈβ€œ Ρ‰Π΅ Π²ΠΈ спСсти няколко часа ΠΈΠ»ΠΈ няколко Π½Π΅Ρ€Π²Π½ΠΈ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ. И Ρ‚Π°ΠΊΠ°, Π΄Π° Π·Π°ΠΏΠΎΡ‡Π²Π°ΠΌΠ΅!

ΠžΠ±Ρ‰Π° информация Π·Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π°

ΠŸΡŠΡ€Π²ΠΎ, Π½Π΅ΠΊΠ° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ няколко основни ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΈ процСса Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π°, Π·Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ сС случи слСд Ρ‚ΠΎΠ²Π°. А ΡΡŠΡ‰ΠΎ ΠΈ Π·Π°Ρ‰ΠΎΡ‚ΠΎ докумСнтацията Π½Π΅ ΠΊΠ°Π·Π²Π° Π½ΠΈΡ‰ΠΎ Π·Π° Ρ‚ΠΎΠ²Π° ΠΈΠ»ΠΈ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΏΡ€ΡŠΡΠ½Π°Ρ‚Π° Π² структурата, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ.

  1. ΠŸΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° сканиранС Π² зависимост ΠΎΡ‚ ΠΈΠ·Π±Ρ€Π°Π½Π°Ρ‚Π° ΠΏΡ€ΠΈ стартиранС ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½Π° настройка (Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°). ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ Π½Π΅ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π±Ρ€ΠΎΠΉ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΈ настройки, Π° ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎ Π΄Π° Π³ΠΈ структуриратС зависи ΠΎΡ‚ спСцификата Π½Π° вашия процСс. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ Π³Ρ€ΡƒΠΏΠΈΡ€Π°Ρ‚Π΅ ΠΏΠΎ Π΅Π·ΠΈΠΊ ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ настройки Π·Π° всСки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Броят Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° влияС Π²ΡŠΡ€Ρ…Ρƒ скоростта ΠΈ точността Π½Π° сканиранС.

    Как Π΄Π° напиша ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Checkmarx, Π±Π΅Π· Π΄Π° полудСяНастройка Π½Π° Preset Π² интСрфСйса Checkmarx

  2. ΠŸΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° сС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Ρ‚ Π² спСциалСн инструмСнт, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ CxAuditor. Π’ΠΎΠ²Π° Π΅ дСсктоп ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ сС ΡΠ²ΡŠΡ€Π·Π²Π° със ΡΡŠΡ€Π²ΡŠΡ€, ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‰ Checkmarx. Π’ΠΎΠ·ΠΈ инструмСнт ΠΈΠΌΠ° Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°: Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ Π²Π΅Ρ‡Π΅ ΠΈΠ·Π²ΡŠΡ€ΡˆΠ΅Π½ΠΎ сканиранС.

    Как Π΄Π° напиша ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Checkmarx, Π±Π΅Π· Π΄Π° полудСяCxAudit интСрфСйс

  3. ΠŸΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π² Checkmarx са Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠΎ Π΅Π·ΠΈΠΊ, Ρ‚.Π΅. всСки Π΅Π·ΠΈΠΊ ΠΈΠΌΠ° свой собствСн Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ заявки. Има ΠΈ някои ΠΎΠ±Ρ‰ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ нСзависимо ΠΎΡ‚ Π΅Π·ΠΈΠΊΠ°, Ρ‚ΠΎΠ²Π° са Ρ‚Π°ΠΊΠ° Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΈΡ‚Π΅ основни заявки. Π’ ΠΏΠΎ-голямата си част основнитС заявки Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° информация, която ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°.

    Как Π΄Π° напиша ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Checkmarx, Π±Π΅Π· Π΄Π° полудСяРаздСлянС Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° ΠΏΠΎ Π΅Π·ΠΈΠΊ

  4. ΠŸΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° са β€žΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΠΌΠΈβ€œ ΠΈ β€žΠ½Π΅ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΠΌΠΈβ€œ (изпълнСни ΠΈ нСизпълнСни). НС съвсСм ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎΡ‚ΠΎ ΠΈΠΌΠ΅, спорСд ΠΌΠ΅Π½, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π΅. Π˜Π·Π²ΠΎΠ΄ΡŠΡ‚ Π΅, Ρ‡Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° β€žΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΠΌΠΈΡ‚Π΅β€œ ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ‰Π΅ бъдС ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ сканиранСто Π² потрСбитСлския интСрфСйс, Π° β€žΠ½Π΅ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΠΌΠΈΡ‚Π΅β€œ ΠΏΡ€Π°Π²ΠΈΠ»Π° са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ само Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈ заявки (Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Ρ‚Π΅ са просто функция ).

    Как Π΄Π° напиша ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Checkmarx, Π±Π΅Π· Π΄Π° ΠΏΠΎΠ»ΡƒΠ΄Π΅ΡΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Ρ‚ΠΈΠΏΠ° ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΏΡ€ΠΈ създаванС

  5. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ Π½ΠΎΠ²ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ»ΠΈ Π΄Π° Π΄ΠΎΠΏΡŠΠ»Π²Π°Ρ‚Π΅/прСнаписватС ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ. Π—Π° Π΄Π° ΠΏΡ€Π΅Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, трябва Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π² Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ, Π΄Π° Ρ‰Ρ€Π°ΠΊΠ½Π΅Ρ‚Π΅ с дСсния Π±ΡƒΡ‚ΠΎΠ½ ΠΈ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ β€žOverrideβ€œ ΠΎΡ‚ ΠΏΠ°Π΄Π°Ρ‰ΠΎΡ‚ΠΎ мСню. Π’ΡƒΠΊ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Π΅ Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ Π½Π΅ са Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈ Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡ‚Π΅ настройки ΠΈ Π½Π΅ са Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈ. Π—Π° Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅Ρ‚Π΅ Π΄Π° Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅, трябва Π΄Π° Π³ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Ρ‚Π΅ Π² ΠΌΠ΅Π½ΡŽΡ‚ΠΎ β€œPreset Manager” Π½Π° инструмСнта. ΠŸΡ€Π΅Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π°ΠΏΠ°Π·Π²Π°Ρ‚ настройкитС си, тоСст Π°ΠΊΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΡ‚ΠΎ Π΅ Π±ΠΈΠ»ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ, Ρ‚ΠΎ Ρ‰Π΅ останС Ρ‚Π°ΠΊΠΎΠ²Π° ΠΈ Ρ‰Π΅ бъдС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΎ Π²Π΅Π΄Π½Π°Π³Π°.

    Как Π΄Π° напиша ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Checkmarx, Π±Π΅Π· Π΄Π° ΠΏΠΎΠ»ΡƒΠ΄Π΅ΡΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Π½ΠΎΠ²ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π² интСрфСйса Π½Π° Preset Manager

  6. По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° изпълнСниС сС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π° β€žΠ΄ΡŠΡ€Π²ΠΎβ€œ ΠΎΡ‚ заявки, ΠΊΠΎΠ΅Ρ‚ΠΎ зависи ΠΎΡ‚ ΠΊΠ°ΠΊΠ²ΠΎ. ΠŸΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π°, ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΠ±ΠΈΡ€Π°Ρ‚ информация, сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ ΠΏΡŠΡ€Π²ΠΈ, Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ я ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚, Π²Ρ‚ΠΎΡ€ΠΈ. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ сС ΠΊΠ΅ΡˆΠΈΡ€Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π°ΠΊΠΎ Π΅ възмоТно Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‚ΠΎΠ³Π°Π²Π° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅, Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π½Π°ΠΌΠ°Π»ΠΈ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ Π·Π° сканиранС.

  7. ΠŸΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π½ΠΈΠ²Π°:

  • Π—Π° цялата систСма - Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° всяко сканиранС Π½Π° всСки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

  • На Π½ΠΈΠ²ΠΎ Π΅ΠΊΠΈΠΏ (Π•ΠΊΠΈΠΏ) - Ρ‰Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° само Π·Π° сканиранС Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ Π² избрания Π΅ΠΊΠΈΠΏ.

  • На Π½ΠΈΠ²ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ – Π©Π΅ сС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

    Как Π΄Π° напиша ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Checkmarx, Π±Π΅Π· Π΄Π° ΠΏΠΎΠ»ΡƒΠ΄Π΅ΡΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π½ΠΈΠ²ΠΎΡ‚ΠΎ, Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ сС ΠΏΡ€ΠΈΠ»Π°Π³Π° ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΡ‚ΠΎ

"Π Π΅Ρ‡Π½ΠΈΠΊ" Π·Π° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‰ΠΈ

И Ρ‰Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π° с няколко Π½Π΅Ρ‰Π°, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Ρ…Π° Ρƒ ΠΌΠ΅Π½ Π²ΡŠΠΏΡ€ΠΎΡΠΈ, ΠΈ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ° Ρ€Π΅Π΄ΠΈΡ†Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ‰Π΅ опростят ΠΆΠΈΠ²ΠΎΡ‚Π°.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ със ΡΠΏΠΈΡΡŠΡ†ΠΈ

- Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ (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");

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΏΠΎΡ‚ΠΎΠΊΠ°

Π’Π΅Π·ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π² ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ Π΅Ρ‚ΠΎ малък лист Π·Π° ΠΈΠ·ΠΌΠ°ΠΌΠ° ΠΊΠ°ΠΊΠ²ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°Ρ‚:

// КакиС Π΄Π°Π½Π½Ρ‹Π΅ 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");

Но слСд ΠΊΠ°Ρ‚ΠΎ присвоихмС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° магичСската ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ Π½ΠΈ Π²Ρ€ΡŠΡ‰Π° Ρ‚ΠΎΠ²Π° ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅:

// Находим элСмСнты 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);

Но си струва Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ΅ΠΌΠ° само ΠΊΠ°Ρ‚ΠΎ Π²Ρ…ΠΎΠ΄ Π½ΠΈΠ·, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ няма Π΄Π° Π΅ възмоТно Π΄Π° сС ΠΏΠΎΠΊΠ°ΠΆΠ΅ пълСн списък с Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° ΠΏΡŠΡ€Π²Π°Ρ‚Π° опСрация. Π’Ρ‚ΠΎΡ€Π°Ρ‚Π° опция, която сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ, Π΅ Π΄Π° сС присвоява Π½Π° магичСска ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π²Ρ€Π΅ΠΌΠ΅ result Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π° ΠΎΡ‚ заявката ΠΈ Π²ΠΈΠΆΡ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ сС случва. Π’ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ΄ΠΎΠ±Π΅Π½; трябва Π΄Π° стС сигурни, Ρ‡Π΅ няма Π·Π°ΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Ρ‚ΠΎΠ²Π° Π² ΠΊΠΎΠ΄Π° слСд 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, Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ чСсто Π²ΠΈ липсва, Π΅ Π½Π΅ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π° докумСнтация, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ някои ΠΆΠΈΠ²ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ описаниС Π½Π° процСса Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° със заявки ΠΊΠ°Ρ‚ΠΎ цяло.

Π©Π΅ сС ΠΎΠΏΠΈΡ‚Π°ΠΌ Π΄Π° направя ΠΆΠΈΠ²ΠΎΡ‚Π° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-лСсСн Π·Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π·Π°ΠΏΠΎΡ‡Π²Π°Ρ‚ Π΄Π° сС Π³ΠΌΡƒΡ€ΠΊΠ°Ρ‚ Π² Π΅Π·ΠΈΠΊΠ° Π½Π° заявкитС, ΠΈ Ρ‰Π΅ Π΄Π°ΠΌ няколко ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° пСрсонализирани заявки Π·Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Някои ΠΎΡ‚ тях са доста ΠΎΠ±Ρ‰ΠΈ ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ във Π²Π°ΡˆΠ°Ρ‚Π° компания практичСски Π±Π΅Π· ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ, Π΄Ρ€ΡƒΠ³ΠΈ са ΠΏΠΎ-спСцифични, Π½ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΈ Ρ‡Ρ€Π΅Π· промяна Π½Π° ΠΊΠΎΠ΄Π°, Π·Π° Π΄Π° отговаря Π½Π° спСцификата Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ прилоТСния.

И Ρ‚Π°ΠΊΠ°, Π΅Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π°ΠΉ-чСсто срСщамС:

Π¦Π΅Π»: Има няколко ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΡ‚ΠΎ ΠΈ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ тях Π΅ Π²Π»ΠΎΠΆΠ΅Π½ Π² Π΄Ρ€ΡƒΠ³, трябва Π΄Π° напуснСтС Π΅Π΄ΠΈΠ½ ΠΎΡ‚ тях.

Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: Наистина, понякога Checkmarx ΠΏΠΎΠΊΠ°Π·Π²Π° няколко ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€ΠΈΠΏΠΎΠΊΡ€ΠΈΠ²Π°Ρ‚ ΠΈ Π΄Π° са ΡΡŠΠΊΡ€Π°Ρ‚Π΅Π½Π° вСрсия Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ. Π—Π° Ρ‚Π°ΠΊΠΈΠ²Π° случаи ΠΈΠΌΠ° спСциалСн ΠΌΠ΅Ρ‚ΠΎΠ΄ ReduceFlow. Π’ зависимост ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π°, Ρ‚ΠΎΠΉ Ρ‰Π΅ ΠΈΠ·Π±Π΅Ρ€Π΅ Π½Π°ΠΉ-късия ΠΈΠ»ΠΈ Π½Π°ΠΉ-дългия ΠΏΠΎΡ‚ΠΎΠΊ:

// ΠžΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ 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 ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ…ΠΎΠ΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ:

НамСрСтС AndroidOutputs

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°
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 ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ WorkManager Π·Π° асинхронна Ρ€Π°Π±ΠΎΡ‚Π° Π΅ Π΄ΠΎΠ±Ρ€Π° идСя Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Ρ‚Π΅ 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. НСка напишСм ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ Ρ‚ΡŠΡ€ΡΠΈ Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅ Π½ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈ Ρ‰Π΅ Π½ΠΈ ΠΊΠ°Π·Π²Π° Π΄Π°Π»ΠΈ някъдС сС спомСнават ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ‚Π°ΠΊΡŠΠ² Ρ„Π°ΠΉΠ», ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° комуникация с Π±Π΅ΠΊΠ΅Π½Π΄ услугата:

<?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, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠΌΠ° няколко нюанса, ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° сС Π²Π·Π΅ΠΌΠ°Ρ‚ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ ΠΏΡ€ΠΈ писанС:

// Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΠΎ поиску Ρ„Π°ΠΉΠ»ΠΎΠ² 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 ΠΈ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° стойности, Ρ‚Π°Π³ΠΎΠ²Π΅, Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ ΠΈ Π΄Ρ€. Но, Π·Π° съТалСниС, имашС Π³Ρ€Π΅ΡˆΠΊΠ° Π² докумСнтацията, ΠΏΠΎΡ€Π°Π΄ΠΈ която Π½ΠΈΡ‚ΠΎ Π΅Π΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Ρ‚ΠΎΠ·ΠΈ Π΄Π΅Ρ„Π΅ΠΊΡ‚ Π΅ отстранСн Π² послСдната вСрсия Π½Π° докумСнтацията, Π±ΡŠΠ΄Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΈ, Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΏΠΎ-Ρ€Π°Π½Π½ΠΈ вСрсии Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ.

Π•Ρ‚ΠΎ Π΅Π΄ΠΈΠ½ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΎΡ‚ докумСнтацията:

// Код Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚
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);

НСка Π³ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡΡŠΡ‚ Π·Π° всички Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½, слСд ΠΊΠ°Ρ‚ΠΎ стС измислили Π΅Π΄Π½Π°, просто трябва Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ Ρ‚Π°Π·ΠΈ, ΠΎΡ‚ която сС Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅. И Ρ‚Π°ΠΊΠ°, послСдоватСлно спорСд ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅:

  • "*.xml"β€” маска Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ Π·Π° Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅

  • 8 β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° Π΅Π·ΠΈΠΊΠ°, Π·Π° ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΏΡ€ΠΈΠ»Π°Π³Π° ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΡ‚ΠΎ

  • "cleartextTrafficPermitted"β€” ΠΈΠΌΠ΅ Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ Π² xml

  • "true" β€” стойността Π½Π° Ρ‚ΠΎΠ·ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚

  • false β€” ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° рСгулярСн ΠΈΠ·Ρ€Π°Π· ΠΏΡ€ΠΈ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅

  • true β€” ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅Ρ‚ΠΎ Ρ‰Π΅ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈ, ΠΊΠ°Ρ‚ΠΎ сС ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°Ρ‚ Π³Π»Π°Π²Π½ΠΈ ΠΈ ΠΌΠ°Π»ΠΊΠΈ Π±ΡƒΠΊΠ²ΠΈ, Ρ‚.Π΅. ΠΌΠ°Π»ΠΊΠΈ ΠΈ ΠΌΠ°Π»ΠΊΠΈ Π±ΡƒΠΊΠ²ΠΈ

ΠšΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈ ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° сигурността настройки Π·Π° ΠΌΡ€Π΅ΠΆΠΎΠ²Π° Π²Ρ€ΡŠΠ·ΠΊΠ° Π² Android, ΠΊΠΎΠΈΡ‚ΠΎ позволяват комуникация със ΡΡŠΡ€Π²ΡŠΡ€Π° Ρ‡Ρ€Π΅Π· HTTP ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° настройка, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ 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, сС Π½Π°Ρ‚ΡŠΠΊΠ½Π°Ρ…ΠΌΠ΅ Π½Π° Ρ„Π°Π»ΡˆΠΈΠ²ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΡ‚ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ опрСдСля настройката Π·Π° обфускация. Π€Π°ΠΊΡ‚ Π΅, Ρ‡Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΡ‚ΠΎ извън кутията Ρ‚ΡŠΡ€ΡΠΈ във Ρ„Π°ΠΉΠ»Π° build.gradle настройка, ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π½Π° Π·Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° обфускация Π·Π° вСрсията Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ.

Но Π² Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ понякога ΠΈΠΌΠ° Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ build.gradle, ΠΊΠΎΠΈΡ‚ΠΎ сС отнасят Π·Π° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ‚Π΅ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠžΡΠΎΠ±Π΅Π½ΠΎΡΡ‚Ρ‚Π° Π΅, Ρ‡Π΅ Π΄ΠΎΡ€ΠΈ Π°ΠΊΠΎ Ρ‚Π΅Π·ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ‚ нСобходимостта ΠΎΡ‚ обфускация, настройкитС Π½Π° родитСлския асСмблиращ Ρ„Π°ΠΉΠ» Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° компилация.

По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ Π·Π°Π΄Π°Ρ‡Π°Ρ‚Π° Π΅ Π΄Π° сС ΠΎΡ‚Ρ€Π΅ΠΆΠ°Ρ‚ Ρ‚Ρ€ΠΈΠ³Π΅Ρ€ΠΈ Π² Π΄ΡŠΡ‰Π΅Ρ€Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ ΠΏΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅Ρ‚ΠΎ Π½Π° линията apply 'com.android.library'.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π΅Π½ ΠΊΠΎΠ΄ ΠΎΡ‚ Ρ„Π°ΠΉΠ» build.gradle, ΠΊΠΎΠ΅Ρ‚ΠΎ опрСдСля нСобходимостта ΠΎΡ‚ обфускация:

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:

ProGuardObfuscationNotInUse

// Поиск ΠΌΠ΅Ρ‚ΠΎΠ΄Π° 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 прилоТСния, Π½ΠΎ ΠΈ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈ случаи, ΠΊΠΎΠ³Π°Ρ‚ΠΎ трябва Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ Π΄Π°Π»ΠΈ Π΄Π°Π΄Π΅Π½ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈ към ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ Ρ„Π°ΠΉΠ».

Π¦Π΅Π»: Π”ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π½Π° Ρ‚Ρ€Π΅Ρ‚Π° страна, Π°ΠΊΠΎ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡΡŠΡ‚ Π½Π΅ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° напълно

Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: Броят Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ Ρ€Π°ΠΌΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π² процСса Π½Π° писанС Π½Π° ΠΊΠΎΠ΄, Π΅ просто извън класациитС. Π Π°Π·Π±ΠΈΡ€Π° сС, Checkmarx Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π·Π½Π°Π΅ Π·Π° тяхното ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Π½Π΅ ΠΈ Π½Π°ΡˆΠ°Ρ‚Π° Π·Π°Π΄Π°Ρ‡Π° Π΅ Π΄Π° Π³ΠΎ Π½Π°ΡƒΡ‡ΠΈΠΌ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅, Ρ‡Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ към Ρ‚Π°Π·ΠΈ Ρ€Π°ΠΌΠΊΠ°. Понякога Ρ‚ΠΎΠ²Π° сС услоТнява ΠΎΡ‚ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Π΅ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΈΠΌΠ΅Π½Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са ΠΌΠ½ΠΎΠ³ΠΎ чСсто срСщани ΠΈ Π΅ нСвъзмоТно нСдвусмислСно Π΄Π° сС ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°.

Врудността Π΅, Ρ‡Π΅ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡΡŠΡ‚ Π½Π° Ρ‚Π°ΠΊΠΈΠ²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ сС Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π° ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΈ трябва Π΄Π° СкспСримСнтиратС, Π·Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° голям Π±Ρ€ΠΎΠΉ Ρ„Π°Π»ΡˆΠΈΠ²ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ. Има няколко ΠΎΠΏΡ†ΠΈΠΈ Π·Π° подобряванС Π½Π° точността Π½Π° сканиранС ΠΈ Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°:

  • ΠŸΡŠΡ€Π²ΠΈΡΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π·Π½Π°Π΅ΠΌ със сигурност, Ρ‡Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΡ‚ΠΎ Π½Π° Π½ΠΈΠ²ΠΎ Π΅ΠΊΠΈΠΏ. Но Π°ΠΊΠΎ Π΅ΠΊΠΈΠΏΡŠΡ‚ Ρ€Π΅ΡˆΠΈ Π΄Π° ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° няколко Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π² ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ сС ΠΏΡ€ΠΈΠΏΠΎΠΊΡ€ΠΈΠ²Π°Ρ‚, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ приятна ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π° Π½Π° мноТСство Ρ„Π°Π»ΡˆΠΈΠ²ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»Π½ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ

  • Π’Ρ‚ΠΎΡ€Π°Ρ‚Π° опция Π΅ Π΄Π° Ρ‚ΡŠΡ€ΡΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Π² ΠΊΠΎΠΈΡ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π΅ ясно ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€Π°Π½Π°. Π‘ Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° смС сигурни, Ρ‡Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°, ΠΎΡ‚ която сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ, сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ‚ΠΎΡ‡Π½ΠΎ Π² Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ».

  • И трСтият Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π΄Π²Π°Ρ‚Π° Π³ΠΎΡ€Π½ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π·Π°Π΅Π΄Π½ΠΎ.

ΠšΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅ΠΊΠ° Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, Π΄ΠΎΠ±Ρ€Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚Π° Π² тСсни ΠΊΡ€ΡŠΠ³ΠΎΠ²Π΅ Ρ…Π»ΡŠΠ·Π³Π°Π² Π·Π° Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ Scala, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ функционалността Π‘Π½Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±ΡƒΠΊΠ²Π°Π»Π½ΠΈ стойности. По ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, Π·Π° Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅Ρ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° SQL заявка, трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° $, ΠΊΠΎΠΉΡ‚ΠΎ замСства Π΄Π°Π½Π½ΠΈ Π² ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π° SQL заявка. Π’ΠΎΠ²Π° Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΅ пряк Π°Π½Π°Π»ΠΎΠ³ Π½Π° Prepared Statement Π² Java. Но Π°ΠΊΠΎ трябва Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ Π΄Π° конструиратС SQL заявка, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π°ΠΊΠΎ трябва Π΄Π° ΠΏΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΈΠΌΠ΅Π½Π° Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° #$, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Ρ‰Π΅ замСсти Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π² заявката (ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ конкатСнация Π½Π° Π½ΠΈΠ·).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π΅Π½ ΠΊΠΎΠ΄:

// Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС - значСния, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ
val table = "coffees"
sql"select * from #$table where name = $name".as[Coffee].headOption

Checkmarx всС ΠΎΡ‰Π΅ Π½Π΅ Π·Π½Π°Π΅ ΠΊΠ°ΠΊ Π΄Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° сплайсинга Π½Π° Π±ΡƒΠΊΠ²Π°Π»Π½ΠΈ стойности ΠΈ пропуска ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ #$, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π½Π΅ΠΊΠ° сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΡƒΡ‡ΠΈΠΌ Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΈ 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. ΠžΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° сигурността, ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°ΠΊΠΈΠ²Π° Π½Π΅Ρ‰Π° Π² ΠΊΠΎΠ΄ Π½Π΅ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π°Ρ‚Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°. НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° напишСм ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ Ρ‚ΡŠΡ€ΡΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ:

// НайдСм всС сСртификаты ΠΏΠΎ маскС Ρ„Π°ΠΉΠ»Π°
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;

Π¦Π΅Π»: НамиранС Π½Π° ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚ΠΈΡ€Π°Π½ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΈ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ

Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅: ЧСсто Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС отмСнят ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚ΠΈΡ€Π°Π½ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³Π° Π²Π°ΠΆΠ½Π° информация, която ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²Π° Π² ΠΊΠΎΠ΄Π°. Π Π°Π·Π±ΠΈΡ€Π° сС, ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌ Π² изходния ΠΊΠΎΠ΄ Π½Π΅ Π΅ Π΄ΠΎΠ±Ρ€Π° идСя, Π½ΠΎ ситуациитС Π²Π°Ρ€ΠΈΡ€Π°Ρ‚. Π‘Π»Π°Π³ΠΎΠ΄Π°Ρ€Π΅Π½ΠΈΠ΅ Π½Π° CxQL заявкитС, Π½Π°ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½Π΅Ρ‰Π° ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π° Π΅ доста лСсно:

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ всС строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТатся Π² ΠΊΠΎΠ΄Π΅
CxList strings = base.Find_Strings();

// Π˜Ρ‰Π΅ΠΌ срСди всСх строк Π½ΡƒΠΆΠ½ΠΎΠ΅ Π½Π°ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠΊΠ΅Π½ Π² Π²ΠΈΠ΄Π΅ строки "qwerty12345"
result = strings.FindByShortName("qwerty12345");

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Надявам сС, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ бъдС ΠΏΠΎΠ»Π΅Π·Π½Π° Π·Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π·Π°ΠΏΠΎΡ‡Π²Π°Ρ‚ Π΄Π° сС Π·Π°ΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ с инструмСнта Checkmarx. МоТС Π±ΠΈ Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ са писали свои собствСни ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎΡ‚ дълго Π²Ρ€Π΅ΠΌΠ΅, ΡΡŠΡ‰ΠΎ Ρ‰Π΅ намСрят Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² Ρ‚ΠΎΠ²Π° Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ.

Π—Π° съТалСниС, Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° липсва рСсурс, ΠΎΡ‚ ΠΊΠΎΠΉΡ‚ΠΎ Π΄Π° сС ΠΈΠ·Π²Π»ΠΈΡ‡Π°Ρ‚ Π½ΠΎΠ²ΠΈ ΠΈΠ΄Π΅ΠΈ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° Checkmarx. Π—Π°Ρ‚ΠΎΠ²Π° ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ Π² Github, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Ρ‰Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°ΠΌΠ΅ Π½Π°ΡˆΠ°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ всСки, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° CxQL, Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² нСя, Π° ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΄Π° ΠΈΠΌΠ° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π΄Π° сподСли Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° си с общността. Π₯Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π΅ Π² процСс Π½Π° попълванС ΠΈ структуриранС Π½Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΡΡŠΡ‚Ρ€ΡƒΠ΄Π½ΠΈΡ†ΠΈΡ‚Π΅ са Π΄ΠΎΠ±Ρ€Π΅ дошли!

Бпасибо за вниманиС!

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€