Π₯Π΅ΠΉ Π₯Π°Π±Ρ!
Π Π½Π°ΡΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Π½Π°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΎ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π° Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΡΡΠ°ΡΠΈΡΠ΅Π½ ΠΊΠΎΠ΄ (SAST). ΠΠ·Π²ΡΠ½ ΠΊΡΡΠΈΡΡΠ° Π²ΡΠΈΡΠΊΠΈ ΡΠ°Π±ΠΎΡΡΡ ΡΡΠ΅Π΄Π½ΠΎ. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π²ΡΠΈΡΠΊΠΎ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π² Π½Π΅Π³ΠΎ, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄ΠΎΠΊΠΎΠ»ΠΊΠΎ ΡΠ΅Π·ΠΈ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΡΠ° ΠΎΠ±Ρ Π²Π°Π½Π°ΡΠΈ ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° Π°Π½Π°Π»ΠΈΠ·. Π‘ΠΏΠΎΡΠ΅Π΄ ΠΌΠ΅Π½ Π΅Π΄ΠΈΠ½ ΠΎΡ Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΈΡΠ΅ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ ΠΏΡΠΈ ΠΈΠ·Π±ΠΎΡΠ° Π½Π° SAST ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° Π³ΠΎ ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ ΡΠΏΠΎΡΠ΅Π΄ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠ° Π½Π° Π²Π°ΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΡΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° Π°Π½Π°Π»ΠΈΠ· ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΡΠΎ ΠΏΠΎ-ΡΠ΅ΡΡΠΎ ΡΠ΅ Π½Π°ΡΠΈΡΠ°Ρ ββCustom Queries.
ΠΠ°ΠΉ-ΡΠ΅ΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Checkmarx - ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ ΠΈ ΠΌΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ Π·Π° ΠΌΠΎΡ ΠΎΠΏΠΈΡ Π² ΠΏΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° Π°Π½Π°Π»ΠΈΠ· Π·Π° Π½Π΅Π³ΠΎ.
Π’Π°Π±Π»ΠΈΡΠ° Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ΡΠΎ
ΠΠ»ΠΈΠ·Π°Π½Π΅
ΠΠ°ΡΠΎ Π½Π°ΡΠ°Π»ΠΎ Π±ΠΈΡ
ΠΈΡΠΊΠ°Π» Π΄Π° ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ°ΠΌ Π΅Π΄Π½Π° ΠΎΡ ΠΌΠ°Π»ΠΊΠΎΡΠΎ ΡΡΠ°ΡΠΈΠΈ Π½Π° ΡΡΡΠΊΠΈ Π·Π° Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ Π½Π° ΠΏΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Π·Π° Checkmarx. Π’ΠΎΠΉ Π±Π΅ΡΠ΅ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°Π½ Π½Π° HabrΓ© Π² ΠΊΡΠ°Ρ Π½Π° 2019 Π³. ΠΏΠΎΠ΄ Π·Π°Π³Π»Π°Π²ΠΈΠ΅:
Π’ΠΎΠΉ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΡΠ²ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ Π² CxQL (Checkmarx Query Language) Π·Π° Π½ΡΠΊΠΎΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈ Π½Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π·Π° Π°Π½Π°Π»ΠΈΠ·.
ΠΡΠΌΠ° Π΄Π° ΠΏΠΎΠ²ΡΠ°ΡΡΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΎΡΠΎ Π² Π½Π΅Π³ΠΎ, Π½ΠΎ Π½ΡΠΊΠΎΠΈ ΠΏΡΠ΅ΡΠΈΡΠ°Π½ΠΈΡ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΡΠ΅ ΠΈΠΌΠ°. Π ΠΌΠΎΡΡΠ° ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌ Π΄Π° ΡΡΡΡΠ°Π²Ρ Π΅Π΄ΠΈΠ½ Π²ΠΈΠ΄ βΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ ΠΎΡ ΡΠ΅ΡΠ΅ΠΏΡΠΈβ, ΡΠΏΠΈΡΡΠΊ Ρ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΠ΅ΡΠ½Π°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΈ Ρ Checkmarx. Π’ΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΡΠΈ Π½Π°Π±ΠΈΡ Π³Π»Π°Π²Π°ΡΠ° Π½Π°Π΄ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ ΡΠ΅Π·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠΎΠ½ΡΠΊΠΎΠ³Π° Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½ΡΠΌΠ°ΡΠ΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π° ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π΄ΠΎΡΠΈ Π±Π΅ΡΠ΅ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΈΡΠΊΠ²Π°. ΠΠ°Π΄ΡΠ²Π°ΠΌ ΡΠ΅ ΠΌΠΎΡΡ ΠΎΠΏΠΈΡ ΠΈ Π±Π΅Π·ΡΡΠ½Π½ΠΈ Π½ΠΎΡΠΈ Π΄Π° Π½Π΅ ΡΠ° Π½Π°ΠΏΡΠ°Π·Π½ΠΈ ΠΈ ΡΠ°Π·ΠΈ βΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ ΠΎΡ ΡΠ΅ΡΠ΅ΠΏΡΠΈ Π·Π° ΠΏΠ΅ΡΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π·Π°ΡΠ²ΠΊΠΈβ ΡΠ΅ Π²ΠΈ ΡΠΏΠ΅ΡΡΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΡΠ° ΠΈΠ»ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π΅ΡΠ²Π½ΠΈ ΠΊΠ»Π΅ΡΠΊΠΈ. Π ΡΠ°ΠΊΠ°, Π΄Π° Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅!
ΠΠ±ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ°
ΠΡΡΠ²ΠΎ, Π½Π΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΠΈ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ°, Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π°. Π ΡΡΡΠΎ ΠΈ Π·Π°ΡΠΎΡΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π΅ ΠΊΠ°Π·Π²Π° Π½ΠΈΡΠΎ Π·Π° ΡΠΎΠ²Π° ΠΈΠ»ΠΈ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΏΡΡΡΠ½Π°ΡΠ° Π² ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°, ΠΊΠΎΠ΅ΡΠΎ Π½Π΅ Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ.
-
ΠΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ ΠΈΠ·Π±ΡΠ°Π½Π°ΡΠ° ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° (Π½Π°Π±ΠΎΡ ΠΎΡ Π°ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°). ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ Π±ΡΠΎΠΉ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ, Π° ΠΊΠ°ΠΊ ΡΠΎΡΠ½ΠΎ Π΄Π° Π³ΠΈ ΡΡΡΡΠΊΡΡΡΠΈΡΠ°ΡΠ΅ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠ° Π½Π° Π²Π°ΡΠΈΡ ΠΏΡΠΎΡΠ΅Ρ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ Π³ΡΡΠΏΠΈΡΠ°ΡΠ΅ ΠΏΠΎ Π΅Π·ΠΈΠΊ ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΡΠΎΡΡ Π½Π° Π°ΠΊΡΠΈΠ²Π½ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π²Π»ΠΈΡΠ΅ Π²ΡΡΡ Ρ ΡΠΊΠΎΡΠΎΡΡΡΠ° ΠΈ ΡΠΎΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Preset Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Checkmarx
-
ΠΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΡΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°Ρ Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, Π½Π°ΡΠ΅ΡΠ΅Π½ CxAuditor. Π’ΠΎΠ²Π° Π΅ Π΄Π΅ΡΠΊΡΠΎΠΏ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π° ΡΡΡ ΡΡΡΠ²ΡΡ, ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Checkmarx. Π’ΠΎΠ·ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΈΠΌΠ° Π΄Π²Π° ΡΠ΅ΠΆΠΈΠΌΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°: ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ Π²Π΅ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ΅Π½ΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅.
CxAudit ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
-
ΠΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π² Checkmarx ΡΠ° ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠΎ Π΅Π·ΠΈΠΊ, Ρ.Π΅. Π²ΡΠ΅ΠΊΠΈ Π΅Π·ΠΈΠΊ ΠΈΠΌΠ° ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Π·Π°ΡΠ²ΠΊΠΈ. ΠΠΌΠ° ΠΈ Π½ΡΠΊΠΎΠΈ ΠΎΠ±ΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π΅Π·ΠΈΠΊΠ°, ΡΠΎΠ²Π° ΡΠ° ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½ΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ. Π ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ°ΡΠ° ΡΠΈ ΡΠ°ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Π·Π°ΡΠ²ΠΊΠΈ Π²ΠΊΠ»ΡΡΠ²Π°Ρ ΡΡΡΡΠ΅Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π΄ΡΡΠ³ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°.
Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΠΏΠΎ Π΅Π·ΠΈΠΊ
-
ΠΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΡΠ° βΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈβ ΠΈ βΠ½Π΅ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈβ (ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ ΠΈ Π½Π΅ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈ). ΠΠ΅ ΡΡΠ²ΡΠ΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΠΈΠΌΠ΅, ΡΠΏΠΎΡΠ΅Π΄ ΠΌΠ΅Π½, Π½ΠΎ ΡΠΎΠ²Π° Π΅. ΠΠ·Π²ΠΎΠ΄ΡΡ Π΅, ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° βΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈΡΠ΅β ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ΡΠΎ Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π° βΠ½Π΅ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈΡΠ΅β ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠ° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ ΡΠ°ΠΌΠΎ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅Ρ Π½ΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ Π² Π΄ΡΡΠ³ΠΈ Π·Π°ΡΠ²ΠΊΠΈ (Π²ΡΡΡΠ½ΠΎΡΡ ΡΠ΅ ΡΠ° ΠΏΡΠΎΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ ).
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΡΠΈΠΏΠ° ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅
-
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ Π½ΠΎΠ²ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΈΠ»ΠΈ Π΄Π° Π΄ΠΎΠΏΡΠ»Π²Π°ΡΠ΅/ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ²Π°ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ. ΠΠ° Π΄Π° ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² Π΄ΡΡΠ²ΠΎΡΠΎ, Π΄Π° ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ Ρ Π΄Π΅ΡΠ½ΠΈΡ Π±ΡΡΠΎΠ½ ΠΈ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ΡΠ΅ βOverrideβ ΠΎΡ ΠΏΠ°Π΄Π°ΡΠΎΡΠΎ ΠΌΠ΅Π½Ρ. Π’ΡΠΊ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΠ΅ Π½ΠΎΠ²ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Π½Π΅ ΡΠ° Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π² ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈ Π½Π΅ ΡΠ° Π°ΠΊΡΠΈΠ²Π½ΠΈ. ΠΠ° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅, ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΡΠ΅ Π² ΠΌΠ΅Π½ΡΡΠΎ βPreset Managerβ Π½Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°. ΠΡΠ΅Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π°ΠΏΠ°Π·Π²Π°Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ ΡΠΈ, ΡΠΎΠ΅ΡΡ Π°ΠΊΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΡΠΎ Π΅ Π±ΠΈΠ»ΠΎ Π°ΠΊΡΠΈΠ²Π½ΠΎ, ΡΠΎ ΡΠ΅ ΠΎΡΡΠ°Π½Π΅ ΡΠ°ΠΊΠΎΠ²Π° ΠΈ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΎ Π²Π΅Π΄Π½Π°Π³Π°.
ΠΡΠΈΠΌΠ΅Ρ Π·Π° Π½ΠΎΠ²ΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π° Preset Manager
-
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ΅ ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π° βΠ΄ΡΡΠ²ΠΎβ ΠΎΡ Π·Π°ΡΠ²ΠΊΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π·Π°Π²ΠΈΡΠΈ ΠΎΡ ΠΊΠ°ΠΊΠ²ΠΎ. ΠΡΠ°Π²ΠΈΠ»Π°ΡΠ°, ΠΊΠΎΠΈΡΠΎ ΡΡΠ±ΠΈΡΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΠΏΡΡΠ²ΠΈ, Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ, Π²ΡΠΎΡΠΈ. Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ ΠΎΡ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΠΊΠ΅ΡΠΈΡΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ Π°ΠΊΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠΎΠ³Π°Π²Π° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅, ΡΠΎΠ²Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΠΈ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅.
-
ΠΡΠ°Π²ΠΈΠ»Π°ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½ΠΈΠ²Π°:
-
ΠΠ° ΡΡΠ»Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° - ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π²ΡΡΠΊΠΎ ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΠΎΠ΅ΠΊΡ
-
ΠΠ° Π½ΠΈΠ²ΠΎ Π΅ΠΊΠΈΠΏ (ΠΠΊΠΈΠΏ) - ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°ΠΌΠΎ Π·Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ Π² ΠΈΠ·Π±ΡΠ°Π½ΠΈΡ Π΅ΠΊΠΈΠΏ.
-
ΠΠ° Π½ΠΈΠ²ΠΎ ΠΏΡΠΎΠ΅ΠΊΡ β Π©Π΅ ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠΈ Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ
ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π½ΠΈΠ²ΠΎΡΠΎ, Π½Π° ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΏΡΠ°Π²ΠΈΠ»ΠΎΡΠΎ
"Π Π΅ΡΠ½ΠΈΠΊ" Π·Π° Π½Π°ΡΠΈΠ½Π°Π΅ΡΠΈ
Π ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π° Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π΅ΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ°Ρ Π° Ρ ΠΌΠ΅Π½ Π²ΡΠΏΡΠΎΡΠΈ, ΠΈ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ° ΡΠ΅Π΄ΠΈΡΠ° ΡΠ΅Ρ Π½ΠΈΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΠΎΠΏΡΠΎΡΡΡΡ ΠΆΠΈΠ²ΠΎΡΠ°.
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΡ ΡΠΏΠΈΡΡΡΠΈ
- Π²ΡΡΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄ΡΡΠ³ΠΎΠ³ΠΎ (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 ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ 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 Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Π·Π½Π°Π΅ Π·Π° ΡΡΡ Π½ΠΎΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ ΠΈ Π½Π°ΡΠ°ΡΠ° Π·Π°Π΄Π°ΡΠ° Π΅ Π΄Π° Π³ΠΎ Π½Π°ΡΡΠΈΠΌ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅, ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΊΡΠΌ ΡΠ°Π·ΠΈ ΡΠ°ΠΌΠΊΠ°. ΠΠΎΠ½ΡΠΊΠΎΠ³Π° ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ»ΠΎΠΆΠ½ΡΠ²Π° ΠΎΡ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΡΠ°ΠΌΠΊΠΈΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈΠΌΠ΅Π½Π° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΠΎ ΡΡΠ΅ΡΠ°Π½ΠΈ ΠΈ Π΅ Π½Π΅Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅Π΄Π²ΡΡΠΌΠΈΡΠ»Π΅Π½ΠΎ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ Π²ΡΡΠ·ΠΊΠ°ΡΠ° Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°.
Π’ΡΡΠ΄Π½ΠΎΡΡΡΠ° Π΅, ΡΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡΡ Π½Π° ΡΠ°ΠΊΠΈΠ²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅, Π·Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΡΠ°Π»ΡΠΈΠ²ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π½ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ. ΠΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠΎΡΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΊΠ°Π½ΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ΅ΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°:
-
ΠΡΡΠ²ΠΈΡΡ Π²Π°ΡΠΈΠ°Π½Ρ, Π·Π½Π°Π΅ΠΌ ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ, ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΡΠΎ Π½Π° Π½ΠΈΠ²ΠΎ Π΅ΠΊΠΈΠΏ. ΠΠΎ Π°ΠΊΠΎ Π΅ΠΊΠΈΠΏΡΡ ΡΠ΅ΡΠΈ Π΄Π° ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ΅ΠΌΠ΅ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΈΠ»ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π² ΠΊΠΎΠΈΡΠΎ ΠΈΠΌΠ΅Π½Π°ΡΠ° Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ ΡΠ΅ ΠΏΡΠΈΠΏΠΎΠΊΡΠΈΠ²Π°Ρ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΡΡΠ½Π° ΠΊΠ°ΡΡΠΈΠ½Π° Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠ°Π»ΡΠΈΠ²ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»Π½ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ
-
ΠΡΠΎΡΠ°ΡΠ° ΠΎΠΏΡΠΈΡ Π΅ Π΄Π° ΡΡΡΡΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π² ΠΊΠΎΠΈΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π΅ ΡΡΠ½ΠΎ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ°Π½Π°. Π‘ ΡΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΠΌΠ΅ ΡΠΈΠ³ΡΡΠ½ΠΈ, ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ°, ΠΎΡ ΠΊΠΎΡΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠΎΡΠ½ΠΎ Π² ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ».
-
Π ΡΡΠ΅ΡΠΈΡΡ Π²Π°ΡΠΈΠ°Π½Ρ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π΄Π²Π°ΡΠ° Π³ΠΎΡΠ½ΠΈ ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π° Π·Π°Π΅Π΄Π½ΠΎ.
ΠΠ°ΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, Π΄ΠΎΠ±ΡΠ΅ ΠΏΠΎΠ·Π½Π°ΡΠ° Π² ΡΠ΅ΡΠ½ΠΈ ΠΊΡΡΠ³ΠΎΠ²Π΅ $
, ΠΊΠΎΠΉΡΠΎ Π·Π°ΠΌΠ΅ΡΡΠ²Π° Π΄Π°Π½Π½ΠΈ Π² ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠΎΡΠΌΠΈΡΠ°Π½Π° 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. ΠΠ°ΡΠΎΠ²Π° ΡΡΠ·Π΄Π°Π΄ΠΎΡ
ΠΌΠ΅
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅!
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com