You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:45:36