Skip to main content

ๅฏนไปฃ็ ๆ‰ซๆ็š„ SARIF ๆ”ฏๆŒ

่ฆๅœจ GitHub ไธŠ็š„ไป“ๅบ“ไธญๆ˜พ็คบ็ฌฌไธ‰ๆ–น้™ๆ€ๅˆ†ๆžๅทฅๅ…ท็š„็ป“ๆžœ๏ผŒๆ‚จ้œ€่ฆๅฐ†็ป“ๆžœๅญ˜ๅ‚จๅœจ SARIF ๆ–‡ไปถไธญ๏ผŒไปฅๆ”ฏๆŒ็”จไบŽ code scanning ็š„ SARIF 2.1.0 JSON ๆžถๆž„็š„็‰นๅฎšๅญ้›†ใ€‚ ๅฆ‚ๆžœไฝฟ็”จ้ป˜่ฎค CodeQL ้™ๆ€ๅˆ†ๆžๅผ•ๆ“Ž๏ผŒ็ป“ๆžœๅฐ†่‡ชๅŠจๆ˜พ็คบไบŽๆ‚จๅœจ GitHub ไธŠ็š„ไป“ๅบ“ไธญใ€‚

่ฐๅฏไปฅไฝฟ็”จๆญคๅŠŸ่ƒฝ๏ผŸ

Code scanning ๅฏ็”จไบŽไปฅไธ‹ๅญ˜ๅ‚จๅบ“็ฑปๅž‹๏ผš

  • GitHub.com ไธŠ็š„ๅ…ฌๅ…ฑๅญ˜ๅ‚จๅบ“
  • ๅฏ็”จไบ† GitHub Code Security ็š„ GitHub Team ไธŠ็š„็ป„็ป‡ๆ‹ฅๆœ‰็š„ๅญ˜ๅ‚จๅบ“

ๅ…ณไบŽ SARIF ๆ”ฏๆŒ

SARIF๏ผˆ้™ๆ€ๅˆ†ๆž็ป“ๆžœไบคๆขๆ ผๅผ๏ผ‰ๆ˜ฏไธ€็งๅฎšไน‰่พ“ๅ‡บๆ–‡ไปถๆ ผๅผ็š„ OASIS ๆ ‡ๅ‡†ใ€‚ SARIF ๆ ‡ๅ‡†็”จไบŽ็ฎ€ๅŒ–้™ๆ€ๅˆ†ๆžๅทฅๅ…ทๅˆ†ไบซๅ…ถ็ป“ๆžœ็š„ๆ–นๅผใ€‚ Code scanning ๆ”ฏๆŒ SARIF 2.1.0 JSON ๆžถๆž„็š„ๅญ้›†ใ€‚

่ฆไปŽ็ฌฌไธ‰ๆ–น้™ๆ€ไปฃ็ ๅˆ†ๆžๅผ•ๆ“ŽไธŠไผ  SARIF ๆ–‡ไปถ๏ผŒ้œ€็กฎไฟไธŠไผ ็š„ๆ–‡ไปถไฝฟ็”จ SARIF 2.1.0 ็‰ˆๆœฌใ€‚ GitHub ๅฐ†ๅ‰–ๆž SARIF ๆ–‡ไปถ๏ผŒๅนถๅœจ code scanning ่ฟ‡็จ‹ไธญไฝฟ็”จไป“ๅบ“ไธญ็š„็ป“ๆžœๆ˜พ็คบ่ญฆๆŠฅใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๅฐ† SARIF ๆ–‡ไปถไธŠไผ ๅˆฐ GitHubโ€ใ€‚ ๆœ‰ๅ…ณ SARIF 2.1.0 JSON ๆžถๆž„็š„่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… sarif-schema-2.1.0.jsonใ€‚

ๅฆ‚ๆžœ็ป“ๅˆไฝฟ็”จ GitHub Actions ๅ’Œ CodeQL ๅˆ†ๆžๅทฅไฝœๆต็จ‹๏ผŒๆˆ–่€…ไฝฟ็”จ CodeQL CLI๏ผŒๅˆ™ code scanning ็ป“ๆžœๅฐ†่‡ชๅŠจไฝฟ็”จๅ—ๆ”ฏๆŒ็š„ SARIF 2.1.0 ๅญ้›†ใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œ้…็ฝฎไปฃ็ ๆ‰ซๆ็š„้ซ˜็บง่ฎพ็ฝฎโ€ๆˆ–โ€œๅœจ็Žฐๆœ‰ CI ็ณป็ปŸไธŠไฝฟ็”จไปฃ็ ๆ‰ซๆโ€ใ€‚

GitHub ไฝฟ็”จ SARIF ๆ–‡ไปถไธญ็š„ๅฑžๆ€งๆฅๆ˜พ็คบ่ญฆๆŠฅใ€‚ ไพ‹ๅฆ‚๏ผŒshortDescription ๅ’Œ fullDescription ๅ‡บ็Žฐๅœจ code scanning ่ญฆๆŠฅ็š„้กถ้ƒจใ€‚ location ๅ…่ฎธ GitHub ๅœจไปฃ็ ๆ–‡ไปถไธญๆ˜พ็คบๆณจ้‡Šใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๅ…ณไบŽไปฃ็ ๆ‰ซๆ่ญฆๆŠฅโ€ใ€‚

ๅฆ‚ๆžœไฝ ไธ็†Ÿๆ‚‰ SARIF ๅนถๆƒณ่ฆไบ†่งฃ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… Microsoft ็š„ SARIF tutorials ๅญ˜ๅ‚จๅบ“ใ€‚

ๆไพ›็”จไบŽ่ทจ่ฟ่กŒ่ทŸ่ธช code scanning ่ญฆๆŠฅ็š„ๆ•ฐๆฎ

ๆฏๆฌกไธŠไผ ๆ–ฐไปฃ็ ๆ‰ซๆ็š„็ป“ๆžœๆ—ถ๏ผŒ้ƒฝไผšๅค„็†็ป“ๆžœๅนถๅฐ†่ญฆๆŠฅๆทปๅŠ ๅˆฐๅญ˜ๅ‚จๅบ“ไธญใ€‚ ไธบ้˜ฒๆญขๅ‡บ็Žฐ้’ˆๅฏนๅŒไธ€้—ฎ้ข˜็š„้‡ๅค่ญฆๆŠฅ๏ผŒcode scanning ไฝฟ็”จๆŒ‡็บนๅŒน้…ๅ„ไธช่ฟ่กŒ็š„็ป“ๆžœ๏ผŒไฝฟๅฎƒไปฌๅชไผšๅ‡บ็Žฐๅœจๆ‰€้€‰ๅˆ†ๆ”ฏ็š„ๆœ€ๆ–ฐ่ฟ่กŒไธญๅ‡บ็Žฐไธ€ๆฌกใ€‚ ่ฟ™ๆ ทๅฏไปฅๅœจ็ผ–่พ‘ๆ–‡ไปถๆ—ถๅฐ†่ญฆๆŠฅไธŽๆญฃ็กฎ็š„ไปฃ็ ่กŒๅŒน้…ใ€‚ ็ป“ๆžœ็š„ ruleId ๅฟ…้กปๅœจๅˆ†ๆžไธญ็›ธๅŒใ€‚

ๆŠฅๅ‘Šไธ€่‡ด็š„ๆ–‡ไปถ่ทฏๅพ„

ๆ–‡ไปถ่ทฏๅพ„ๅฟ…้กปๅœจ่ฟ่กŒ้—ดไฟๆŒไธ€่‡ด๏ผŒไปฅๅฎž็Žฐ็จณๅฎšๆŒ‡็บน็š„่ฎก็ฎ—ใ€‚ ๅฆ‚ๆžœๆ–‡ไปถ่ทฏๅพ„ๅฏนไบŽ็›ธๅŒ็ป“ๆžœๆœ‰ๆ‰€ไธๅŒ๏ผŒๅˆ™ๆฏๆฌก่ฟ›่กŒๆ–ฐๅˆ†ๆžๆ—ถ๏ผŒ้ƒฝไผšๅˆ›ๅปบๆ–ฐ่ญฆๆŠฅ๏ผŒๅนถๅ…ณ้—ญๆ—ง่ญฆๆŠฅใ€‚ ่ฟ™ไผšๅฏผ่‡ด็›ธๅŒ็ป“ๆžœๅ…ทๆœ‰ๅคšไธช่ญฆๆŠฅใ€‚

ๅŒ…ๅซ็”จไบŽ็”ŸๆˆๆŒ‡็บน็š„ๆ•ฐๆฎ

GitHub ไฝฟ็”จ OASIS ๆ ‡ๅ‡†ไธญ็š„ partialFingerprints ๅฑžๆ€งๆฅๆฃ€ๆต‹ไธคไธช็ป“ๆžœๅœจ้€ป่พ‘ไธŠๆ˜ฏๅฆ็›ธๅŒใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… OASIS ๆ–‡ๆกฃไธญ็š„โ€œpartialFingerprints ๅฑžๆ€งโ€ๆก็›ฎใ€‚

้€š่ฟ‡ CodeQL ๅˆ†ๆžๅทฅไฝœๆต็จ‹ ๆˆ– CodeQL CLI ๅˆ›ๅปบ็š„ SARIF ๆ–‡ไปถๅŒ…ๅซๆŒ‡็บนๆ•ฐๆฎใ€‚ ๅฆ‚ๆžœไฝฟ็”จ upload-sarif ๆ“ไฝœไธŠไผ  SARIF ๆ–‡ไปถๅนถไธ”ๆญคๆ•ฐๆฎไธขๅคฑ๏ผŒGitHub ไผšๅฐ่ฏ•ไปŽๆบๆ–‡ไปถๅกซๅ…… partialFingerprints ๅญ—ๆฎตใ€‚ ๆœ‰ๅ…ณไธŠไผ ็ป“ๆžœ็š„่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๅฐ† SARIF ๆ–‡ไปถไธŠไผ ๅˆฐ GitHubโ€ใ€‚

ๅฆ‚ๆžœไฝฟ็”จ /code-scanning/sarifs API ็ปˆ็ป“็‚นไธŠไผ ๆ— ๆŒ‡็บนๆ•ฐๆฎ็š„ SARIF ๆ–‡ไปถ๏ผŒcode scanning ่ญฆๆŠฅๅฐ†่ขซๅค„็†ๅนถๆ˜พ็คบ๏ผŒไฝ†็”จๆˆทๅฏ่ƒฝไผš็œ‹ๅˆฐ้‡ๅค็š„่ญฆๆŠฅใ€‚ ไธบ้ฟๅ…็œ‹ๅˆฐ้‡ๅค่ญฆๆŠฅ๏ผŒๅบ”ๅœจไธŠไผ  SARIF ๆ–‡ไปถไน‹ๅ‰่ฎก็ฎ—ๆŒ‡็บนๆ•ฐๆฎๅนถๅกซๅ…… partialFingerprints ๅฑžๆ€งใ€‚ ไฝ ๅฏ่ƒฝไผšๅ‘็Žฐ upload-sarif ๆ“ไฝœไฝฟ็”จไธ€ไธชๆœ‰็”จ็š„่ตท็‚น็š„่„šๆœฌ๏ผš https://github.com/github/codeql-action/blob/main/src/fingerprints.ts ใ€‚ ๆœ‰ๅ…ณ API ็š„่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œ้€‚็”จไบŽไปฃ็ ๆ‰ซๆ็š„ REST API ็ปˆ็ป“็‚นโ€ใ€‚

ไบ†่งฃ่ง„ๅˆ™ๅ’Œ็ป“ๆžœ

SARIF ๆ–‡ไปถๆ”ฏๆŒ่ง„ๅˆ™ๅ’Œ็ป“ๆžœใ€‚ ่ฟ™ไบ›ๅ…ƒ็ด ไธญๅญ˜ๅ‚จ็š„ไฟกๆฏ็›ธไผผ๏ผŒไฝ†็”จ้€”ไธๅŒใ€‚

  • ่ง„ๅˆ™ๆ˜ฏๅŒ…ๅซๅœจ toolComponent ๅฏน่ฑกไธญ็š„ reportingDescriptor ๅฏน่ฑกๆ•ฐ็ป„ใ€‚ ๅฏๅœจๆญคๅค„ๅญ˜ๅ‚จๅˆ†ๆž่ฟ‡็จ‹ไธญ่ฟ่กŒ็š„่ง„ๅˆ™็š„่ฏฆ็ป†ไฟกๆฏใ€‚ ่ฟ™ไบ›ๅฏน่ฑกไธญ็š„ไฟกๆฏๅบ”่ฏฅๅพˆๅฐ‘ๆ›ดๆ”น๏ผŒ้€šๅธธๅœจๆ›ดๆ–ฐๅทฅๅ…ทๆ—ถๆ›ดๆ”นใ€‚

  • ็ป“ๆžœๅญ˜ๅ‚จไธบ run ๅฏน่ฑกไธญ results ไธ‹็š„ไธ€็ณปๅˆ— result ๅฏน่ฑกใ€‚ ๆฏไธช result ๅฏน่ฑก้ƒฝๅŒ…ๅซไปฃ็ ๅบ“ไธญไธ€ไธช่ญฆๆŠฅ็š„่ฏฆ็ป†ไฟกๆฏใ€‚ ๅœจ results ๅฏน่ฑกไธญ๏ผŒๅฏไปฅๅผ•็”จๆฃ€ๆต‹ๅˆฐ่ญฆๆŠฅ็š„่ง„ๅˆ™ใ€‚

ๅฝ“ๆฏ”่พƒ้€š่ฟ‡ไฝฟ็”จ็›ธๅŒๅทฅๅ…ทๅ’Œ่ง„ๅˆ™ๅˆ†ๆžไธๅŒไปฃ็ ๅบ“็”Ÿๆˆ็š„ SARIF ๆ–‡ไปถๆ—ถ๏ผŒไฝ ๅบ”ไผš็œ‹ๅˆฐๅˆ†ๆž็ป“ๆžœ๏ผˆ่€Œไธๆ˜ฏ่ง„ๅˆ™๏ผ‰ๅญ˜ๅœจๅทฎๅผ‚ใ€‚

ๆŒ‡ๅฎšๆบๆ–‡ไปถ็š„ไฝ็ฝฎ

ๆŒ‡ๅฎšๆบๆ–‡ไปถไฝ็ฝฎๅ’Œไปฃ็ ่กŒๅฏ็กฎไฟไปฃ็ ๆ‰ซๆ่ญฆๆŠฅๅ‡†็กฎๆ˜พ็คบๅœจๅŒ…ๅซๅทฒ่ฏ†ๅˆซ้—ฎ้ข˜็š„ๆ–‡ไปถๅ†…๏ผŒไปฅไพฟๆœ‰้’ˆๅฏนๆ€งๅœฐ่งฃๅ†ณ้—ฎ้ข˜ใ€‚

่ฟ™็ง็ฒพๅ‡†็އๆ้ซ˜ไบ†ไปฃ็ ่ฏ„ๅฎกๅ’Œ่งฃๅ†ณ่ฟ‡็จ‹็š„ๆ•ˆ็އ๏ผŒ็ฎ€ๅŒ–ไบ†ๅผ€ๅ‘ๅทฅไฝœๆต๏ผŒไฝฟๅผ€ๅ‘ไบบๅ‘˜่ƒฝๅคŸๅœจไป–ไปฌ็š„ไปฃ็ ๅบ“ไธŠไธ‹ๆ–‡ไธญ็›ดๆŽฅ่งฃๅ†ณ้—ฎ้ข˜ใ€‚

ๅฝ“่ญฆๆŠฅๆ ‡่ฏ†็š„ๆ‰€ๆœ‰ไปฃ็ ่กŒ้ƒฝๅญ˜ๅœจไบŽๆ‹‰ๅ–่ฏทๆฑ‚ๅทฎๅผ‚ไธญๆ—ถ๏ผŒCode scanning ่ฟ˜ๅฐ†ๅœจๆ‹‰ๅ–่ฏทๆฑ‚ๆฃ€ๆŸฅ็ป“ๆžœไธญๆ˜พ็คบ่ญฆๆŠฅใ€‚

่‹ฅ่ฆๅœจๆ‹‰ๅ–่ฏทๆฑ‚ๆฃ€ๆŸฅไธญๆ˜พ็คบ๏ผŒ่ญฆๆŠฅๅฟ…้กปๆปก่ถณไปฅไธ‹ๆ‰€ๆœ‰ๆกไปถ๏ผš

  • ่ญฆๆŠฅๆ ‡่ฏ†็š„ๆ‰€ๆœ‰ไปฃ็ ่กŒ๏ผˆๅŒ…ๆ‹ฌ่ญฆๆŠฅ็š„็ฌฌไธ€่กŒ๏ผ‰้ƒฝๅญ˜ๅœจไบŽๆ‹‰ๅ–่ฏทๆฑ‚ๅทฎๅผ‚ไธญใ€‚
  • ่ญฆๆŠฅๅฟ…้กปๅญ˜ๅœจไบŽๆ‹‰ๅ–่ฏทๆฑ‚ไธญๆทปๅŠ ๆˆ–็ผ–่พ‘็š„ไปฃ็ ่กŒไธญ๏ผŒ่€Œไธๆ˜ฏๅทฒๅˆ ้™ค็š„่กŒไธญใ€‚

ๆไบค็š„ SARIF ๆ–‡ไปถไธญ็š„ physicalLocation ๅฏน่ฑกๆ ‡่ฏ†่ญฆๆŠฅ็š„ไปฃ็ ่กŒใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œphysicalLocation ๅฏน่ฑกโ€ใ€‚

ๆŒ‡ๅฎšๆบๆ–‡ไปถ็š„ๆ น

Code scanning ๅฐ†ไฝฟ็”จ็›ธๅฏน่ทฏๅพ„ๆŠฅๅ‘Š็š„็ป“ๆžœ่งฃ้‡Šไธบ็›ธๅฏนไบŽๆ‰€ๅˆ†ๆž็š„ๅญ˜ๅ‚จๅบ“็š„ๆ นใ€‚ ๅฆ‚ๆžœ็ป“ๆžœๅŒ…ๅซ็ปๅฏน URI๏ผŒๅˆ™ URI ไผš่ฝฌๆขไธบ็›ธๅฏน URIใ€‚ ้šๅŽๅฏไปฅๅฐ†็›ธๅฏน URI ไธŽๆไบคๅˆฐๅญ˜ๅ‚จๅบ“็š„ๆ–‡ไปถ่ฟ›่กŒๅŒน้…ใ€‚

ๅฏไปฅ้€š่ฟ‡ไปฅไธ‹ๆ–นๆณ•ไน‹ไธ€ๆไพ›ๆบๆ น๏ผŒ็”จไบŽไปŽ็ปๅฏน URI ่ฝฌๆขไธบ็›ธๅฏน URIใ€‚

ๅฆ‚ๆžœๆไพ›ๆบๆ น๏ผŒๅˆ™ไฝฟ็”จ็ปๅฏน URI ๆŒ‡ๅฎš็š„้กน็›ฎ็š„ไปปไฝ•ไฝ็ฝฎ้ƒฝๅฟ…้กปไฝฟ็”จ็›ธๅŒ URI ๆ–นๆกˆใ€‚ ๅฆ‚ๆžœๆบๆ น็š„ URI ๆ–นๆกˆไธŽไธ€ไธชๆˆ–ๅคšไธช็ปๅฏน URI ไธๅŒน้…๏ผŒๅˆ™ไธŠไผ ไผš่ขซๆ‹’็ปใ€‚

