""" Проверка наличия чекбокса согласия на обработку персональных данных. Согласно 152-ФЗ, обработка данных допустима только при наличии согласия субъекта. Формы на сайте (обратная связь, регистрация, подписка и т.д.) должны содержать явное согласие пользователя. """ from __future__ import annotations import re from playwright.async_api import Page from scanner.checks.base import BaseCheck from scanner.models import CheckResult, RiskLevel class FormCheckboxCheck(BaseCheck): """Проверяет наличие чекбокса согласия в формах на сайте.""" name = "form_checkbox" title = "Чекбокс согласия в формах" description = "Проверяет, есть ли чекбокс согласия на обработку ПД в формах, не предзаполнен ли он" risk_on_fail = RiskLevel.CRITICAL default_weight = 20 CONSENT_PATTERNS = [ r"согласие\s*на\s*обработку\s*данных", r"согласие\s*на\s*обработку\s*персональных?\s*данных?", r"я\s*согласен\s*на\s*", r"agree\s*to\s*the\s*", r"agree\s*to\s*privacy", r"я\s*принимаю\s*условия", r"processing\s*of\s*personal\s*data", r"обработк[аею]\s*персональных?\s*данных?", r"политик[уе]?\s*конфиденциальност[иы]", ] async def check(self, page: Page, url: str) -> CheckResult: try: forms = await page.query_selector_all("form") if not forms: return self._skip_result(message="Формы на странице не найдены.") total_forms = 0 forms_with_consent = 0 dark_patterns = [] # Предзаполненные чекбоксы forms_without_consent = [] for form in forms: total_forms += 1 checkboxes = await form.query_selector_all('input[type="checkbox"]') if not checkboxes: forms_without_consent.append({"reason": "нет чекбоксов"}) continue form_has_consent = False form_has_dark_pattern = False for cb in checkboxes: # Правильная детекция текста чекбокса: # 1. Ищем связанный