【问题标题】:Fuzzy search in SQLSQL中的模糊搜索
【发布时间】:2013-02-20 15:59:53
【问题描述】:

我正在尝试将 Linux 软件包的信息(名称 + 版本)映射到其对应的 CPE 字符串(请参阅http://nvd.nist.gov/cpe.cfm),以便能够自动发现系统可能存在的漏洞。

NIST 提供了一个 XML 文档,其中包含所有相关的 CPE。我考虑将这些信息解析到 SQL 数据库中,这样我就可以按名称和版本号快速搜索。那将是大约 70.000 行。

当然,现在的问题是 CPE 的拼写和包名称存在差异。例如,Tomcat 6.0.36 的 CPE 为 cpe:/a:apache:tomcat:6.0.36,因此您的名称为 tomcat,版本为 6.0.36。现在,包管理器可以为您提供类似tomcat6 的名称和6.0.36-3 的版本。这两个程序很可能是相同的或至少具有相同的漏洞。所以我需要能够自动将上述 CPE 识别为我的 tomcat 包的正确 CPE。

首先要做的是某种规范化,可能会将所有内容都转换为小写。但正如您从示例中看到的那样,这还不够。我需要某种模糊搜索。从我已经发现的情况来看,有一些解决方案可以在拼写错误的情况下识别匹配项。不过,这并不是我所需要的。软件包名称没有拼写错误,但可能包含其他字符(或遗漏一些字符)。

模糊搜索也必须相对较快,因为我需要为多个主机执行它,每个主机都可能安装数百个包,正如我所说,数据库将有大约 70.000 行。我可以引入一个主要查找,它首先尝试找到一个精确匹配,但由于我怀疑许多包不会有任何对应的 CPE 字符串,所以不会显着减少数量。

另一个限制是该解决方案应该在非专有数据库上运行,因为我没有其他任何财务手段。

那么,有什么符合这些要求的吗?或者除了某种模糊搜索之外,您能想出任何解决我问题的方法吗?

提前致谢!

【问题讨论】:

  • 我认为在导入数据库时​​“标准化”会更吸引我。因此,当您导入列表时,有一些功能可以提供独特的 CPE,并且可以对搜索目标执行相同的操作。这样一来,您只需点击一次,就可以像完全匹配一样使用直接搜索,而不是每次比较都变得模糊。

标签: sql fuzzy-search


【解决方案1】:

首先是一般性评论。 CPE 命名法似乎是有机发展的,通常取决于供应商的(不一致的)命名法。例如,Sun Java 有 major.minor.point_version。 Adobe 使用major.minor.point.subpoint。 Microsoft 操作系统使用 Service Packs_Language Packs。其他一些供应商会使用主要是数字但偶尔会加入字母的点发布(例如,.8、.9、.9R2、.10)。

当我处理所述问题时,我从他们的 XML 文件开始,并在 Excel 中对它们进行操作,按句点拆分。然后我会按数字(如果它们都是数字)或作为文本字符串排序。 (请注意,主要是数字中的字母会造成严重破坏,并且 .10 在词汇上位于 .8 之前)

这种不一致是第三方软件供应商雨后春笋般冒出来的原因。公司宁愿付钱给软件供应商,也不愿解开这个急速之结。

如果您想要真正的模糊搜索,请查看有关using Soundex 的这个问题。预计会得到很多误报。

如果您的目标是准确映射 CPE 字符串,您可能应该考虑实现一个查找表,将 CPE 转换为库名称。

【讨论】:

    猜你喜欢
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2013-02-18
    • 1970-01-01
    • 2013-05-15
    • 2015-01-09
    • 1970-01-01
    相关资源
    最近更新 更多