ไพ‹ๅฆ‚๏ผŒไฝฟ็”จ file:///github/workspace ็š„ๆบๆ นไธŠไผ  SARIF ๆ–‡ไปถใ€‚

# Conversion of absolute URIs to relative URIs for location artifacts

file:///github/workspace/src/main.go -> src/main.go
file:///tmp/go-build/tmp.go          -> file:///tmp/go-build/tmp.go

ๆ–‡ไปถไผšๆˆๅŠŸไธŠไผ ๏ผŒๅ› ไธบไธคไธช็ปๅฏน URI ้ƒฝไฝฟ็”จไธŽๆบๆ น็›ธๅŒ็š„ URI ๆ–นๆกˆใ€‚

ๅฆ‚ๆžœ็ป“ๆžœ็š„็›ธๅฏน URI ไธŽไฝฟ็”จ็ฌฆๅท้“พๆŽฅๅฎšไน‰็š„ๆ–‡ไปถ็›ธๅŒน้…๏ผŒๅˆ™ไปฃ็ ๆ‰ซๆๅฐ†ๆ— ๆณ•ๆ˜พ็คบ็ป“ๆžœใ€‚ ๅ› ๆญค๏ผŒไฝ ้œ€่ฆ่งฃๆžไปปไฝ•็ฌฆๅท้“พๆŽฅ็š„ๆ–‡ไปถ๏ผŒๅนถไฝฟ็”จ่งฃๆž็š„ URI ๆŠฅๅ‘Š่ฟ™ไบ›ๆ–‡ไปถไธญ็š„ไปปไฝ•็ป“ๆžœใ€‚

้ชŒ่ฏ SARIF ๆ–‡ไปถ

ๆ‚จๅฏไปฅๆ นๆฎ GitHub ๅผ•ๅ…ฅ่ง„ๅˆ™ๆต‹่ฏ• SARIF ๆ–‡ไปถๆ˜ฏๅฆๅ…ผๅฎน code scanningใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏท่ฎฟ้—ฎ Microsoft SARIF ้ชŒ่ฏ็จ‹ๅบใ€‚

ๅฏนไบŽๆฏไธช gzip ๅŽ‹็ผฉ SARIF ๆ–‡ไปถ๏ผŒSARIF ไธŠไผ ๆ”ฏๆŒ็š„ๆœ€ๅคงๅคงๅฐไธบ 10 MBใ€‚ ไปปไฝ•่ถ…่ฟ‡ๆญค้™ๅˆถ็š„ไธŠไผ ้ƒฝๅฐ†่ขซๆ‹’็ปใ€‚ ๅฆ‚ๆžœ SARIF ๆ–‡ไปถ็”ฑไบŽๅŒ…ๅซๅคชๅคš็ป“ๆžœ่€Œ่ฟ‡ๅคง๏ผŒๅˆ™ๅบ”ๆ›ดๆ–ฐ้…็ฝฎ๏ผŒไปฅๅฐ†้‡็‚นๆ”พๅœจๆœ€้‡่ฆ็š„่ง„ๅˆ™ๆˆ–ๆŸฅ่ฏข็š„็ป“ๆžœไธŠใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œSARIF ็ป“ๆžœๆ–‡ไปถๅคชๅคงโ€ใ€‚

Code scanning ๆ”ฏๆŒไธŠไผ ไธ‹่กจไธญๆ•ฐๆฎๅฏน่ฑก็š„ๆœ€ๅคงๆก็›ฎๆ•ฐใ€‚ ๅฆ‚ๆžœ่ฟ™ไบ›ๅฏน่ฑกไธญ็š„ไปปไฝ•ไธ€ไธช่ถ…่ฟ‡ๅ…ถๆœ€ๅคงๅ€ผ๏ผŒๅˆ™ SARIF ๆ–‡ไปถๅฐ†้ญๅˆฐๆ‹’็ปใ€‚ ๅฏนไบŽๆŸไบ›ๅฏน่ฑก๏ผŒๅฐ†ๆ˜พ็คบ็š„ๅ€ผ็š„ๆ•ฐ้‡่ฟ˜ๆœ‰้ขๅค–้™ๅˆถใ€‚ ๅฐฝๅฏ่ƒฝๆ˜พ็คบๆœ€้‡่ฆ็š„ๅ€ผใ€‚ ๅฝ“ๅˆ†ๆžๅŒ…ๅซ็š„ๆ•ฐๆฎ่ถ…ๅ‡บๆ”ฏๆŒ็š„้™ๅˆถๆ—ถ๏ผŒ่ฆๅ……ๅˆ†ๅˆฉ็”จๅˆ†ๆž๏ผŒ่ฏทๅฐ่ฏ•ไผ˜ๅŒ–ๅˆ†ๆž้…็ฝฎ๏ผˆไพ‹ๅฆ‚ๅฏนไบŽ CodeQL ๅทฅๅ…ท๏ผŒ่ฏ†ๅˆซๅนถ็ฆ็”จๅนฒๆ‰ฐๆ€งๆœ€ๅผบ็š„ๆŸฅ่ฏข๏ผ‰ใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œSARIF ็ป“ๆžœ่ถ…ๅ‡บไธ€ไธชๆˆ–ๅคšไธช้™ๅˆถโ€ใ€‚

SARIF ๆ•ฐๆฎๆœ€ๅคงๅ€ผๆ•ฐๆฎๆˆชๆ–ญ้™ๅˆถ
ๆฏไธชๆ–‡ไปถ็š„่ฟ่กŒๆฌกๆ•ฐ20ๆ— 
ๆฏๆฌก่ฟ่กŒ็š„็ป“ๆžœๆ•ฐ25,000ๅชๅŒ…ๆ‹ฌๅ‰ 5,000 ๆก็ป“ๆžœ๏ผŒๅนถๆŒ‰ไธฅ้‡ๆ€ง็กฎๅฎšไผ˜ๅ…ˆ็บงใ€‚
ๆฏๆฌก่ฟ่กŒ็š„่ง„ๅˆ™ๆ•ฐ25,000ๆ— 
ๆฏๆฌก่ฟ่กŒ็š„ๅทฅๅ…ทๆ‰ฉๅฑ•ๆ•ฐ100ๆ— 
ๆฏไธช็ป“ๆžœ็š„็บฟ็จ‹ๆตไฝ็ฝฎๆ•ฐ10,000ๅชๅŒ…ๆ‹ฌๅ‰ 1,000 ไธช็บฟ็จ‹ๆตไฝ็ฝฎ๏ผŒๆŒ‰ไผ˜ๅ…ˆ็บงๆŽ’ๅบใ€‚
ๆฏไธช็ป“ๆžœ็š„ไฝ็ฝฎๆ•ฐ1,000ๅชๅŒ…ๆ‹ฌ 100 ไธชไฝ็ฝฎใ€‚
ๆฏไธช่ง„ๅˆ™็š„ๆ ‡่ฎฐๆ•ฐ20ๅชๅŒ…ๆ‹ฌ 10 ไธชๆ ‡่ฎฐใ€‚
่ญฆๆŠฅ้™ๅˆถ1,000,000ๆ— 

ๆœ‰ๅ…ณๅ…ถไป–้”™่ฏฏ็š„ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๆŽ’ๆŸฅ SARIF ไธŠไผ ้—ฎ้ข˜โ€ใ€‚

ไธบๆไบคไธŠไผ ๅคšไธช SARIF ๆ–‡ไปถ

ๆ‚จๅฏไปฅไธบ็›ธๅŒ็š„ๆไบคไธŠไผ ๅคšไธช SARIF ๆ–‡ไปถ๏ผŒๅนถๅฐ†ๆฏไธชๆ–‡ไปถไธญ็š„ๆ•ฐๆฎๆ˜พ็คบไธบ code scanning ็ป“ๆžœใ€‚ ไธบไธ€ไธชๆไบคไธŠไผ ๅคšไธช SARIF ๆ–‡ไปถๆ—ถ๏ผŒๅฟ…้กปไธบๆฏไธชๅˆ†ๆžๆŒ‡ๅฎšไธ€ไธชโ€œ็ฑปๅˆซโ€ใ€‚ ๆŒ‡ๅฎš็ฑปๅˆซ็š„ๆ–นๅผๅ› ๅˆ†ๆžๆ–นๆณ•่€Œๅผ‚๏ผš

  • ็›ดๆŽฅไฝฟ็”จ CodeQL CLI๏ผŒๅœจ็”Ÿๆˆ SARIF ๆ–‡ไปถๆ—ถๅฐ† --sarif-category ๅ‚ๆ•ฐไผ ้€’็ป™ codeql database analyze ๅ‘ฝไปคใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๅ…ณไบŽ CodeQL CLIโ€ใ€‚
  • ๅฐ† GitHub Actions ไธŽ codeql-action/analyze ็ป“ๅˆไฝฟ็”จ๏ผŒ็ฑปๅˆซ่‡ชๅŠจไปŽๅทฅไฝœๆต็จ‹ๅ็งฐๅ’Œไปปไฝ•็Ÿฉ้˜ตๅ˜้‡๏ผˆ้€šๅธธๆ˜ฏ language๏ผ‰่ฎพ็ฝฎใ€‚ ๅฏไปฅ้€š่ฟ‡ไธบๆ“ไฝœๆŒ‡ๅฎš category ่พ“ๅ…ฅๆฅ่ฆ†็›–ๆญคๅ€ผ๏ผŒ่ฟ™ๅœจๅ•ไธชๅทฅไฝœๆต็จ‹ไธญๅˆ†ๆžๅ•ไธ€ๅญ˜ๅ‚จๅบ“็š„ไธๅŒ้ƒจๅˆ†ๆ—ถ้žๅธธๆœ‰็”จใ€‚
  • ไฝฟ็”จ GitHub Actions ไปŽๅ…ถไป–้™ๆ€ๅˆ†ๆžๅทฅๅ…ทไธŠไผ ็ป“ๆžœ๏ผŒๅฆ‚ๆžœๅœจไธ€ไธชๅทฅไฝœๆต็จ‹ไธญไธบๅŒไธ€ๅทฅๅ…ทไธŠไผ ๅคšไธช็ป“ๆžœๆ–‡ไปถ๏ผŒๅˆ™ๅฟ…้กปๆŒ‡ๅฎš category ่พ“ๅ…ฅใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๅฐ† SARIF ๆ–‡ไปถไธŠไผ ๅˆฐ GitHubโ€ใ€‚
  • ๅฆ‚ๆžœไธไฝฟ็”จ่ฟ™ไธค็งๆ–นๆณ•ไธญ็š„ไปปไฝ•ไธ€็ง๏ผŒๅˆ™ๅฟ…้กปๅœจๆฏไธช SARIF ๆ–‡ไปถไธญๆŒ‡ๅฎš่ฆไธŠไผ ็š„ๅ”ฏไธ€ runAutomationDetails.idใ€‚ ๆœ‰ๅ…ณๆญคๅฑžๆ€ง็š„่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œrunAutomationDetails ๅฏน่ฑกโ€ใ€‚

