在学习编码的过程中,不小心在项目中引入漏洞是很正常的。 如果在分享工作之前不解决这些安全问题,攻击者就会利用它们操纵代码并访问敏感数据,因此尽快识别并修补非常重要。
值得庆幸的是,有些工具可以在你的公共存储库中自动查找、解释甚至修复漏洞。 本教程中,您将学习如何通过code scanning来确保工作安全。
设置演示仓库
让我们从复刻一个存在安全漏洞的演示项目开始。 此项目生成一个简单的网页,但由于我们不会部署项目,因此本练习不存在安全风险****。
- 导航到
new2code/code-scanning-demo仓库。 - 在页面右上角,单击 “分叉”。
- 在出现的页面中,单击“Create fork”****。
查找代码中的漏洞
设置项目后,让我们启用您的派生版本中的code scanning 来检查代码中的漏洞。
-
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**。 - 在“Code scanning 警报”行中,单击设置code scanning。
- 在“工具”部分的“CodeQL 分析”旁边,选择“ 设置”,然后单击“ 默认”。
- 在显示的弹出窗口中,单击“ 启用 CodeQL”。 这会触发扫描 GitHub Actions 代码中的漏洞的工作流。
- 若要检查工作流的状态,请在导航栏中单击“ 操作”。
- 工作流完成后,在导航栏中单击 Security and quality。
-
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 提供漏洞的更详细说明。 若要查看建议的修补程序,以及易受攻击和固定代码的示例,请单击“ 显示更多”。

在我们的案例中,建议是在使用前清理用户输入。 这意味着我们需要检查输入是否有恶意代码,然后在必要时进行清理。
提示
如果你不完全了解建议的修补程序,请尝试 请求 Copilot对话 解释它。
时间线
最后,可以在页面底部看到警报的时间线。 时间线包含首次检测到漏洞的提交记录,并在我们修复漏洞时自动更新。

自动修复漏洞
为了快速和轻松地保护我们的项目,让我们使用GitHub Copilot自动修复来处理code scanning。
-
在警报标题下方的框中,建议你“使用Copilot自动修复加快对此CodeQL警报的修正”,请单击生成修复。
-
生成修复建议后 Copilot ,它将描述建议的更改、呈现更改预览以及调用任何添加的依赖项。 花点时间读一读 Copilot 的作品。
-
若要创建包含修复的拉取请求,请单击提交到新分支,然后单击提交更改。
-
创建草稿拉取请求后,在页面底部,单击“提交审核”以使其进入可合并状态****。
-
若要应用修复,请单击“Merge pull request”,然后单击“Confirm merge”********。
合并拉取请求并 code scanning 再次运行工作流后,警报将自动关闭,修复漏洞的提交将添加到时间线。
注意
在实际项目中,您应始终在提交更改到代码之前查看由 Copilot 建议的更改。
后续步骤
在演示存储库上试用 code scanning 后,可在 自己的项目中 快速查找和修复当前和将来的漏洞。
在确保您自己编写的代码安全之后,下一步通过检查依赖项的安全性,进一步提升代码的安全性。 请参阅“查找并修复第一个依赖项漏洞”。