Определение уязвимых устройств по CVE

defaultdict(int) подходит для суммирования числа уязвимостей по device_id. Но пагинации нужны timeout, проверка HTTP/JSON, корректного more и предел страниц; иначе код может зависнуть или молча исказить итог.

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

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

defaultdict(int) подходит для суммирования числа уязвимостей по device_id. Но пагинации нужны timeout, проверка HTTP/JSON, корректного more и предел страниц; иначе код может зависнуть или молча исказить итог.

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

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

Условие

Необходимо построить структуру данных, в которой каждому идентификатору устройства (device_id) будет сопоставлено количество уязвимостей, обнаруженных для него. Ниже приведён пример реализации, который последовательно запрашивает страницы API, считает количество уязвимостей в каждом ответе и формирует итоговый словарь, а также суммарное количество уязвимостей.


def process_paginated_response(content, res):
    total = 0
    for item in content:
        device_id = item["device_id"]
        vuln_num = len(item["vulnerabilities"])
        res[device_id] += vuln_num
        total += vuln_num
    return total

res = defaultdict(int)
total_ = 0
page_number = 1

while True:
    url = f"{base_url}?page_number={page_number}"
    content_ = requests.get(url, auth=(username, password)).json()
    total_ += process_paginated_response(content_["results"], res)
    if content_["more"] is False:
        break
    page_number += 1

print(json.dumps(dict(res), indent=4))
print(total_)

Ответ

defaultdict(int) подходит для суммирования числа уязвимостей по device_id. Но пагинации нужны timeout, проверка HTTP/JSON, корректного more и предел страниц; иначе код может зависнуть или молча исказить итог.

Счётчик len(item['vulnerabilities']) считает записи, не обязательно уникальные CVE. Если один CVE повторяется на страницах, для уникального количества храните множество идентификаторов CVE на устройство. Сумма по устройствам также не равна числу уникальных CVE во всей системе.

Используйте HTTPS, Session, params={'page_number': page_number}, raise_for_status и валидацию структуры ответа. Строго проверяйте, что more — bool: выражение is False не остановится на строке 'false'. Ограничьте страницы и повторы, не логируйте credentials. Для меняющихся данных предпочтителен стабильный cursor/snapshot API.

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

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

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

Подробнее