fix(browser-matrix): Tracking-Signal statt Cookie-Rohzahl + Matrix-Schnellpfad
Korrektheit (§ 25 TDDDG): "Cookies vor Consent" ist KEIN Verstoss per se — technisch notwendige Cookies inkl. des Consent-Cookies (speichert die Ablehnung) sind nach Abs. 2 erlaubt. Verstoss ist nur nicht-essentielles TRACKING vor Consent. - browser_cross_finding: Befund haengt jetzt an violations.before_consent (Tracking), nicht an der Cookie-Rohzahl; § 25 Abs. 2-Hinweis im Detail. Regressionstest: Cookies-ohne-Tracking → KEIN Befund. - multi_browser_scanner._extract_dimensions: Score nutzt Tracking-Violations + reject_respected-Verdikt statt Rohzahl (Fallback erhalten). - BrowserBehaviorView: "Cookies vor Consent" nur rot/⚠ bei Tracking, "nach Ablehnen" neutral (Verdikt = reject-Spalte); erklaerende Zeile. Speed: run_consent_test ueberspringt im Matrix-Modus (browser_profile gesetzt) die teuren Phasen C/D-F/G — nur A+B noetig. Verhindert das 504 beim Multi-Engine-Scan (BMW 4 Engines lief sonst in den 338s-Gateway-Timeout). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -58,34 +58,44 @@ def build_cross_findings(matrix: dict | None) -> list[dict]:
|
||||
def _s(r: dict) -> dict:
|
||||
return r.get("summary") or {}
|
||||
|
||||
pre_yes = [r for r in data if (_s(r).get("cookies_before_consent") or 0) > 0]
|
||||
pre_no = [r for r in data if (_s(r).get("cookies_before_consent") or 0) == 0]
|
||||
def _pre_track(r: dict) -> int:
|
||||
# Nicht-essentielles TRACKING vor Consent (§ 25 Abs. 1 TDDDG) — das
|
||||
# rechtlich relevante Signal. NICHT die Cookie-Rohzahl: die enthaelt
|
||||
# technisch notwendige Cookies inkl. des Consent-Cookies selbst (das
|
||||
# speichern MUSS, dass abgelehnt wurde) → § 25 Abs. 2, einwilligungsfrei.
|
||||
return (_s(r).get("violations") or {}).get("before_consent") or 0
|
||||
|
||||
track_yes = [r for r in data if _pre_track(r) > 0]
|
||||
track_no = [r for r in data if _pre_track(r) == 0]
|
||||
rej_bad = [r for r in data if _s(r).get("reject_respected") is False]
|
||||
rej_ok = [r for r in data if _s(r).get("reject_respected") is True]
|
||||
|
||||
# ── Cookies vor der Einwilligung ─────────────────────────────────────
|
||||
if pre_yes and not pre_no:
|
||||
# ── Tracking VOR der Einwilligung (nicht: jede Cookie-Rohzahl) ────────
|
||||
_ESS = (" Technisch notwendige Cookies inkl. des Consent-Cookies sind "
|
||||
"ausgenommen (§ 25 Abs. 2 TDDDG).")
|
||||
if track_yes and not track_no:
|
||||
out.append({
|
||||
"title": "Cookies vor der Einwilligung — in allen Browsern",
|
||||
"detail": "In jeder getesteten Engine werden vor einer aktiven "
|
||||
"Einwilligung Cookies gesetzt.",
|
||||
"title": "Tracking vor der Einwilligung — in allen Browsern",
|
||||
"detail": "In jeder getesteten Engine feuern vor einer aktiven "
|
||||
"Einwilligung nicht-essentielle Tracker." + _ESS,
|
||||
"severity": "HIGH",
|
||||
"affected": _labels(pre_yes),
|
||||
"measure": "Tracking-/Marketing-Cookies erst nach aktiver "
|
||||
"Einwilligung setzen (§ 25 Abs. 1 TDDDG).",
|
||||
"affected": _labels(track_yes),
|
||||
"measure": "Tracking-/Marketing-Skripte erst nach aktiver "
|
||||
"Einwilligung laden (§ 25 Abs. 1 TDDDG).",
|
||||
})
|
||||
elif pre_yes and pre_no:
|
||||
masked = sorted({_protection_label(r) for r in pre_no if _protection_label(r)})
|
||||
hint = (f" Die unauffälligen Engines ({', '.join(_labels(pre_no))}) "
|
||||
f"unterdrücken die Cookies vermutlich clientseitig "
|
||||
elif track_yes and track_no:
|
||||
masked = sorted({_protection_label(r) for r in track_no if _protection_label(r)})
|
||||
hint = (f" Die unauffälligen Engines ({', '.join(_labels(track_no))}) "
|
||||
f"unterdrücken die Tracker vermutlich clientseitig "
|
||||
f"({', '.join(masked)}) — das ist KEIN Compliance-Beleg."
|
||||
if masked else "")
|
||||
out.append({
|
||||
"title": "Cookies vor Einwilligung — nur in manchen Browsern",
|
||||
"detail": f"Cookies vor Consent in {', '.join(_labels(pre_yes))}, "
|
||||
f"nicht in {', '.join(_labels(pre_no))}.{hint}",
|
||||
"title": "Tracking vor Einwilligung — nur in manchen Browsern",
|
||||
"detail": f"Nicht-essentielle Tracker vor Consent in "
|
||||
f"{', '.join(_labels(track_yes))}, nicht in "
|
||||
f"{', '.join(_labels(track_no))}.{hint}",
|
||||
"severity": "HIGH",
|
||||
"affected": _labels(pre_yes),
|
||||
"affected": _labels(track_yes),
|
||||
"measure": "Server-/skriptseitig auf Consent gaten statt auf den "
|
||||
"Tracking-Schutz einzelner Browser zu vertrauen.",
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user