去重调优(专业版) (Pro)
去重调优是 DefectDojo Pro 的一项功能,可让您对发现项的去重方式进行精细控制,从而针对您特定的安全测试工作流程优化重复检测。
去重设置
在 DefectDojo Pro 中,您可以通过以下路径访问去重调优功能: 设置 > 发现项工作流程(在仍使用旧版菜单布局的实例上为 设置 > Pro 设置 > 去重设置)

去重设置页面提供三个关键配置区域:
- 同工具去重
- 跨工具去重
- 重新导入去重
同工具去重
同工具去重默认对所有安全工具解析器启用。这可确保使用同一工具进行连续扫描所产生的发现项能够被正确去重。
要调整同工具去重:
- 从下拉菜单中选择特定的安全工具
- 从可用选项中选择一种去重算法

可用的去重算法
DefectDojo Pro 为同工具去重提供以下去重方法:
哈希代码
使用所选字段的组合生成唯一哈希值。选择此选项后,会出现第三个下拉菜单,显示用于计算哈希值的字段。
内容指纹
内容指纹是一个可选的哈希字段(在全部三个配置区域中均可使用),可为静态分析发现项提供与位置无关的身份标识。它是根据工具在发现项中包含的存在漏洞的代码片段计算得出的——经过归一化处理,因此缩进、行号标注和格式差异不会影响它。即使代码移动到了不同的行或文件,针对同一段存在漏洞的代码的两个发现项也会得到相同的哈希值。
对于在发现项描述中包含代码片段的工具,系统会计算内容指纹——包括 Bandit、Gosec、Brakeman、Checkmarx One,以及任何描述中带有围栏代码块或 SARIF 代码片段的工具。
在将内容指纹选为哈希字段之前,请先运行
./manage.py backfill_fingerprints为现有发现项填充指纹。该功能上线后导入的发现项会自动获得指纹,但先前已存在的发现项则没有——如果不先回填就选择该字段,会导致现有发现项和新传入的发现项哈希值不一致,在回填完成之前,每一次匹配都会被拆分。
对于在标题中嵌入文件路径或行号的工具,内容指纹与 CWE 搭配使用效果很好,因为其他身份字段每次代码移动时都会发生变化。请参阅位置漂移匹配。
来自工具的唯一 ID
利用安全工具自身的内部发现项标识符,当扫描器提供可靠的唯一 ID 时,可确保完美去重。
在使用 SAST 扫描器,或发现项可能随着开发推进而在源代码中“移动位置”的情况下,此算法非常有用。
来自工具的唯一 ID 或哈希代码
优先尝试使用工具的唯一 ID,如果没有可用的唯一 ID,则回退使用哈希代码。这提供了最灵活的去重选项。
全局组件
根据组件名称和版本,在实例中所有产品范围内匹配发现项,而不局限于单个产品或测试活动内。适用于同一个存在漏洞的依赖项出现在多个产品中的 SCA 工具场景。此算法默认关闭,必须由 DefectDojo 支持团队启用。详情请参阅全局组件去重。
全局漏洞 ID
根据漏洞 ID(CVE、GHSA 等),在实例中所有产品范围内匹配发现项,而不局限于单个产品或测试活动内。适用于在多个产品中报告同一 CVE 的工具。默认关闭,由 DefectDojo 支持团队启用。
配置了相同实例范围算法的两个工具会互为去重候选对象。 当两个不同的工具都配置了实例范围算法(全局组件或全局漏洞 ID)时,它们的发现项会共享一个固定的分组哈希值,因此其中一个工具产生的发现项会在共享维度(组件或漏洞 ID)上被视为与另一个工具的发现项进行去重比较。这是预期的跨工具行为——只有在您希望这些工具一起去重时才应启用它。
基于集合的哈希代码字段(漏洞 ID 和 CWE)
有两个发现项属性存放的是一组值的集合而非单一值:漏洞 ID(CVE、GHSA 等)和 CWE。使用哈希代码算法(同工具或跨工具)时,您可以将以下字段添加到哈希代码字段中,以控制这些集合的比较方式:
| Field | Findings are duplicates when… |
|---|---|
vulnerability_ids | 二者的漏洞 ID 完全相同的集合 |
vulnerability_ids_partial | 二者至少共享一个漏洞 ID |
vulnerability_ids_subset | 一个发现项的漏洞 ID 是另一个的子集 |
cwes | 二者的 CWE 完全相同的集合 |
cwes_partial | 二者至少共享一个 CWE |
cwes_subset | 一个发现项的 CWE 是另一个的子集 |
_partial 和 _subset 字段是针对每一对发现项单独进行比较,而不会被折叠进哈希值中:其余的哈希代码字段负责对候选发现项进行分组,然后集合比较会在该分组内进一步筛选。(精确匹配字段——vulnerability_ids 和 cwes——会被直接折叠进哈希值中。)
空值情况。 如果某个发现项针对已配置的匹配器没有漏洞 ID(或没有 CWE):
- 如果哈希代码字段中还包含一个普通字段(例如
title),则由该字段承担身份识别作用——该发现项对会跳过集合匹配器,仍可根据哈希中的其余部分进行匹配。 - 如果集合匹配器是唯一的字段,则没有值的发现项不会与任何内容匹配:由于没有其他可用于识别的信息,空集合不会被视为与所有其他发现项都匹配。
配置规则(保存设置时会强制执行):
- 漏洞 ID 字段(
vulnerability_ids、vulnerability_ids_partial或vulnerability_ids_subset)可以单独使用——CVE 或 GHSA 能够标识一个具体的漏洞实例。 - CWE 字段(
cwes、cwes_partial、cwes_subset)不能作为唯一的判定条件。CWE 是一个弱点类别,而非具体实例,因此仅根据 CWE 进行匹配会将不相关的发现项合并在一起。请将 CWE 匹配器与title或file_path等具有识别作用的字段搭配使用。
跨工具去重
跨工具去重默认处于禁用状态,因为不同安全工具报告同一漏洞的方式存在差异,在不同工具之间进行去重需要仔细配置。

