在学习编程的过程中,意外在项目中引入漏洞是正常的。如果在分享作品之前未解决这些安全问题,攻击者可能会利用它们操纵您的代码并访问敏感数据,因此尽快识别并修补这些漏洞非常重要。
幸好,有代码扫描等工具可以自动发现、解释甚至修复公共仓库中的漏洞。在本教程中,您将学习如何使用代码扫描来确保作品的安全。
设置演示仓库
让我们通过 fork 一个带有安全漏洞的演示项目来开始。本项目构建一个简单的网页,但由于我们不会部署该项目,在本练习中不存在安全风险。
- 前往
new2code/code-scanning-demo仓库。 - 在页面右上角,单击 派生.
- 在出现的页面中,单击创建 fork。
在代码中寻找漏洞
现在我们已经设置好项目,让我们为您的 fork 启用代码扫描,以检查代码中的漏洞。
- 返回 GitHub,在仓库主页,单击 安全和质量。
- 在“代码扫描警报”行,单击设置代码扫描。
- 在“工具”部分,靠近“CodeQL 分析”,选择设置,然后单击默认。
- 在出现的弹出窗口中,单击启用 CodeQL。这将触发一个 GitHub Actions 工作流,对您的代码进行漏洞扫描。
- 要检查工作流的状态,请在导航栏中单击 Actions(工作流).
- 工作流完成后,在导航栏中单击 安全和质量。
- 要查看工作流发现的代码扫描警报,请在侧边导航中单击 代码扫描,然后单击反射型跨站脚本。
了解代码扫描警报
既然代码扫描已经识别出代码中的漏洞,让我们拆解警报中提供的信息。
位置
警报显示了文件的一个小预览,聚焦于产生漏洞的代码行。在我们的示例中,漏洞位于 index.js 文件的第 8 行,我们在站点中实现了用户提供的输入。
如果仔细观察,会发现根本问题出现在第 7 行,当我们在未检查恶意代码的情况下将 greet 赋值为用户输入。要查看代码中漏洞的逐步视图,请在易受攻击行下方的提示框中单击显示路径。

描述和建议
在文件预览下方,代码扫描提供了更详细的漏洞描述。要查看推荐的修复方案以及易受攻击和已修复代码的示例,请单击显示更多.

在我们的案例中,建议在使用用户输入之前对其进行净化。这意味着我们需要检查输入中是否包含恶意代码,如有必要则进行清理。
提示
如果您不完全理解推荐的修复方法,可尝试请求 Copilot Chat进行解释。
时间线
最后,您可以在页面底部查看警报的时间线。我们的时间线包含首次检测到漏洞的提交,并在我们修复漏洞后自动更新。

自动修复漏洞
为了快速轻松地保护我们的项目,让我们使用 GitHub Copilot 自动修复(Autofix)来进行代码扫描。
-
在警报标题下方的框中,系统提示“使用 Copilot Autofix for CodeQL 加速此警报的修复”,单击 生成修复.
-
Copilot 生成修复建议后,会描述它所建议的更改,渲染更改的预览,并列出任何新增的依赖项。请花点时间阅读 Copilot 的工作内容。
-
要使用该修复创建一个拉取请求,请单击提交到新分支,然后单击提交更改。
-
草稿拉取请求创建后,在页面底部单击准备审查以使其可合并。
-
要应用修复,请单击合并拉取请求,然后单击确认合并。
拉取请求合并后,代码扫描工作流再次运行,警报将自动关闭,修复漏洞的提交将被添加到时间线中。
注意
在实际项目中,您应始终在将 Copilot 建议的更改提交到代码之前进行审查。
后续步骤
现在您已经在演示仓库中尝试了代码扫描,请在您自己的项目中启用它,以快速发现并修复当前和未来的漏洞。
现在您已经保护了自己编写的代码,下一步请通过检查依赖项的安全性来进一步提升代码安全性。参见寻找并修复您的第一个依赖漏洞。