ๅฆ‚ๆžœไธบๅ…ทๆœ‰็›ธๅŒ็ฑปๅˆซๅ’Œๆฅ่‡ชๅŒไธ€ๅทฅๅ…ท็š„ๆไบคไธŠไผ ็ฌฌไบŒไธช SARIF ๆ–‡ไปถ๏ผŒๅˆ™ไน‹ๅ‰็š„็ป“ๆžœๅฐ†่ขซ่ฆ†็›–ใ€‚ ไฝ†ๆ˜ฏ๏ผŒๅฆ‚ๆžœๅฐ่ฏ•ๅœจๅ•ไธช GitHub Actions ๅทฅไฝœๆต็จ‹่ฟ่กŒไธญไธบๅŒไธ€ๅทฅๅ…ทๅ’Œ็ฑปๅˆซไธŠไผ ๅคšไธช SARIF ๆ–‡ไปถ๏ผŒๅˆ™ไผšๆฃ€ๆต‹ๅˆฐ้…็ฝฎ้”™่ฏฏ๏ผŒๅนถไธ”่ฟ่กŒๅฐ†ๅคฑ่ดฅใ€‚

ๆ”ฏๆŒ็š„ SARIF ่พ“ๅ‡บๆ–‡ไปถๅฑžๆ€ง

ๅฆ‚ๆžœๆ‚จไฝฟ็”จ CodeQL ไปฅๅค–็š„ไปฃ็ ๅˆ†ๆžๅผ•ๆ“Ž๏ผŒๅˆ™ๅฏไปฅๆŸฅ็œ‹ๅ—ๆ”ฏๆŒ็š„ SARIF ๅฑžๆ€งๆฅไผ˜ๅŒ–ๆ‚จ็š„ๅˆ†ๆž็ป“ๆžœๅœจ GitHub ไธญ็š„ๆ˜พ็คบๆ–นๅผใ€‚

ๆณจๆ„

ๅฟ…้กปไธบๆ ‡่ฎฐไธบโ€œrequiredโ€็š„ไปปไฝ•ๅฑžๆ€งๆไพ›ๆ˜พๅผๅ€ผใ€‚ ๅฟ…ๅกซๅฑžๆ€งไธๆ”ฏๆŒ็ฉบๅญ—็ฌฆไธฒใ€‚

ไปปไฝ•ๆœ‰ๆ•ˆ็š„ SARIF 2.1.0 ่พ“ๅ‡บๆ–‡ไปถ้ƒฝๅฏไปฅไธŠไผ ๏ผŒไฝ† code scanning ๅชไฝฟ็”จไปฅไธ‹ๅ—ๆ”ฏๆŒ็š„ๅฑžๆ€งใ€‚

๏ผˆๅฑžไบŽsarifLog ๅฏน่ฑก๏ผ‰็š„็ˆถ็บงใ€‚

ๅ็งฐๅฟ…้œ€่ฏดๆ˜Ž
$schema็‰ˆๆœฌ 2.1.0 ็š„ SARIF JSON ๆžถๆž„็š„ URIใ€‚ ไพ‹ๅฆ‚๏ผŒhttps://json.schemastore.org/sarif-2.1.0.jsonใ€‚
versionCode scanning ไป…ๆ”ฏๆŒ SARIF ็‰ˆๆœฌ 2.1.0ใ€‚
runs[]SARIF ๆ–‡ไปถๅŒ…ๅซไธ€ไธชๆˆ–ๅคšไธช่ฟ่กŒ็š„ๆ•ฐ็ป„ใ€‚ ๆฏไธช่ฟ่กŒไปฃ่กจๅˆ†ๆžๅทฅๅ…ท็š„ไธ€ๆฌก่ฟ่กŒใ€‚ ๆœ‰ๅ…ณ run ็š„่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… run ๅฏน่ฑกใ€‚

๏ผˆๅฑžไบŽrun ๅฏน่ฑก๏ผ‰็š„็ˆถ็บงใ€‚

Code scanning ไฝฟ็”จ run ๅฏน่ฑกๆŒ‰ๅทฅๅ…ท็ญ›้€‰็ป“ๆžœๅนถๆไพ›ๅ…ณไบŽ็ป“ๆžœๆฅๆบ็š„ไฟกๆฏใ€‚ run ๅฏน่ฑกๅŒ…ๅซ tool.driver ๅทฅๅ…ท็ป„ไปถๅฏน่ฑก๏ผŒ่ฏฅๅฏน่ฑกๅŒ…ๅซๆœ‰ๅ…ณ็”Ÿๆˆ็ป“ๆžœ็š„ๅทฅๅ…ท็š„ไฟกๆฏใ€‚ ๆฏไธช run ๅช่ƒฝ่Žทๅพ—ไธ€ไธชๅˆ†ๆžๅทฅๅ…ท็š„็ป“ๆžœใ€‚

ๅ็งฐๅฟ…้œ€่ฏดๆ˜Ž
tool.driverๆ่ฟฐๅˆ†ๆžๅทฅๅ…ท็š„ toolComponent ๅฏน่ฑกใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… toolComponent ๅฏน่ฑกใ€‚
tool.extensions[]่กจ็คบๅทฅๅ…ทๅœจๅˆ†ๆžๆœŸ้—ดไฝฟ็”จ็š„ไปปไฝ•ๆ’ไปถๆˆ–ๆ‰ฉๅฑ•็š„ toolComponent ๅฏน่ฑกๆ•ฐ็ป„ใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… toolComponent ๅฏน่ฑกใ€‚
invocation.workingDirectory.uriไป…ๅฝ“ๆœชๆไพ› checkout_uri๏ผˆไป…้™ SARIF ไธŠไผ  API๏ผ‰ๆˆ– checkout_path๏ผˆไป…้™ GitHub Actions๏ผ‰ๆ—ถ๏ผŒๆ‰ไฝฟ็”จๆญคๅญ—ๆฎตใ€‚ ่ฏฅๅ€ผ็”จไบŽๅฐ† physicalLocation ๅฏน่ฑกไธญไฝฟ็”จ็š„็ปๅฏน URI ่ฝฌๆขไธบ็›ธๅฏน URIใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๆŒ‡ๅฎšๆบๆ–‡ไปถ็š„ๆ นโ€ใ€‚
results[]ๅˆ†ๆžๅทฅๅ…ท็š„็ป“ๆžœใ€‚ Code scanning ๅœจ GitHub ไธŠๆ˜พ็คบ็ป“ๆžœใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… result ๅฏน่ฑกใ€‚

๏ผˆๅฑžไบŽtoolComponent ๅฏน่ฑก๏ผ‰็š„็ˆถ็บงใ€‚

