Подсчёт количества уязвимостей за 2023 и 2024 годы

Текущий код считает все элементы vulnerabilities без фильтра по году. Извлеките CVE-ID, отфильтруйте 2023/2024 и заранее выберите подсчёт вхождений или уникальных CVE.

Короткий ответ

Что ответить на собеседовании

Текущий код считает все элементы vulnerabilities без фильтра по году. Извлеките CVE-ID, отфильтруйте 2023/2024 и заранее выберите подсчёт вхождений или уникальных CVE.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо определить, сколько уязвимостей имеет идентификатор, начинающийся с CVE‑2023 и сколько – с CVE‑2024, получая данные постранично из API. Ниже приведён пример решения на Python, которое последовательно запрашивает страницы, агрегирует количество уязвимостей для каждого устройства и подсчитывает общую сумму.

from collections import defaultdict
import requests, json


def aggregate_page(data_page, counters):
    page_total = 0
    for entry in data_page:
        dev_id = entry["device_id"]
        vuln_count = len(entry["vulnerabilities"])
        counters[dev_id] += vuln_count
        page_total += vuln_count
    return page_total

counters = defaultdict(int)
overall_total = 0
page_idx = 1

while True:
    api_url = f"{base_url}?page_number={page_idx}"
    response = requests.get(api_url, auth=(username, password)).json()
    overall_total += aggregate_page(response["results"], counters)
    if response["more"] is False:
        break
    page_idx += 1

print(json.dumps(dict(counters), indent=4))
print(overall_total)

Ответ

Текущий код считает все элементы vulnerabilities без фильтра по году. Извлеките CVE-ID, отфильтруйте 2023/2024 и заранее выберите подсчёт вхождений или уникальных CVE.

Если элементы vulnerabilities — строки, глобальный подсчёт уникальных идентификаторов выглядит так:

import re
seen = {2023: set(), 2024: set()}

def aggregate_page(entries):
    for entry in entries:
        for identifier in entry['vulnerabilities']:
            match = re.fullmatch(r'CVE-(2023|2024)-[0-9]{4,}', identifier)
            if match:
                seen[int(match.group(1))].add(identifier)

Для объектов вместо строк нужен адаптер к фактическому полю ID. Итог — {year: len(ids) for year, ids in seen.items()}. Один CVE на нескольких устройствах здесь учитывается один раз; для числа уязвимых установок ключом будет (device_id, CVE).

HTTP-запросам задайте timeout, проверку статуса, предел страниц и контролируемые повторы. Не увеличивайте итог повторно при повторной загрузке страницы.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее