Skip to main content

查找并修复第一个代码漏洞

了解通过解析 code scanning 演示存储库中的警报来保护代码的基础知识。

在学习编码的过程中,不小心在项目中引入漏洞是很正常的。 如果在分享工作之前不解决这些安全问题,攻击者就会利用它们操纵代码并访问敏感数据,因此尽快识别并修补非常重要。

值得庆幸的是,有些工具可以在你的公共存储库中自动查找、解释甚至修复漏洞。 本教程中,您将学习如何通过code scanning来确保工作安全。

设置演示仓库

让我们从复刻一个存在安全漏洞的演示项目开始。 此项目生成一个简单的网页,但由于我们不会部署项目,因此本练习不存在安全风险****。

  1. 导航到 new2code/code-scanning-demo 仓库。
  2. 在页面右上角,单击 “分叉”。
  3. 在出现的页面中,单击“Create fork”****。

查找代码中的漏洞

设置项目后,让我们启用您的派生版本中的code scanning 来检查代码中的漏洞。

  1.        GitHub返回,在存储库的主页上,单击**<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-shield" aria-label="shield" role="img"><path d="M7.467.133a1.748 1.748 0 0 1 1.066 0l5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667Zm.61 1.429a.25.25 0 0 0-.153 0l-5.25 1.68a.25.25 0 0 0-.174.238V7c0 1.358.275 2.666 1.057 3.86.784 1.194 2.121 2.34 4.366 3.297a.196.196 0 0 0 .154 0c2.245-.956 3.582-2.104 4.366-3.298C13.225 9.666 13.5 8.36 13.5 7V3.48a.251.251 0 0 0-.174-.237l-5.25-1.68ZM8.75 4.75v3a.75.75 0 0 1-1.5 0v-3a.75.75 0 0 1 1.5 0ZM9 10.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg> Security and quality**。
    
  2. 在“Code scanning 警报”行中,单击设置code scanning
  3. 在“工具”部分的“CodeQL 分析”旁边,选择“ 设置”,然后单击“ 默认”。
  4. 在显示的弹出窗口中,单击“ 启用 CodeQL”。 这会触发扫描 GitHub Actions 代码中的漏洞的工作流。
  5. 若要检查工作流的状态,请在导航栏中单击“ 操作”。
  6. 工作流完成后,在导航栏中单击 Security and quality
  7.        code scanning若要查看工作流发现的警报,请在侧导航中单击<svg version="1.1" width="16" height="16" viewBox="0 0 16 16" class="octicon octicon-codescan" aria-label="codescan icon" role="img"><path d="M8.47 4.97a.75.75 0 0 0 0 1.06L9.94 7.5 8.47 8.97a.75.75 0 1 0 1.06 1.06l2-2a.75.75 0 0 0 0-1.06l-2-2a.75.75 0 0 0-1.06 0ZM6.53 6.03a.75.75 0 0 0-1.06-1.06l-2 2a.75.75 0 0 0 0 1.06l2 2a.75.75 0 1 0 1.06-1.06L5.06 7.5l1.47-1.47Z"></path><path d="M12.246 13.307a7.501 7.501 0 1 1 1.06-1.06l2.474 2.473a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215ZM1.5 7.5a6.002 6.002 0 0 0 3.608 5.504 6.002 6.002 0 0 0 6.486-1.117.748.748 0 0 1 .292-.293A6 6 0 1 0 1.5 7.5Z"></path></svg>**Code scanning**,然后单击 **“反射跨站点脚本**”。
    

          code scanning了解警报

更何况 code scanning 已识别出了代码中的漏洞,接下来我们分解警报中提供的信息。

位置

警报显示文件的小预览,重点展示造成漏洞的代码行。 在我们的案例中,在 index.js 文件的第 8 行检测到了漏洞,我们在该行实现了网站中用户提供的输入。

如果我们仔细观察,就会发现根本问题出现在第 7 行,即我们在未检查恶意代码的情况下将 greet 分配给用户输入。 若要查看代码中漏洞的分步视图,请在漏洞行下方的弹出窗口中单击“显示路径”****。

code scanning 警报位置的屏幕截图。 “Show paths”按钮以橙色框出。

描述和建议

在文件预览下方, code scanning 提供漏洞的更详细说明。 若要查看建议的修补程序,以及易受攻击和固定代码的示例,请单击“ 显示更多”。

code scanning 警报详细信息的屏幕截图。 标有“Show more”的下拉列表以橙色框出。

在我们的案例中,建议是在使用前清理用户输入。 这意味着我们需要检查输入是否有恶意代码,然后在必要时进行清理。

提示

如果你不完全了解建议的修补程序,请尝试 请求 Copilot对话 解释它。

时间线

最后,可以在页面底部看到警报的时间线。 时间线包含首次检测到漏洞的提交记录,并在我们修复漏洞时自动更新。

code scanning 警报时间线的屏幕截图。

自动修复漏洞

为了快速和轻松地保护我们的项目,让我们使用GitHub Copilot自动修复来处理code scanning。

  1. 在警报标题下方的框中,建议你“使用Copilot自动修复加快对此CodeQL警报的修正”,请单击生成修复

  2. 生成修复建议后 Copilot ,它将描述建议的更改、呈现更改预览以及调用任何添加的依赖项。 花点时间读一读 Copilot 的作品。

  3. 若要创建包含修复的拉取请求,请单击提交到新分支,然后单击提交更改

  4. 创建草稿拉取请求后,在页面底部,单击“提交审核”以使其进入可合并状态****。

  5. 若要应用修复,请单击“Merge pull request”,然后单击“Confirm merge”********。

    合并拉取请求并 code scanning 再次运行工作流后,警报将自动关闭,修复漏洞的提交将添加到时间线。

注意

在实际项目中,您应始终在提交更改到代码之前查看由 Copilot 建议的更改。

后续步骤

在演示存储库上试用 code scanning 后,可在 自己的项目中 快速查找和修复当前和将来的漏洞。

在确保您自己编写的代码安全之后,下一步通过检查依赖项的安全性,进一步提升代码的安全性。 请参阅“查找并修复第一个依赖项漏洞”。