SQL中的模糊搜索

时间:2013-02-20 15:59:54

标签: sql fuzzy-search

我正在尝试将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字符串,因此不会太大地减少数量。

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

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

首先是一般性评论。 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转换为库名的查找表。