持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情
前言
在昨天的文章中,使用ES的suggest进行了接口封装,完成了查询的推荐或者叫联想词自动补全的功能,使用这种方案的目的在于使用户查询更加具有针对性,保证用户查询的关键字在我们的数据库中能够存在,另一方面可以减少用户因为输入错误等原因导致数据召回失败。基于以上优势,通过ES数据库的suggestter API进行构建索引、插入数据并完成接口封装,完成联想词推荐等功能。今天将构建几个数据查询接口,分为两部分,一个是首页的数据详情接口,另外一个是针对不在redis数据库中的数据返回完整链路的接口。
ES插入数据详情
方案是这样的,对于厂商和产品,右键点击其气泡,可以查看详情,而详情则是该产品或者厂商包含的漏洞top 50或产品的 top 50 ,排序规则对于产品来说,通过其包含的漏洞数量进行降序,而对于漏洞编号来说,则根据漏洞的名称进行降序(也就是通过漏洞编号的时间进行降序)。而对于漏洞编号,点击则展示漏洞详情,详情的格式如下:
{
'content': 'IBM Cognos Analytics 11.1.7 and 11.2.0 could be vulnerable to client side vulnerabilties due to a web response specifying an incorrect content type. IBM X-Force ID: 201091',
'data': [
{
'漏洞类型': '应用',
'厂商名称': 'ibm',
'产品名称': 'cognos_analytics',
'影响版本': '* From (including) 11.1.0 Up to (excluding) 11.1.7'
},
{
'漏洞类型': '应用',
'厂商名称': 'ibm',
'产品名称': 'cognos_analytics',
'影响版本': '11.1.7 -'
},
{
'漏洞类型': '应用',
'厂商名称': 'ibm',
'产品名称': 'cognos_analytics',
'影响版本': '11.2.0 -'
}
],
'solution': '建议您更新当前系统或软件至最新版,完成漏洞的修复。',
'cve_number': 'CVE-2021-29719',
'title': '将资源暴露给错误范围',
'href': 'xxx'
}
包含content【漏洞描述】、data【影响的厂商、产品、版本等】、solution【解决方案】、cve_number【漏洞编号】、title【漏洞标题】、href【来源】等信息,这些数据依旧存入ES数据库用于数据查询操作,因此先将这些数据进行处理并导入ES数据库:
def insertDetails2es():
es = Elasticsearch("http://127.0.0.1:19200", request_timeout=3600)
lines = codecs.open("aliyunSpider.txt", 'r', 'UTF-8').readlines()
for line in tqdm(lines):
dic = (eval(line.strip()))
if "solution" in dic:
temp = []
data = dic["data"]
for item in data:
temp.append({"漏洞类型":item[0],"厂商名称":item[1],"产品名称":item[2],"影响版本":" ".join(item[3:]).rstrip(" ")})
dic["data"] =temp
print(dic)
es.index(index='vulnerability_details', doc_type='_doc', body=dic)
首先连接数据库、然后数据data部分进行处理,之后根据对应索引完成数据的插入操作。
首页的查询功能接口代码:
def getDetails(self, labels, properities):
# 获取节点详情信息,默认第一级和第二级展示包含的下级节点数量 第三级展示数据详情
cypher = ""
if labels in ["company"]:
cypher = f"MATCH (n:company{{name:'{properities}'}})-[r]->(m:product) -[t]-> () RETURN m,count(t) order by count(t) DESC limit 50"
resList = [str(item).split("', name='")[1].split("'), 'count(t)'")[0] for item in self.conn.run(cypher).data()]
return (resList)
elif labels in ["product"]:
cypher = f"MATCH (n:product{{name:'{properities}'}})-[r]->(m) RETURN m order by m.name DESC limit 50"
resList = [str(item).split("', name='")[1].rstrip("')}") for item in self.conn.run(cypher).data()]
return (resList)
else:
body = {
"query": {
"match": {
"cve_number": "{}".format(properities)
}
}
}
resList = self.es.client.search(index="", body=body)
if len(resList["hits"]["hits"]) > 0:
return (resList["hits"]["hits"][0]["_source"])
else:
return ([])
对于厂商和产品的数据,利用cypher语句查询图数据库,返回关键节点,而对于叶子节点,则查询ES数据库完成详情展示。
测试
search4Node().getDetails("company","apple")
search4Node().getDetails("product","iphone_os")
search4Node().getDetails("cve_number","CVE-2022-22629")
结果:
['mac_os_x', 'iphone_os', 'tvos', 'watchos', 'safari', 'itunes', 'macos', 'icloud', 'ipados', 'ipad_os', 'mac_os', 'webkit', 'xcode', 'apple_tv', 'cups', 'airport_base_station_firmware', 'mail', 'swiftnio', 'remote_desktop', 'swift', 'tv_os', 'garageband', 'files', 'logic_pro_x', 'iphone', 'os_x_server', 'quicktime', 'apple_support', 'shazam', 'shortcuts', 'pages', 'exposure_notifications', 'airport_base_station', 'mac_os_x_server', 'mdnsresponder', 'imovie', 'boot_camp', 'keynote', 'swiftnio_http/2', 'numbers', 'texture', 'swiftnio_ssl', 'tokend', 'bonjour', 'nioextras', 'iphone_3gs', 'windows_migration_assistant', 'music', 'maos', 'macos_server']
['CVE-2022-32917', 'CVE-2022-32912', 'CVE-2022-32908', 'CVE-2022-32894', 'CVE-2022-32886', 'CVE-2022-32883', 'CVE-2022-32854', 'CVE-2022-32823', 'CVE-2022-32820', 'CVE-2022-32817', 'CVE-2022-32814', 'CVE-2022-32793', 'CVE-2022-32792', 'CVE-2022-32788', 'CVE-2022-32787', 'CVE-2022-32785', 'CVE-2022-26771', 'CVE-2022-26766', 'CVE-2022-26765', 'CVE-2022-26764', 'CVE-2022-26763', 'CVE-2022-26757', 'CVE-2022-26751', 'CVE-2022-26744', 'CVE-2022-26740', 'CVE-2022-26739', 'CVE-2022-26738', 'CVE-2022-26737', 'CVE-2022-26736', 'CVE-2022-26714', 'CVE-2022-26711', 'CVE-2022-26703', 'CVE-2022-26701', 'CVE-2022-22675', 'CVE-2022-22672', 'CVE-2022-22667', 'CVE-2022-22666', 'CVE-2022-22653', 'CVE-2022-22652', 'CVE-2022-22643', 'CVE-2022-22641', 'CVE-2022-22640', 'CVE-2022-22639', 'CVE-2022-22638', 'CVE-2022-22637', 'CVE-2022-22635', 'CVE-2022-22634', 'CVE-2022-22633', 'CVE-2022-22632', 'CVE-2022-22629']
{'content': 'Apple iOS和Apple iPadOS都是美国苹果(Apple)公司的产品。Apple iOS是一套为移动设备所开发的操作系统。Apple iPadOS是一套用于iPad平板电脑的操作系统。', 'data': [{'漏洞类型': '应用', '厂商名称': 'apple', '产品名称': 'itunes', '影响版本': '* Up to (excluding) 12.12.3'}, {'漏洞类型': '应用', '厂商名称': 'apple', '产品名称': 'safari', '影响版本': '* Up to (excluding) 15.4'}, {'漏洞类型': '系统', '厂商名称': 'alpine_3.16', '产品名称': 'webkit2gtk', '影响版本': '* Up to (excluding) 2.36.0-r0'}, {'漏洞类型': '系统', '厂商名称': 'alpine_edge', '产品名称': 'webkit2gtk', '影响版本': '* Up to (excluding) 2.36.0-r0'}, {'漏洞类型': '系统', '厂商名称': 'apple', '产品名称': 'ipados', '影响版本': '* Up to (excluding) 15.4'}, {'漏洞类型': '系统', '厂商名称': 'apple', '产品名称': 'iphone_os', '影响版本': '* Up to (excluding) 15.4'}, {'漏洞类型': '系统', '厂商名称': 'apple', '产品名称': 'macos', '影响版本': '* From (including) 12.0.0 Up to (excluding) 12.3'}, {'漏洞类型': '系统', '厂商名称': 'apple', '产品名称': 'tvos', '影响版本': '* Up to (excluding) 15.4'}, {'漏洞类型': '系统', '厂商名称': 'apple', '产品名称': 'watchos', '影响版本': '* Up to (excluding) 8.5'}, {'漏洞类型': '系统', '厂商名称': 'debian_10', '产品名称': 'webkit2gtk', '影响版本': '* Up to (excluding) 2.36.0-3~deb10u1'}, {'漏洞类型': '系统', '厂商名称': 'debian_11', '产品名称': 'webkit2gtk', '影响版本': '* Up to (excluding) 2.36.0-3~deb11u1'}, {'漏洞类型': '系统', '厂商名称': 'debian_12', '产品名称': 'webkit2gtk', '影响版本': '* Up to (including) 2.34.6-1'}, {'漏洞类型': '系统', '厂商名称': 'debian_9', '产品名称': 'webkit2gtk', '影响版本': '* Up to (including) 2.18.6-1~deb9u1'}, {'漏洞类型': '系统', '厂商名称': 'suse_12_SP5', '产品名称': 'webkit2gtk', '影响版本': '* Up to (excluding) 2.36.0-2.96.1'}, {'漏洞类型': '系统', '厂商名称': 'ubuntu_20.04', '产品名称': 'webkit2gtk', '影响版本': '* Up to (excluding) 2.36.0-0ubuntu0.20.04.3'}, {'漏洞类型': '系统', '厂商名称': 'ubuntu_21.10', '产品名称': 'webkit2gtk', '影响版本': '* Up to (excluding) 2.36.0-0ubuntu0.21.10.3'}], 'solution': '目前厂商已发布升级补丁以修复漏洞,补丁获取链接:https://support.apple.com/en-us/HT213182', 'cve_number': 'CVE-2022-22629', 'title': '缓冲区错误漏洞', 'href': 'https://avd.aliyun.com/detail?id=AVD-2022-22629'}
部署测试一下:
基本满足需求~