跳至主要内容

解决代码扫描警报

在安全视图中,您可以查看、修复或忽略项目代码中潜在漏洞或错误的警报。

谁可以使用此功能?

具有 写入 访问权限的用户

为代码扫描警报生成建议的修复方案

GitHub Copilot Autofix 可以为代码扫描分析识别的警报生成修复。大多数 CodeQL 警报类型均受支持。参见 关于 Copilot Autofix 在代码扫描中的使用

注意

使用 GitHub Copilot Autofix 无需 GitHub Copilot 订阅。Copilot Autofix 对 GitHub.com 上的所有公共仓库以及拥有 GitHub 代码安全许可证的组织和企业内部或私有仓库均可使用。

  1. 在 GitHub 上,导航至仓库的主页面。
  2. 在仓库名称下,点击 安全与质量 选项卡。如果您看不到 “在 “安全与质量” 选项卡中,选择 下拉菜单,然后点击 安全与质量
  3. 在左侧边栏,点击 代码扫描
  4. 点击警报的名称。
  5. 如果 Copilot Autofix 能够提供修复建议,在页面顶部点击 生成修复
  6. 生成建议的修复后,在页面底部,您可以点击 创建带修复的 PR,自动生成包含该修复的拉取请求。系统会从默认分支创建一个新分支,提交生成的修复,并创建一个草稿拉取请求。您可以像处理其他修复一样测试和编辑此建议的修复。

您也可以使用 Autofix API 的历史警报端点来生成、获取和提交建议的修复。

Copilot Autofix 并不能在所有情况下为每一个警报生成修复。此功能以最大努力的方式提供,不能保证 100% 成功。有关自动生成修复的局限性信息,请参见 建议的局限性

将警报分配给 Copilot 云代理

注意

此选项目前处于公开预览阶段,可能会有变更。Copilot 云代理必须在仓库中可用。

您可以指派 Copilot 来应用自动修复。Copilot 会分析代码扫描警报,制定修复计划,并在拉取请求中实现必要的代码更改。

  1. 在 GitHub 上,导航至仓库的主页面。
  2. 在仓库名称下,点击 安全与质量 选项卡。如果您看不到 “在 “安全与质量” 选项卡中,选择 下拉菜单,然后点击 安全与质量
  3. 在左侧边栏,点击 代码扫描
  4. 点击警报的名称。
  5. 如果尚未生成自动修复且 Copilot Autofix 能够提供修复建议,在页面顶部点击 生成修复
  6. 在右侧菜单中,点击 受让人
  7. 选择 “Copilot”。

在 30 秒之内,Copilot 将打开一个拉取请求来处理该警报,并在其中包含修复概要以及所做更改的详细信息。创建后,拉取请求会显示在 “开发” 区域。

手动修复警报

任何具有仓库写入权限的人都可以通过提交代码更正来修复警报。如果仓库已配置在拉取请求上运行代码扫描,最好通过拉取请求提交更正。这将触发对更改的代码扫描分析,并验证您的修复不会引入新的问题。更多信息请参见 在拉取请求中对代码扫描警报进行分流

您可以使用自由文本搜索或过滤器显示警报子集,然后一次性将所有匹配的警报标记为已关闭。

警报可能在某个分支已修复,而在另一个分支未修复。您可以在警报汇总页面使用 “branch” 过滤器,检查某个分支上是否已修复该警报。

Screenshot of alerts view with the branch options expanded. The "branch" filter is underlined with dark orange.

请注意,如果您在非默认分支上过滤了警报,但相同的警报在默认分支上也存在,则任意警报的警报页面仍只会显示默认分支上的状态,即使该状态与非默认分支的状态冲突。例如,在 branch-x 的警报汇总列表中显示为 “打开” 的警报,在默认分支上已修复时,其警报页面会显示 “已修复”。您可以在警报页面右侧的 受影响分支 部分查看您所过滤的分支对应的状态。

注意

如果您使用多个配置运行代码扫描,同一个警报有时会被多个配置生成。除非您定期运行所有配置,否则可能会看到在某些配置中已修复而在其他配置中仍未修复的警报。这些过时的配置和警报可以从分支中移除。更多信息请参见 从分支中移除过时的配置和警报

忽略警报

关闭警报有两种方式。您可以在代码中修复问题,也可以直接忽略警报。

忽略警报是一种关闭您认为无需修复的警报的方式。例如,仅在测试中使用的代码出现错误,或修复该错误的工作量大于改进代码的潜在收益。您可以从代码中的代码扫描注释或从 安全与质量 选项卡中忽略警报。

当您忽略警报时

  • 它将在所有分支中被忽略。
  • 该警报将从项目的当前警报计数中移除。
  • 该警报会被移动到警报汇总页面的 “已关闭” 列表,您可以在需要时重新打开它。
  • 关闭警报的原因会被记录。
  • 您可以选择对忽略操作添加评论,以记录警报被忽略的背景。
  • 下次代码扫描运行时,相同的代码将不会再生成警报。

忽略警报的方法

  1. 在 GitHub 上,导航至仓库的主页面。

  2. 在仓库名称下,点击 安全与质量 选项卡。如果您看不到 “在 “安全与质量” 选项卡中,选择 下拉菜单,然后点击 安全与质量

  3. 在左侧边栏,点击 代码扫描

  4. 如果您想忽略警报,首先需要仔细查看该警报,以便选择正确的忽略原因。点击您想要查看的警报。

  5. 审阅警报后,点击 忽略警报 并选择或输入关闭警报的原因。

    Screenshot of an alert check failure. The "Dismiss alert" button is highlighted in dark orange and the dismiss drop-down displayed.
    从下拉菜单中选择合适的原因非常重要,因为这可能影响查询是否会继续包含在后续分析中。您也可以选择对忽略操作添加评论,以记录警报被忽略的上下文。该评论会添加到警报时间轴,可在审计和报告时作为依据。您可以通过代码扫描 REST API 获取或设置评论。评论位于 dismissed_comment 字段,针对 alerts/{alert_number} 端点。更多信息请参见 代码扫描的 REST API 端点

    如果您将 CodeQL 警报标记为误报(例如因为代码使用了不受支持的净化库),请考虑向 CodeQL 仓库贡献代码以改进分析。更多关于 CodeQL 的信息,请参见 为 CodeQL 做贡献

一次性忽略多个警报

如果项目中有多个警报需要出于相同原因一起忽略,您可以在警报汇总页面批量忽略它们。通常的做法是先过滤列表,然后忽略所有匹配的警报。例如,您可能希望一次性忽略所有已标记为特定 CWE 漏洞的当前警报。

重新打开已忽略的警报

如果您已忽略某个警报,但随后发现需要修复它,您可以重新打开该警报并进行代码修复。显示已关闭警报列表,找到并打开该警报,然后重新打开。随后即可像处理其他警报一样修复它。

从分支中移除过时的配置和警报

您可能在单个仓库中配置了多个代码扫描配置。运行时,这些配置可能会生成相同的警报。此外,如果各配置的运行周期不同,某些不常运行或已失效的配置的警报状态可能会过时。更多关于来自多个配置的警报信息,请参见 关于代码扫描警报

  1. 在 GitHub 上,导航至仓库的主页面。

  2. 在仓库名称下,点击 安全与质量 选项卡。如果您看不到 “在 “安全与质量” 选项卡中,选择 下拉菜单,然后点击 安全与质量

  3. 在左侧边栏,点击 代码扫描

  4. 在 “代码扫描” 下,点击任意代码扫描警报。

  5. 在侧边栏的 “受影响分支” 部分,点击所需的分支。

  6. 在 “正在分析的配置” 对话框中,查看所选分支上报告此警报的配置详情。若要删除该分支上不需要的配置,请点击.

    如果误删了配置,点击 Cancel 以避免应用更改。

    Screenshot of the "Configurations analyzing" modal. The "Delete configuration" icon is outlined in dark orange.

  7. 当您删除完所有不需要的配置并确认显示的是期望的配置后,点击 Save changes

    如果在误删配置后保存了更改,请重新运行该配置以更新警报。有关使用 GitHub Actions 的配置重新运行的更多信息,请参见 重新运行工作流和作业

注意

  • 如果您删除了仓库默认分支的所有代码扫描配置,默认分支仍会保留在 “受影响分支” 侧边栏中,但不会再被任何配置分析。
  • 如果您删除了仓库中除默认分支之外的所有代码扫描配置,该分支将会从 “受影响分支” 侧边栏中移除。

延伸阅读

© . This site is unofficial and not affiliated with GitHub, Inc.