Текущий код считает все элементы vulnerabilities без фильтра по году. Извлеките CVE-ID, отфильтруйте 2023/2024 и заранее выберите подсчёт вхождений или уникальных CVE.
Подсчёт количества уязвимостей за 2023 и 2024 годы
Текущий код считает все элементы 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, проверку статуса, предел страниц и контролируемые повторы. Не увеличивайте итог повторно при повторной загрузке страницы.