ๅ็งฐๅฟ…้œ€่ฏดๆ˜Ž
nameๅˆ†ๆžๅทฅๅ…ท็š„ๅ็งฐใ€‚ Code scanning ๅœจ GitHub ไธŠๆ˜พ็คบๅ็งฐ๏ผŒไปฅๅ…่ฎธๆŒ‰ๅทฅๅ…ท็ญ›้€‰็ป“ๆžœใ€‚
versionๅˆ†ๆžๅทฅๅ…ท็š„็‰ˆๆœฌใ€‚ Code scanning ไฝฟ็”จ็‰ˆๆœฌๅทๆฅ่ทŸ่ธช็ป“ๆžœไฝ•ๆ—ถๅฏ่ƒฝ็”ฑไบŽๅทฅๅ…ท็‰ˆๆœฌๆ›ดๆ”น่€Œไธๆ˜ฏๆ‰€ๅˆ†ๆžไปฃ็ ็š„ๆ›ดๆ”น่€Œๅ‘็”Ÿๆ›ดๆ”นใ€‚ ๅฆ‚ๆžœ SARIF ๆ–‡ไปถๅŒ…ๅซ semanticVersion ๅญ—ๆฎต๏ผŒๅˆ™ code scanning ไธไฝฟ็”จ versionใ€‚
semanticVersionไปฅ่ฏญไน‰็‰ˆๆœฌ 2.0 ๆ ผๅผๆŒ‡ๅฎš็š„ๅˆ†ๆžๅทฅๅ…ท็‰ˆๆœฌใ€‚ Code scanning ไฝฟ็”จ็‰ˆๆœฌๅทๆฅ่ทŸ่ธช็ป“ๆžœไฝ•ๆ—ถๅฏ่ƒฝ็”ฑไบŽๅทฅๅ…ท็‰ˆๆœฌๆ›ดๆ”น่€Œไธๆ˜ฏๆ‰€ๅˆ†ๆžไปฃ็ ็š„ๆ›ดๆ”น่€Œๅ‘็”Ÿๆ›ดๆ”นใ€‚ ๅฆ‚ๆžœ SARIF ๆ–‡ไปถๅŒ…ๅซ semanticVersion ๅญ—ๆฎต๏ผŒๅˆ™ code scanning ไธไฝฟ็”จ versionใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…่ฏญไน‰็‰ˆๆœฌๆŽงๅˆถๆ–‡ๆกฃไธญ็š„โ€œ่ฏญไน‰็‰ˆๆœฌๆŽงๅˆถ 2.0.0โ€ใ€‚
rules[]่กจ็คบ่ง„ๅˆ™็š„ reportingDescriptor ๅฏน่ฑกๆ•ฐ็ป„ใ€‚ ๅˆ†ๆžๅทฅๅ…ทไฝฟ็”จ่ง„ๅˆ™ๆฅๆŸฅๆ‰พๆ‰€ๅˆ†ๆžไปฃ็ ไธญ็š„้—ฎ้ข˜ใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… reportingDescriptor ๅฏน่ฑกใ€‚

๏ผˆๅฑžไบŽreportingDescriptor ๅฏน่ฑก๏ผ‰็š„็ˆถ็บงใ€‚

ๅฏๅœจๆญคๅค„ๅญ˜ๅ‚จๅˆ†ๆž่ฟ‡็จ‹ไธญ่ฟ่กŒ็š„่ง„ๅˆ™็š„่ฏฆ็ป†ไฟกๆฏใ€‚ ่ฟ™ไบ›ๅฏน่ฑกไธญ็š„ไฟกๆฏๅบ”่ฏฅๅพˆๅฐ‘ๆ›ดๆ”น๏ผŒ้€šๅธธๅœจๆ›ดๆ–ฐๅทฅๅ…ทๆ—ถๆ›ดๆ”นใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…ไธŠ้ข็š„โ€œไบ†่งฃ่ง„ๅˆ™ๅ’Œ็ป“ๆžœโ€ใ€‚

ๅ็งฐๅฟ…้œ€่ฏดๆ˜Ž
id่ง„ๅˆ™็š„ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆใ€‚ id ๆ˜ฏไปŽ SARIF ๆ–‡ไปถ็š„ๅ…ถไป–้ƒจๅˆ†ๅผ•็”จ็š„๏ผŒๅฏ่ƒฝ่ขซ code scanning ็”จไบŽๅœจ GitHub ไธŠๆ˜พ็คบ URLใ€‚
name่ง„ๅˆ™็š„ๅ็งฐใ€‚ Code scanning ๆ˜พ็คบๅ็งฐ๏ผŒไปฅๅ…่ฎธๅœจ GitHub ไธŠๆŒ‰่ง„ๅˆ™็ญ›้€‰็ป“ๆžœใ€‚ ้™ๅˆถไธบ 255 ไธชๅญ—็ฌฆใ€‚
shortDescription.text่ง„ๅˆ™็š„็ฎ€ไป‹ใ€‚ Code scanning ๅœจ GitHub ไธŠ็š„็›ธๅ…ณ็ป“ๆžœๆ—่พนๆ˜พ็คบ็ฎ€็Ÿญ่ฏดๆ˜Žใ€‚ ้™ๅˆถไธบ 1024 ไธชๅญ—็ฌฆใ€‚
fullDescription.text่ง„ๅˆ™็š„ๆ่ฟฐใ€‚ Code scanning ๅœจ GitHub ไธŠ็š„็›ธๅ…ณ็ป“ๆžœๆ—่พนๆ˜พ็คบๅฎŒๆ•ด่ฏดๆ˜Žใ€‚ ้™ๅˆถไธบ 1024 ไธชๅญ—็ฌฆใ€‚
defaultConfiguration.level่ง„ๅˆ™็š„้ป˜่ฎคไธฅ้‡ๆ€ง็บงๅˆซใ€‚ Code scanning ไฝฟ็”จไธฅ้‡ๆ€ง็บงๅˆซๆฅๅธฎๅŠฉไฝ ไบ†่งฃ็ป“ๆžœๅฏนไบŽ็ป™ๅฎš่ง„ๅˆ™็š„้‡่ฆ็จ‹ๅบฆใ€‚ ้ป˜่ฎคๆƒ…ๅ†ตไธ‹๏ผŒdefaultConfiguration.level ่ฎพ็ฝฎไธบ warningใ€‚ ไฝ†ๆ˜ฏ๏ผŒๅฏไปฅ้€š่ฟ‡ๅœจไธŽ็ป“ๆžœๅ…ณ่”็š„ๅฏน่ฑก result ไธญ่ฎพ็ฝฎ level ๅฑžๆ€ง๏ผŒๆ›ฟไปฃ้ป˜่ฎค็š„่ง„ๅˆ™็บงๅˆซใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚่€ƒไธŽ result ๅฏน่ฑกๆœ‰ๅ…ณ็š„ๆ–‡ๆกฃใ€‚ defaultConfiguration.level ็š„ๆœ‰ๆ•ˆๅ€ผไธบ๏ผšnoteใ€warning ๅ’Œ errorใ€‚
help.textไฝฟ็”จๆ–‡ๆœฌๆ ผๅผ็š„่ง„ๅˆ™็š„ๆ–‡ๆกฃใ€‚ Code scanning ๅœจ็›ธๅ…ณ็ป“ๆžœๆ—่พนๆ˜พ็คบๆญคๅธฎๅŠฉๆ–‡ๆกฃใ€‚
help.markdown๏ผˆๅปบ่ฎฎ๏ผ‰ไฝฟ็”จ Markdown ๆ ผๅผ็š„่ง„ๅˆ™็š„ๆ–‡ๆกฃใ€‚ Code scanning ๅœจ็›ธๅ…ณ็ป“ๆžœๆ—่พนๆ˜พ็คบๆญคๅธฎๅŠฉๆ–‡ๆกฃใ€‚ ๅฝ“ help.markdown ๅฏ็”จๆ—ถ๏ผŒๅฐ†ๆ˜พ็คบๅฎƒ๏ผŒ่€Œไธๆ˜ฏ help.textใ€‚
properties.tags[]ๅญ—็ฌฆไธฒๆ•ฐ็ป„ใ€‚ Code scanning ไฝฟ็”จ tags ๅ…่ฎธไฝ ๅœจ GitHub ไธŠ็ญ›้€‰็ป“ๆžœใ€‚ ไพ‹ๅฆ‚๏ผŒๅฏไปฅ็ญ›้€‰ๅธฆๆ ‡่ฎฐ security ็š„ๆ‰€ๆœ‰็ป“ๆžœใ€‚
properties.precision๏ผˆๅปบ่ฎฎ๏ผ‰ไธ€ไธชๅญ—็ฌฆไธฒ๏ผŒๆŒ‡็คบๆญค่ง„ๅˆ™ๆŒ‡็คบ็š„็ป“ๆžœไธบ true ็š„้ข‘็އใ€‚ ไพ‹ๅฆ‚๏ผŒๅฆ‚ๆžœๅทฒ็ŸฅๆŸ้กน่ง„ๅˆ™็š„่ฏฏๆŠฅ็އ่พƒ้ซ˜๏ผŒๅˆ™ๅ…ถๅ‡†็กฎๆ€งๅบ”ไธบ lowใ€‚ Code scanning ๅœจ GitHub ไธŠๆŒ‰ๅ‡†็กฎๆ€งๅฏน็ป“ๆžœ่ฟ›่กŒๆŽ’ๅบ๏ผŒไฝฟๅ…ทๆœ‰ๆœ€้ซ˜ level ๅ’Œๆœ€้ซ˜ precision ็š„็ป“ๆžœๆ˜พ็คบๅœจๆœ€ๅ‰้ขใ€‚ ๅฏไปฅๆ˜ฏไธ‹่ฟฐไน‹ไธ€๏ผšvery-highใ€highใ€medium ๆˆ– lowใ€‚
properties.problem.severity๏ผˆๅปบ่ฎฎ๏ผ‰ไธ€ไธชๅญ—็ฌฆไธฒ๏ผŒๆŒ‡็คบ็”ฑ้žๅฎ‰ๅ…จๆŸฅ่ฏข็”Ÿๆˆ็š„ไปปไฝ•่ญฆๆŠฅ็š„ไธฅ้‡ๆ€ง็บงๅˆซใ€‚ ่ฟ™ไธŽ properties.precision ๅฑžๆ€งไธ€่ตท็กฎๅฎš็ป“ๆžœๆ˜ฏๅฆ้ป˜่ฎคๆ˜พ็คบๅœจ GitHub ไธŠ๏ผŒไฝฟๅ…ทๆœ‰ๆœ€้ซ˜ problem.severity ๅ’Œๆœ€้ซ˜ precision ็š„็ป“ๆžœๆ˜พ็คบๅœจๆœ€ๅ‰้ขใ€‚ ๅฏไปฅๆ˜ฏไปฅไธ‹้€‰้กนไน‹ไธ€๏ผšerrorใ€warning ๆˆ– recommendationใ€‚
properties.security-severity๏ผˆๅปบ่ฎฎไป…็”จไบŽๅฎ‰ๅ…จ่ง„ๅˆ™๏ผ‰ๅฆ‚ๆžœๅŒ…ๅซๆญคๅญ—ๆฎต็š„ๅ€ผ๏ผŒ่ง„ๅˆ™็š„็ป“ๆžœๅฐ†่ขซ่ง†ไธบๅฎ‰ๅ…จ็ป“ๆžœใ€‚ ไธ€ไธช่กจ็คบๅˆ†ๆ•ฐ็š„ๅญ—็ฌฆไธฒ๏ผŒ่ฏฅๅˆ†ๆ•ฐๆŒ‡็คบๅฎ‰ๅ…จๆŸฅ่ฏข็š„ไธฅ้‡ๆ€ง็บงๅˆซ๏ผŒ่ฏฅๅ€ผไป‹ไบŽ 0.0 ๅˆฐ 10.0 ไน‹้—ด๏ผˆ@tags ๅŒ…ๆ‹ฌ security๏ผ‰ใ€‚ ่ฟ™ไธŽ properties.precision ๅฑžๆ€งไธ€่ตท็กฎๅฎš็ป“ๆžœๆ˜ฏๅฆ้ป˜่ฎคๆ˜พ็คบๅœจ GitHub ไธŠ๏ผŒไฝฟๅ…ทๆœ‰ๆœ€้ซ˜ security-severity ๅ’Œๆœ€้ซ˜ precision ็š„็ป“ๆžœๆ˜พ็คบๅœจๆœ€ๅ‰้ขใ€‚ Code scanning ่ฝฌๆขๆ•ฐๅ€ผๅˆ†ๆ•ฐๅฆ‚ไธ‹๏ผš่ถ…่ฟ‡ 9.0 ไธบ critical๏ผŒ7.0 ่‡ณ 8.9 ไธบ high๏ผŒ4.0 ่‡ณ 6.9 ไธบ medium๏ผŒ0.1 ่‡ณ 3.9 ไธบ lowใ€‚ ๅ€ผ 0.0 ๆˆ–็ป™ๅฎš่Œƒๅ›ดไน‹ๅค–็š„ไปปไฝ•ๅ…ถไป–ๅ€ผ่ขซ่ง†ไธบๆฒกๆœ‰ๅฎ‰ๅ…จไธฅ้‡ๆ€งใ€‚

