SQL中的模糊搜索

SQL中的模糊搜索,sql,fuzzy-search,Sql,Fuzzy Search,我试图将Linux软件包(名称+版本)的信息映射到相应的CPE字符串(请参阅),以便能够自动发现系统可能存在的漏洞 NIST提供了一份包含所有相关CPE的XML文档。我考虑将这些信息解析到一个SQL数据库中,以便可以按名称和版本号快速搜索。那将是大约70000行 当然,现在的问题是CPE和包名的拼写存在差异。例如,Tomcat 6.0.36的CPE将是CPE:/a:apache:Tomcat:6.0.36,因此您有名称Tomcat和版本6.0.36。现在,包管理器可以为您提供类似于tomcat6

我试图将Linux软件包(名称+版本)的信息映射到相应的CPE字符串(请参阅),以便能够自动发现系统可能存在的漏洞

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

当然,现在的问题是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

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

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

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

那么,有符合这些要求的东西吗?或者除了某种模糊搜索之外,你能想出解决我问题的办法吗


提前谢谢

首先是一般性评论。CPE术语似乎是有机演变的,通常取决于供应商(不一致)的术语。例如,Sun Java有major.minor.point\u版本。Adobe使用major.minor.point.subpoint。Microsoft操作系统使用Service Pack\u语言包。其他一些供应商会使用以数字为主,但偶尔会添加字母的点版本(例如,.8、.9、.9R2、.10)

当我处理上面提到的问题时,我从他们的XML文件开始,在Excel中对它们进行操作,按句点进行分割。然后我将以数字(如果它们都是数字)或文本字符串的形式进行排序。(请注意,大多数数字中的字母会造成严重破坏,而.10在词汇上位于.8之前)

这种不一致性正是第三方软件供应商在春雨过后迅速崛起的原因。公司宁愿付钱给软件供应商,也不愿解开这个棘手的难题

如果你想要一个真正的模糊搜索,请看看这个问题。预计会有很多误报


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

我认为在导入到数据库时,我更倾向于“规范化”。因此,在导入列表时,可以使用一些函数来生成唯一的CPE,并且可以对搜索目标执行相同的操作。这样,你只需点击一次,就可以使用直接搜索,就好像精确匹配是可以的,而不是每次比较都变得模糊。