Python代码复用及API漏洞全量统计技术咨询
问题解答
1. 让API数据可被其他函数调用的方案
把_request函数改成返回结构化数据的形式,比如返回包含所有资产漏洞数据的列表,或者返回统计结果与原始数据的字典,其他函数直接调用该函数并接收返回值即可实现复用。
核心思路:
- 在函数内部初始化容器(比如列表)存储所有获取到的资产数据
- 遍历API分页数据时,将每一页的
data内容添加到容器中 - 函数末尾用
return返回这个容器,其他函数调用_request()就能拿到完整数据
2. 实现所有漏洞总量统计的方案
原代码的问题在于统计变量被定义在循环内部,每次循环都会重置,无法累加总量。需要把统计变量移到循环外部,每次遍历资产时直接累加对应级别的漏洞数。
修改后的完整代码
def _request(): third_party_patching_filer = { "asset": "asset.agentKey IS NOT NULL", "vulnerability" : "vulnerability.categories NOT IN ['microsoft patch']" } headers = _headers() url = "https://us.api.insight.rapid7.com/vm/v4/integration/assets" # 初始化存储所有资产数据的容器 all_assets = [] # 初始化总量统计变量 stats = { "OSSWIN": {"critical": 0, "severe": 0, "moderate": 0}, "DESKTOP_SUPPORT": {"critical": 0, "severe": 0, "moderate": 0} } # 第一次请求 resp = requests.post(url=url, headers=headers, json=third_party_patching_filer, verify=False).json() all_assets.extend(resp.get("data", [])) # 处理第一页的统计 for data in resp.get("data", []): for tags in data['tags']: if tags["name"] == 'OSSWIN': stats["OSSWIN"]["critical"] += data['critical_vulnerabilities'] stats["OSSWIN"]["severe"] += data['severe_vulnerabilities'] stats["OSSWIN"]["moderate"] += data['moderate_vulnerabilities'] elif tags["name"] == 'DESKTOP_SUPPORT': stats["DESKTOP_SUPPORT"]["critical"] += data['critical_vulnerabilities'] stats["DESKTOP_SUPPORT"]["severe"] += data['severe_vulnerabilities'] stats["DESKTOP_SUPPORT"]["moderate"] += data['moderate_vulnerabilities'] # 处理分页数据 nextKey = resp["metadata"].get("cursor") has_next_cursor = nextKey is not None while has_next_cursor: url_with_cursor = f"{url}?size=500&cursor={nextKey}" resp2 = requests.post(url=url_with_cursor, headers=headers, json=third_party_patching_filer, verify=False).json() all_assets.extend(resp2.get("data", [])) # 累加当前页的统计数据 for data in resp2.get("data", []): for tags in data['tags']: if tags["name"] == 'OSSWIN': stats["OSSWIN"]["critical"] += data['critical_vulnerabilities'] stats["OSSWIN"]["severe"] += data['severe_vulnerabilities'] stats["OSSWIN"]["moderate"] += data['moderate_vulnerabilities'] elif tags["name"] == 'DESKTOP_SUPPORT': stats["DESKTOP_SUPPORT"]["critical"] += data['critical_vulnerabilities'] stats["DESKTOP_SUPPORT"]["severe"] += data['severe_vulnerabilities'] stats["DESKTOP_SUPPORT"]["moderate"] += data['moderate_vulnerabilities'] # 更新分页游标 nextKey = resp2["metadata"].get("cursor") has_next_cursor = nextKey is not None # 返回所有资产数据和统计结果,供其他函数调用 return all_assets, stats # 其他函数调用示例 def analyze_vulns(): assets, vuln_stats = _request() print("OSSWIN漏洞总量:") print(f"Critical: {vuln_stats['OSSWIN']['critical']}") print(f"Severe: {vuln_stats['OSSWIN']['severe']}") print(f"Moderate: {vuln_stats['OSSWIN']['moderate']}") print("DESKTOP_SUPPORT漏洞总量:") print(f"Critical: {vuln_stats['DESKTOP_SUPPORT']['critical']}") print(f"Severe: {vuln_stats['DESKTOP_SUPPORT']['severe']}") print(f"Moderate: {vuln_stats['DESKTOP_SUPPORT']['moderate']}")
关键修改点说明
- 新增
all_assets列表存储所有分页的资产数据,函数返回后可被其他函数处理 - 新增
stats字典统一管理不同标签的漏洞总量,避免循环内重置变量 - 修复原代码漏处理第一页数据的问题
- 直接用数值累加替代列表append再sum的低效方式
- 分页逻辑简化,用
get方法避免KeyError
内容的提问来源于stack exchange,提问作者FloydLee
相关产品推荐
相关产品推荐