要启用跨工具去重:
- 从下拉菜单中选择一个安全工具
- 将去重算法从“已禁用”更改为“哈希代码”
- 在哈希代码字段下拉菜单中选择用于生成哈希值的字段
跨工具去重支持哈希代码算法,该算法适用于大多数工作流程,因为不同工具之间很少共享兼容的唯一标识符。对于报告相同依赖项的 SCA 工具,全局组件去重也可作为一种跨工具选项使用(默认关闭)。
请注意,跨工具去重同样仅限于单个资产范围内。
重新导入去重
⚠️ 重新导入过程可能在发现项被记录之前将其完全丢弃。如果设置不当,可能导致数据丢失,因此调整重新导入去重设置时应格外谨慎。
重新导入去重设置可用于为通用解析器(Universal Parsers)或通用发现项导入解析器(Generic Findings Import Parser)设置算法。
默认情况下,无法为其他工具调整重新导入去重设置。如果用户希望为其实例中的其他工具调整重新导入去重算法,请联系 寻求帮助。

配置重新导入去重时:
- 选择安全工具(通用解析器或通用发现项导入解析器)
- 选择合适的去重算法
重新导入去重可使用以下算法选项:
- 哈希代码
- 来自工具的唯一 ID
- 来自工具的唯一 ID 或哈希代码
重新导入可能在发现项被记录之前将其完全丢弃,因此调整重新导入去重设置时应格外谨慎。
在位置变化时跟踪发现项
当某个工具的重新导入去重算法为哈希代码时,会出现一个额外的切换开关:在位置变化时跟踪发现项。启用后,即使发现项的位置在多次重新导入之间发生了变化——例如行号偏移或文件重命名、URL 变更,或依赖项版本升级——它仍会被视为同一个发现项,即便工具重新评估了其严重程度。系统会就地维护该发现项并保留其位置历史,而不是关闭旧发现项并创建一个完全相同的新发现项。
该开关默认关闭,且仅适用于哈希代码重新导入算法(具有可靠的“来自工具的唯一 ID”的工具已经可以通过其稳定 ID 跟踪位置变化)。启用该开关会自动在后台对该工具的现有发现项重新计算哈希值,使历史数据立即参与其中。
有关匹配原理、保留哪些内容,以及在大型实例上启用该功能的指导,请参阅位置漂移匹配。
对现有数据追溯执行去重
首次启用去重调优时,一种常见情况是存在大量在去重配置更改之前导入的历史发现项积压。在 DefectDojo Pro 中,您不需要运行单独的命令来对这些历史数据进行去重——更改某个工具的去重设置会自动触发对该测试类型下所有现有发现项的后台重新哈希计算。
这在实际操作中意味着:
- 当您更改某个工具的去重算法或哈希代码字段时,DefectDojo 会排入一个后台作业,为该实例中该工具已有的每一个发现项重新计算哈希值。
- 该作业以异步方式运行。在大型实例(数百万个发现项)上,完成该过程可能需要一些时间,您不会在发现项表中立即看到变化。
- 新计算出的哈希值会应用于之后针对整个积压数据的去重判定。
如果您在短时间内连续多次更改配置,每一次更改都会排入各自独立的重新哈希作业。在评估结果之前,请等待前一个作业完成,尤其是在比较更改前后的发现项数量时。
自托管 Pro 注意事项: 该后台作业运行在 Celery 工作进程池中。如果工作进程资源不足或存在积压,重新哈希计算可能比预期耗时更长——如果结果没有在与您实例规模相符的预期时间内出现,请检查工作进程的运行状况。
功能开关不会限制已生效的配置。 只要工具的去重设置已配置,就会持续生效;关闭相关的功能开关不会将该工具追溯还原为默认去重方式。要更改或停止某个工具的去重行为,请直接更新其去重设置(这同样会排入上文所述的后台重新哈希作业)。
去重最佳实践
要在去重调优中获得最佳效果:
- 从默认设置开始:预配置的去重设置适用于大多数场景
- 谨慎测试更改:调整去重设置后,监控几次导入以确保行为正确。
- 规划追溯性重新哈希计算:更改去重设置会在后台对该工具的每一个现有发现项重新计算哈希值。请参阅上文的对现有数据追溯执行去重。
- 对跨工具去重使用哈希代码:启用跨工具去重时,请选择能够可靠地在不同工具间识别同一发现项的字段(例如漏洞名称、位置和严重程度)。重要提示:启用跨工具去重的每个工具必须选择相同的字段。
- 将跨工具来源保持在同一资产内:跨工具去重的作用范围限于资产。即使哈希字段匹配,分散在不同资产中的发现项也不会被去重。请参阅上文的跨工具去重。
- 避免过于宽泛的去重:哈希字段过少的跨工具去重可能导致误判为重复
- 在选择内容指纹之前先进行回填:先运行
./manage.py backfill_fingerprints,然后再选择该字段——这样触发的重新哈希计算才有指纹可用。请参阅上文的内容指纹。 - 在多次扫描运行之间启用位置跟踪:该开关的自动重新哈希会覆盖该工具的全部积压数据;在大型实例上,请等待其完成后再进行下一次计划中的重新导入。请参阅位置漂移匹配。
通过针对您使用的具体工具调整去重设置,可以显著减少重复项造成的干扰。
已锁定的发现项
每当某个工具的去重设置发生更改时,都会在整个 DefectDojo 实例范围内为该工具重新计算去重哈希值。