首页/开发/代码质量与评审速查/CodeQL:语义级代码扫描(示例)
规范与静态检查65 条

CodeQL:语义级代码扫描(示例)

CodeQL 把代码编译为可查询数据库,用 QL 查询做数据流与污点分析:可发现注入、反序列化等路径问题,在 CI 以 SARIF 报告呈现。

CodeQL 是什么

CodeQL 把代码编译成可查询的数据库,再用查询做数据流与污点分析:它能追踪用户输入如何流经参数、拼接与序列化,从而发现注入、不安全反序列化这类跨函数的路径问题。这属于语义级扫描,与基于单文件规则的 lint 不同,通常作为周期性深度扫描,和每次提交的增量检查互补。

基本信息

原理代码数据库 + 查询语言,做数据流分析
集成方式CI 工作流中的初始化与分析两个步骤
输出SARIF 报告,可上报到代码托管平台的告警面板
语言支持按语言提供分析器,覆盖程度因语言而异
定位语义级安全扫描,与增量 lint 互补

典型使用场景

  • 发布前对安全敏感模块做路径级扫描
  • 追踪用户输入到查询语句、命令执行、文件路径的流向
  • 检查序列化与反序列化入口
  • 作为周期性任务,与每次提交的增量检查配合
  • 把发现的告警纳入分级与排期修复

工作流要点

工作流要点
# 安装分析器并准备数据库
- uses: github/codeql-action/init@v3
  with:
    languages: javascript-typescript
# 执行查询并上传报告
- uses: github/codeql-action/analyze@v3
# 分析阶段输出 SARIF,告警按等级展示在平台上

与增量 lint 的分工

维度增量 lint语义扫描
运行时机每次提交周期性或发布前
分析方式语法与局部模式数据流与跨函数路径
误报特点规则明确,容易判断需要人工确认路径是否可达
处理节奏当场修分级后按排期修
把全部告警一次设为阻断,会让历史问题淹没新问题。先按等级分级,再为高等级告警设定排期与责任人,扫描结果才会被真正使用。
不要跳过数据库构建步骤:部分语言需要先完成编译或构建配置,否则分析结果不完整,还可能给出误导性的无问题结论。

易错点

  • 跳过数据库构建步骤:部分语言分析结果不完整,误以为没有问题
  • 把全部告警一次设为阻断:历史告警淹没新问题,团队只能整体关闭
  • 只关注高危等级告警:中等级别的数据流问题常常是被利用的起点
  • 扫描范围排除第三方代码却不记录:结论的适用边界没人知道

数据来源与参考

  • GitHub 文档 · CodeQL(代码扫描)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