๏ผˆๅฑžไบŽresult ๅฏน่ฑก๏ผ‰็š„็ˆถ็บงใ€‚

ๆฏไธช result ๅฏน่ฑก้ƒฝๅŒ…ๅซไปฃ็ ๅบ“ไธญไธ€ไธช่ญฆๆŠฅ็š„่ฏฆ็ป†ไฟกๆฏใ€‚ ๅœจ results ๅฏน่ฑกไธญ๏ผŒๅฏไปฅๅผ•็”จๆฃ€ๆต‹ๅˆฐ่ญฆๆŠฅ็š„่ง„ๅˆ™ใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…ไธŠ้ข็š„โ€œไบ†่งฃ่ง„ๅˆ™ๅ’Œ็ป“ๆžœโ€ใ€‚

ๅฏไปฅๆฃ€ๆŸฅ SARIF ๅฑžๆ€งๆ˜ฏๅฆๅ…ทๆœ‰ๆ”ฏๆŒไธŠไผ ็š„ๅคงๅฐ๏ผŒไปฅๅŠ่ฏฅๆ–‡ไปถๆ˜ฏๅฆไธŽไปฃ็ ๆ‰ซๆๅ…ผๅฎนใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๅฏนไปฃ็ ๆ‰ซๆ็š„ SARIF ๆ”ฏๆŒโ€ใ€‚

ๅ็งฐๅฟ…้œ€่ฏดๆ˜Ž
ruleId่ง„ๅˆ™็š„ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆ (reportingDescriptor.id)ใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… reportingDescriptor ๅฏน่ฑกใ€‚ Code scanning ไฝฟ็”จ่ง„ๅˆ™ๆ ‡่ฏ†็ฌฆๅœจ GitHub ไธŠๆŒ‰่ง„ๅˆ™็ญ›้€‰็ป“ๆžœใ€‚
ruleIndexๅทฅๅ…ท็ป„ไปถ rules ๆ•ฐ็ป„ไธญๅ…ณ่”่ง„ๅˆ™๏ผˆreportingDescriptor ๅฏน่ฑก๏ผ‰็š„็ดขๅผ•ใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… run ๅฏน่ฑกใ€‚ ๆญคๅฑžๆ€ง็š„ๅ…่ฎธ่Œƒๅ›ด 0 ๅˆฐ 2^63 - 1ใ€‚
rule็”จไบŽๅฎšไฝๆญค็ป“ๆžœ็š„่ง„ๅˆ™๏ผˆๆŠฅๅ‘Šๆ่ฟฐ็ฌฆ๏ผ‰็š„ๅผ•็”จใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… reportingDescriptor ๅฏน่ฑกใ€‚
level็ป“ๆžœ็š„ไธฅ้‡ๆ€งใ€‚ ๆญค็บงๅˆซ่ฆ†็›–่ง„ๅˆ™ๅฎšไน‰็š„้ป˜่ฎคไธฅ้‡็จ‹ๅบฆใ€‚ Code scanning ไฝฟ็”จ็บงๅˆซๅœจ GitHub ไธŠๆŒ‰ไธฅ้‡ๆ€ง็ญ›้€‰็ป“ๆžœใ€‚
message.textๆ่ฟฐ็ป“ๆžœ็š„ๆถˆๆฏใ€‚ Code scanning ๆ˜พ็คบๆถˆๆฏๆ–‡ๆœฌไฝœไธบ็ป“ๆžœ็š„ๆ ‡้ข˜ใ€‚ ๅฝ“ๅฏ่ง็ฉบ้—ดๆœ‰้™ๆ—ถ๏ผŒไป…ๆ˜พ็คบๆถˆๆฏ็š„็ฌฌไธ€ๅฅใ€‚
locations[]ๆœ€ๅคšๅฏไปฅๆฃ€ๆต‹ๅˆฐ 10 ไธช็ป“ๆžœ็š„ไฝ็ฝฎ้›†ใ€‚ ๅบ”ๅชๅŒ…ๅซไธ€ไธชไฝ็ฝฎ๏ผŒ้™ค้žๅช่ƒฝ้€š่ฟ‡ๅœจๆฏไธชๆŒ‡ๅฎšไฝ็ฝฎ่ฟ›่กŒๆ›ดๆ”นๆฅๆ›ดๆญฃ้—ฎ้ข˜ใ€‚ ๆณจๆ„๏ผš code scanning ่‡ณๅฐ‘้œ€่ฆไธ€ไธชไฝ็ฝฎๆ‰่ƒฝๆ˜พ็คบ็ป“ๆžœใ€‚ Code scanning ๅฐ†ไฝฟ็”จๆญคๅฑžๆ€งๆฅๅ†ณๅฎš่ฆ็”จ็ป“ๆžœๆณจ้‡Šๅ“ชไธชๆ–‡ไปถใ€‚ ไป…ไฝฟ็”จๆญคๆ•ฐ็ป„็š„็ฌฌไธ€ไธชๅ€ผใ€‚ ๆ‰€ๆœ‰ๅ…ถไป–ๅ€ผ้ƒฝ่ขซๅฟฝ็•ฅใ€‚
partialFingerprintsไธ€็ป„ๅญ—็ฌฆไธฒ๏ผŒ็”จไบŽ่ทŸ่ธช็ป“ๆžœ็š„ๅ”ฏไธ€ๆ ‡่ฏ†ใ€‚ Code scanning ไฝฟ็”จ partialFingerprints ๅ‡†็กฎๅœฐ่ฏ†ๅˆซๅœจๆไบคๅ’Œๅˆ†ๆ”ฏไน‹้—ด็›ธๅŒ็š„็ป“ๆžœใ€‚ Code scanning ๅฐ†ๅฐ่ฏ•ไฝฟ็”จ partialFingerprints๏ผˆๅฆ‚ๆžœๅญ˜ๅœจ๏ผ‰ใ€‚ ๅฆ‚ๆžœไฝฟ็”จ upload-action ไธŠไผ ็ฌฌไธ‰ๆ–น SARIF ๆ–‡ไปถ๏ผŒๅฝ“่ฟ™ไบ›ๆ–‡ไปถๆœชๅŒ…ๅซๅœจ SARIF ๆ–‡ไปถไธญๆ—ถ๏ผŒ่ฏฅๆ“ไฝœๅฐ†ไธบไฝ ๅˆ›ๅปบ partialFingerprintsใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๆไพ›็”จไบŽ่ทจ่ฟ่กŒ่ทŸ่ธชไปฃ็ ๆ‰ซๆ่ญฆๆŠฅ็š„ๆ•ฐๆฎโ€ใ€‚ ๆณจๆ„๏ผšCode scanning ไป…ไฝฟ็”จ primaryLocationLineHashใ€‚
codeFlows[].threadFlows[].locations[]threadFlow ๅฏน่ฑก็š„ location ๅฏน่ฑกๆ•ฐ็ป„๏ผŒ้€š่ฟ‡ๆ‰ง่กŒ็บฟ็จ‹ๆ่ฟฐ็จ‹ๅบ่ฟ›ๅบฆใ€‚ codeFlow ๅฏน่ฑกๆ่ฟฐ็”จไบŽๆฃ€ๆต‹็ป“ๆžœ็š„ไปฃ็ ๆ‰ง่กŒๆจกๅผใ€‚ ๅฆ‚ๆžœๆไพ›ไบ†ไปฃ็ ๆต๏ผŒcode scanning ๅฐ†ๅœจ GitHub ไธŠๆ‰ฉๅฑ•ไปฃ็ ๆตไปฅ่Žทๅ–็›ธๅ…ณ็ป“ๆžœใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… location ๅฏน่ฑกใ€‚
relatedLocations[]ไธŽๆญค็ป“ๆžœ็›ธๅ…ณ็š„ไธ€็ป„ไฝ็ฝฎใ€‚ ๅฝ“็›ธๅ…ณไฝ็ฝฎๅตŒๅ…ฅๅœจ็ป“ๆžœๆถˆๆฏไธญๆ—ถ๏ผŒCode scanning ๅฐ†้“พๆŽฅๅˆฐ่ฟ™ไบ›ไฝ็ฝฎใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… location ๅฏน่ฑกใ€‚

