feat: вкладка «Безопасность» — коды УБИ, автоподбор угроз (программа/ИИ), сравнение, новый UI

- угрозы ФСТЭК теперь с кодами: «УБИ.001 Угроза …» (парсинг кода из БДУ, 227 шт)
- threat_rules.py — логика программы: по характеристикам объекта (тип ИС/АСУ/ИТКС,
  интернет да/нет, нарушитель внутр./внешн.) фильтрует перечень по ключевым словам
- verify.py: suggest_threats_ai — ИИ предлагает актуальные угрозы по описанию объекта
- вкладка перестроена: компактная 2-колоночная раскладка, панель действий сверху:
  «⬇️ Загрузить угрозы ФСТЭК» | «⚙️ Подобрать (программа)» | «🤖 Подобрать (ИИ)» |
  «⚖️ Сравнить» | «🤖 Проверить безопасность через ИИ»
- окно выбора из словаря: 720x680 + поле поиска (фильтр по тексту, важно для 227 угроз)
- сравнение программа↔ИИ: окно с двумя списками, совпавшие подсвечены зелёным
This commit is contained in:
2026-08-04 17:44:54 +04:00
parent b6f595fd32
commit 7158a90b76
5 changed files with 676 additions and 348 deletions
+29
View File
@@ -474,6 +474,35 @@ def compare_company_values(old_data, new_data):
return diffs
def suggest_threats_ai(security_data, api_key, model='deepseek-chat', base_url=None):
"""ИИ предлагает актуальные угрозы БИ для объекта КИИ по его характеристикам.
security_data — dict: name, description, object_type, sphere, architecture,
attacker_category, has_internet (True/False), etc.
Возвращает (список_угроз, ошибка).
"""
if not api_key:
return None, "Не задан API-ключ ИИ (Файл → Настройки → API)"
internet = 'да' if security_data.get('has_internet', True) else 'нет'
system = (
"Ты — эксперт ФСТЭК по безопасности критической информационной инфраструктуры "
"(187-ФЗ, приказ ФСТЭК № 236). На основе характеристик объекта КИИ составь "
"перечень АКТУАЛЬНЫХ угроз безопасности информации из БДУ ФСТЭК "
"(перечень угроз УБИ.xxx). Верни ТОЛЬКО JSON: "
'{"threats": ["УБИ.xxx Название угрозы", ...]} — от 8 до 15 угроз, '
"без пояснений и комментариев."
)
user = json.dumps(security_data, ensure_ascii=False)
js, err = _ai_json(api_key, model, base_url, system, user)
if err:
return None, err
threats = js.get('threats') or []
if isinstance(threats, str):
threats = [threats]
threats = [str(t).strip() for t in threats if str(t).strip()]
return threats, None
def check_security_ai(security_data, api_key, model='deepseek-chat', base_url=None):
"""ИИ-проверка заполненной вкладки «Безопасность» объекта КИИ (236 приказ).