๏ผˆๅฑžไบŽlocation ๅฏน่ฑก๏ผ‰็š„็ˆถ็บงใ€‚

็ผ–็จ‹ๆž„ไปถไธญ็š„ไฝ็ฝฎ๏ผŒไพ‹ๅฆ‚ไป“ๅบ“ไธญ็š„ๆ–‡ไปถๆˆ–ๅœจๆž„ๅปบ่ฟ‡็จ‹ไธญ็”Ÿๆˆ็š„ๆ–‡ไปถใ€‚

ๅ็งฐๅฟ…้œ€่ฏดๆ˜Ž
location.id็”จไบŽๅœจๅ•ไธช็ป“ๆžœๅฏน่ฑกไธญๅŒบๅˆ†ๆญคไฝ็ฝฎไธŽๆ‰€ๆœ‰ๅ…ถไป–ไฝ็ฝฎ็š„ๅ”ฏไธ€ๆ ‡่ฏ†็ฌฆใ€‚ ๆญคๅฑžๆ€ง็š„ๅ…่ฎธ่Œƒๅ›ด 0 ๅˆฐ 2^63 - 1ใ€‚
location.physicalLocationๆ ‡่ฏ†ๆž„ไปถๅ’ŒๅŒบๅŸŸใ€‚ ๆœ‰ๅ…ณ่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… physicalLocationใ€‚
location.message.textไธŽไฝ็ฝฎ็›ธๅ…ณ็š„ๆถˆๆฏใ€‚

๏ผˆๅฑžไบŽphysicalLocation ๅฏน่ฑก๏ผ‰็š„็ˆถ็บงใ€‚

ๅ็งฐๅฟ…้œ€่ฏดๆ˜Ž
artifactLocation.uri่กจ็คบๆž„ไปถไฝ็ฝฎ็š„ URI๏ผŒ้€šๅธธๆ˜ฏๅญ˜ๅ‚จๅบ“ไธญๆˆ–ๅœจๆž„ๅปบๆœŸ้—ด็”Ÿๆˆ็š„ๆ–‡ไปถใ€‚ ไธบไบ†่Žทๅพ—ๆœ€ไฝณ็ป“ๆžœ๏ผŒๅปบ่ฎฎ่ฟ™ๆ˜ฏๆ‰€ๅˆ†ๆž็š„ GitHub ๅญ˜ๅ‚จๅบ“ๆ น็š„็›ธๅฏน่ทฏๅพ„ใ€‚ ไพ‹ๅฆ‚๏ผŒsrc/main.jsใ€‚ ๆœ‰ๅ…ณ้กน็›ฎ URI ็š„่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜…โ€œๆŒ‡ๅฎšๆบๆ–‡ไปถ็š„ๆ นโ€ใ€‚
region.startLineๅŒบๅŸŸไธญ็ฌฌไธ€ไธชๅญ—็ฌฆ็š„่กŒๅทใ€‚
region.startColumnๅŒบๅŸŸไธญ็ฌฌไธ€ไธชๅญ—็ฌฆ็š„ๅˆ—ๅทใ€‚
region.endLineๅŒบๅŸŸไธญๆœ€ๅŽไธ€ไธชๅญ—็ฌฆ็š„่กŒๅทใ€‚
region.endColumnๅŒบๅŸŸๆœซๅฐพๅŽ้ข็š„ๅญ—็ฌฆ็š„ๅˆ—ๅทใ€‚

๏ผˆๅฑžไบŽrunAutomationDetails ๅฏน่ฑก๏ผ‰็š„็ˆถ็บงใ€‚

runAutomationDetails ๅฏน่ฑกๅŒ…ๅซๆŒ‡ๅฎš่ฟ่กŒๆ ‡่ฏ†็š„ไฟกๆฏใ€‚

ๅ็งฐๅฟ…้œ€่ฏดๆ˜Ž
idๆ ‡่ฏ†ๅˆ†ๆžๅ’Œ่ฟ่กŒ ID ็ฑปๅˆซ็š„ๅญ—็ฌฆไธฒใ€‚ ๅฆ‚ๆžœๆ‚จๆƒณ่ฆไธบๅŒไธ€ๅทฅๅ…ทไธŠไผ ๅคšไธช SARIF ๆ–‡ไปถ๏ผŒไฝ†ๅœจไธๅŒ่ฏญ่จ€ๆˆ–ไปฃ็ ็š„ไธๅŒ้ƒจๅˆ†ๆ‰ง่กŒ๏ผŒ่ฏทไฝฟ็”จใ€‚

ไฝฟ็”จ runAutomationDetails ๅฏน่ฑกๆ˜ฏๅฏ้€‰็š„ใ€‚

id ๅญ—ๆฎตๅฏไปฅๅŒ…ๅซๅˆ†ๆž็ฑปๅˆซๅ’Œ่ฟ่กŒ IDใ€‚ ๆˆ‘ไปฌไธไฝฟ็”จ id ๅญ—ๆฎต็š„่ฟ่กŒ ID ้ƒจๅˆ†๏ผŒไฝ†ไผšๅญ˜ๅ‚จๅฎƒใ€‚

ไฝฟ็”จ็ฑปๅˆซๆฅๅŒบๅˆ†ๅŒไธ€ๅทฅๅ…ทๆˆ–ๆไบค็š„ๅคšๆฌกๅˆ†ๆž๏ผŒไฝ†ๆ˜ฏๅœจไธๅŒ่ฏญ่จ€ๆˆ–ไปฃ็ ็š„ไธๅŒ้ƒจๅˆ†่ฟ›่กŒใ€‚ ไฝฟ็”จ่ฟ่กŒ ID ๆฅ่ฏ†ๅˆซๅˆ†ๆž็š„็‰นๅฎš่ฟ่กŒ๏ผŒไพ‹ๅฆ‚ๅˆ†ๆž็š„่ฟ่กŒๆ—ฅๆœŸใ€‚

id ่งฃ้‡Šไธบ category/run-idใ€‚ ๅฆ‚ๆžœ id ไธๅŒ…ๅซๆญฃๆ–œๆ  (/)๏ผŒๅˆ™ๆ•ดไธชๅญ—็ฌฆไธฒไธบ run_id๏ผŒ่€Œ category ไธบ็ฉบใ€‚ ๅฆๅˆ™๏ผŒcategory ๆ˜ฏๅญ—็ฌฆไธฒไธญ็›ดๅˆฐๆœ€ๅŽไธ€ไธชๆญฃๆ–œๆ ็š„ๆ‰€ๆœ‰ๅ†…ๅฎน๏ผŒ่€Œ run_id ๆ˜ฏไน‹ๅŽ็š„ๆ‰€ๆœ‰ๅ†…ๅฎนใ€‚

idcategoryrun_id
my-analysis/tool1/2022-01-02my-analysis/tool12022-01-02
my-analysis/tool1/my-analysis/tool1ๆ— 
my-analysis for tool1ๆ— my-analysis for tool1
  • id ไธบโ€œmy-analysis/tool1/2021-02-01โ€็š„่ฟ่กŒๅฑžไบŽ็ฑปๅˆซโ€œmy-analysis/tool1โ€ใ€‚
  • id ไธบโ€œmy-analysis/tool1/โ€็š„่ฟ่กŒๅฑžไบŽ็ฑปๅˆซโ€œmy-analysis/tool1โ€๏ผŒไฝ†ๆœชไธŽ่ฏฅ็ฑปๅˆซไธญ็š„ๅ…ถไป–่ฟ่กŒๅŒบๅˆ†ใ€‚
  • id ไธบโ€œmy-analysis for tool1โ€็š„่ฟ่กŒๅ…ทๆœ‰ๅ”ฏไธ€็š„ๆ ‡่ฏ†็ฌฆ๏ผŒไฝ†ๆ— ๆณ•ๆŽจๆ–ญๅฑžไบŽไปปไฝ•็ฑปๅˆซใ€‚

ๆœ‰ๅ…ณ runAutomationDetails ๅฏน่ฑกๅ’Œ id ๅญ—ๆฎต็š„่ฏฆ็ป†ไฟกๆฏ๏ผŒ่ฏทๅ‚้˜… OASIS ๆ–‡ๆกฃไธญ็š„ runAutomationDetails ๅฏน่ฑกใ€‚

่ฏทๆณจๆ„๏ผŒๅฐ†ๅฟฝ็•ฅๅ…ถไฝ™ๆ”ฏๆŒ็š„ๅญ—ๆฎตใ€‚

SARIF ่พ“ๅ‡บๆ–‡ไปถ็คบไพ‹

่ฟ™ไบ›็คบไพ‹ SARIF ่พ“ๅ‡บๆ–‡ไปถๆ˜พ็คบๆ”ฏๆŒ็š„ๅฑžๆ€งๅ’Œ็คบไพ‹ๅ€ผใ€‚

ๅ…ทๆœ‰ๆœ€ๅฐ‘ๅฟ…้œ€ๅฑžๆ€ง็š„็คบไพ‹

ๆญค SARIF ่พ“ๅ‡บๆ–‡ไปถ็š„็คบไพ‹ๅ€ผๆ˜พ็คบไบ† code scanning ็ป“ๆžœๆญฃๅธธ่ฟ่กŒๆ‰€้œ€็š„ๆœ€ๅฐ‘ๅฑžๆ€งใ€‚ ๅฆ‚ๆžœ็งป้™คไปปไฝ•ๅฑžๆ€งใ€็œ็•ฅๅ€ผๆˆ–ไฝฟ็”จ็ฉบๅญ—็ฌฆไธฒ๏ผŒๆญคๆ•ฐๆฎๅฐ†ๆ— ๆณ•ๆญฃ็กฎๆ˜พ็คบๆˆ–ๅœจ GitHub ไธŠๅŒๆญฅใ€‚

{
  "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
  "version": "2.1.0",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "Tool Name",
          "rules": [
            {
              "id": "R01"
                      ...
              "properties" : {
                 "id" : "java/unsafe-deserialization",
                 "kind" : "path-problem",
                 "name" : "...",
                 "problem.severity" : "error",
                 "security-severity" : "9.8",
               }
            }
          ]
        }
      },
      "results": [
        {
          "ruleId": "R01",
          "message": {
            "text": "Result text. This result does not have a rule associated."
          },
          "locations": [
            {
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "fileURI"
                },
                "region": {
                  "startLine": 2,
                  "startColumn": 7,
                  "endColumn": 10
                }
              }
            }
          ],
          "partialFingerprints": {
            "primaryLocationLineHash": "39fa2ee980eb94b0:1"
          }
        }
      ]
    }
  ]
}

SARIF ็”Ÿๆˆ่€…็š„็›ธๅฏน URI ๆŒ‡ๅ—

ๆญค SARIF ่พ“ๅ‡บๆ–‡ไปถๆไพ›ไบ†ๅญ—ๆฎต originalUriBaseIds็š„ๅ€ผ็คบไพ‹๏ผŒๅ…ถไธญๆ˜พ็คบไบ†ไฝฟ็”จ็›ธๅฏน URI ๅผ•็”จๆ—ถ SARIF ็”Ÿๆˆ่€…ๅบ”ๅŒ…ๅซ็š„ๆœ€ไฝŽ่ฆๆฑ‚ๅฑžๆ€งใ€‚

ๆณจๆ„

่™ฝ็„ถ GitHub ไธ้œ€่ฆๆญคๅฑžๆ€งไพฟ่ƒฝๆญฃ็กฎๆ˜พ็คบ code scanning ็ป“ๆžœ๏ผŒไฝ†ๅœจไฝฟ็”จ็›ธๅฏน URI ๅผ•็”จๆ—ถๅฟ…้œ€ๆœ‰ๆญคๅฑžๆ€งๆ‰่ƒฝ็”Ÿๆˆๆœ‰ๆ•ˆ็š„ SARIF ่พ“ๅ‡บใ€‚

{
  "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
  "version": "2.1.0",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "Tool Name",
          "rules": [
            {
              "id": "R01"
                      ...
              "properties" : {
                 "id" : "java/unsafe-deserialization",
                 "kind" : "path-problem",
                 "name" : "...",
                 "problem.severity" : "error",
                 "security-severity" : "9.8",
               }
            }
          ]
        }
      },
      "originalUriBaseIds": {
        "PROJECTROOT": {
         "uri": "file:///C:/Users/Mary/code/TheProject/",
           "description": {
             "text": "The root directory for all project files."
           }
        },
         "%SRCROOT%": {
           "uri": "src/",
           "uriBaseId": "PROJECTROOT",
           "description": {
             "text": "The root of the source tree."
           }
         }
      },
      "results": [
        {
          "ruleId": "R01",
          "message": {
            "text": "Result text. This result does not have a rule associated."
          },
          "locations": [
            {
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "fileURI",
                  "uriBaseId": "%SRCROOT%"
                },
                "region": {
                  "startLine": 2,
                  "startColumn": 7,
                  "endColumn": 10
                }
              }
            }
          ],
          "partialFingerprints": {
            "primaryLocationLineHash": "39fa2ee980eb94b0:1"
          }
        }
      ]
    }
  ]
}

ๆ˜พ็คบๆ‰€ๆœ‰ๆ”ฏๆŒ็š„ SARIF ๅฑžๆ€ง็š„็คบไพ‹

ๆญค SARIF ่พ“ๅ‡บๆ–‡ไปถ็š„็คบไพ‹ๅ€ผๆ˜พ็คบไบ† code scanning ็š„ๆ‰€ๆœ‰ๅ—ๆ”ฏๆŒ SARIF ๅฑžๆ€งใ€‚

{
  "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
  "version": "2.1.0",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "Tool Name",
          "semanticVersion": "2.0.0",
          "rules": [
            {
              "id": "3f292041e51d22005ce48f39df3585d44ce1b0ad",
              "name": "js/unused-local-variable",
              "shortDescription": {
                "text": "Unused variable, import, function or class"
              },
              "fullDescription": {
                "text": "Unused variables, imports, functions or classes may be a symptom of a bug and should be examined carefully."
              },
              "defaultConfiguration": {
                "level": "note"
              },
              "properties": {
                "tags": [
                  "maintainability"
                ],
                "precision": "very-high"
              }
            },
            {
              "id": "d5b664aefd5ca4b21b52fdc1d744d7d6ab6886d0",
              "name": "js/inconsistent-use-of-new",
              "shortDescription": {
                "text": "Inconsistent use of 'new'"
              },
              "fullDescription": {
                "text": "If a function is intended to be a constructor, it should always be invoked with 'new'. Otherwise, it should always be invoked as a normal function, that is, without 'new'."
              },
              "properties": {
                "tags": [
                  "reliability",
                  "correctness",
                  "language-features"
                ],
                "precision": "very-high"
              }
            },
            {
              "id": "R01"
            }
          ]
        }
      },
      "automationDetails": {
        "id": "my-category/"
      },
      "results": [
        {
          "ruleId": "3f292041e51d22005ce48f39df3585d44ce1b0ad",
          "ruleIndex": 0,
          "message": {
            "text": "Unused variable foo."
          },
          "locations": [
            {
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "main.js",
                  "uriBaseId": "%SRCROOT%"
                },
                "region": {
                  "startLine": 2,
                  "startColumn": 7,
                  "endColumn": 10
                }
              }
            }
          ],
          "partialFingerprints": {
            "primaryLocationLineHash": "39fa2ee980eb94b0:1",
            "primaryLocationStartColumnFingerprint": "4"
          }
        },
        {
          "ruleId": "d5b664aefd5ca4b21b52fdc1d744d7d6ab6886d0",
          "ruleIndex": 1,
          "message": {
            "text": "Function resolvingPromise is sometimes invoked as a constructor (for example [here](1)), and sometimes as a normal function (for example [here](2))."
          },
          "locations": [
            {
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "src/promises.js",
                  "uriBaseId": "%SRCROOT%"
                },
                "region": {
                  "startLine": 2
                }
              }
            }
          ],
          "partialFingerprints": {
            "primaryLocationLineHash": "5061c3315a741b7d:1",
            "primaryLocationStartColumnFingerprint": "7"
          },
          "relatedLocations": [
            {
              "id": 1,
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "src/ParseObject.js",
                  "uriBaseId": "%SRCROOT%"
                },
                "region": {
                  "startLine": 2281,
                  "startColumn": 33,
                  "endColumn": 55
                }
              },
              "message": {
                "text": "here"
              }
            },
            {
              "id": 2,
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "src/LiveQueryClient.js",
                  "uriBaseId": "%SRCROOT%"
                },
                "region": {
                  "startLine": 166
                }
              },
              "message": {
                "text": "here"
              }
            }
          ]
        },
        {
          "ruleId": "R01",
          "message": {
            "text": "Specifying both [ruleIndex](1) and [ruleId](2) might lead to inconsistencies."
          },
          "level": "error",
          "locations": [
            {
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "full.sarif",
                  "uriBaseId": "%SRCROOT%"
                },
                "region": {
                  "startLine": 54,
                  "startColumn": 10,
                  "endLine": 55,
                  "endColumn": 25
                }
              }
            }
          ],
          "relatedLocations": [
            {
              "id": 1,
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "full.sarif"
                },
                "region": {
                  "startLine": 81,
                  "startColumn": 10,
                  "endColumn": 18
                }
              },
              "message": {
                "text": "here"
              }
            },
            {
              "id": 2,
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "full.sarif"
                },
                "region": {
                  "startLine": 82,
                  "startColumn": 10,
                  "endColumn": 21
                }
              },
              "message": {
                "text": "here"
              }
            }
          ],
          "codeFlows": [
            {
              "threadFlows": [
                {
                  "locations": [
                    {
                      "location": {
                        "physicalLocation": {
                          "region": {
                            "startLine": 11,
                            "endLine": 29,
                            "startColumn": 10,
                            "endColumn": 18
                          },
                          "artifactLocation": {
                            "uriBaseId": "%SRCROOT%",
                            "uri": "full.sarif"
                          }
                        },
                        "message": {
                          "text": "Rule has index 0"
                        }
                      }
                    },
                    {
                      "location": {
                        "physicalLocation": {
                          "region": {
                            "endColumn": 47,
                            "startColumn": 12,
                            "startLine": 12
                          },
                          "artifactLocation": {
                            "uriBaseId": "%SRCROOT%",
                            "uri": "full.sarif"
                          }
                        }
                      }
                    }
                  ]
                }
              ]
            }
          ],
          "partialFingerprints": {
            "primaryLocationLineHash": "ABC:2"
          }
        }
      ],
      "columnKind": "utf16CodeUnits"
    }
  ]
}