From e50f3dfbee406d500a8644b7bc74a56a16716070 Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Thu, 7 May 2026 17:13:37 +0200 Subject: [PATCH] feat: All 138 hints rewritten as expert-level legal guidance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every hint now reads like a mini-consultation from a data protection lawyer — with specific legal references, court rulings, and common mistakes. Examples: - EuGH C-210/16 (Fanpage), C-298/17 (Kontaktpflicht), C-311/18 (Schrems II) - BGH I ZR 228/03 (ladungsfaehige Anschrift), XI ZR 388/10 (AGB) - EDSA Guidelines 2/2019 (lit. b misuse), WP 248 Rev.01 (DSFA) - DSK-Orientierungshilfe, CNIL-Leitlinien, SDM, BSI-IT-Grundschutz - §25 TDDDG, §38 BDSG, §309 BGB, §312k BGB, Art. 246a EGBGB This is the core value proposition: no lawyer can deliver this level of specific, actionable compliance feedback in 60 seconds. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../services/doc_checks/agb_checks.py | 42 ++++++------- .../services/doc_checks/cookie_checks.py | 30 +++++----- .../services/doc_checks/dse_checks.py | 60 +++++++++---------- .../services/doc_checks/dsfa_checks.py | 36 +++++------ .../services/doc_checks/impressum_checks.py | 32 +++++----- .../doc_checks/social_media_checks.py | 40 ++++++------- .../services/doc_checks/widerruf_checks.py | 30 +++++----- 7 files changed, 135 insertions(+), 135 deletions(-) diff --git a/backend-compliance/compliance/services/doc_checks/agb_checks.py b/backend-compliance/compliance/services/doc_checks/agb_checks.py index 769e11d..0c47443 100644 --- a/backend-compliance/compliance/services/doc_checks/agb_checks.py +++ b/backend-compliance/compliance/services/doc_checks/agb_checks.py @@ -16,7 +16,7 @@ AGB_CHECKLIST = [ r"diese\s+(?:agb|bedingungen)\s+gelten", ], "severity": "HIGH", - "hint": "Ihre AGB enthalten keinen Geltungsbereich. Ergaenzen Sie einen Abschnitt, der festlegt, fuer welche Vertraege und Parteien die AGB gelten.", + "hint": "Ohne Geltungsbereich ist unklar, ob die AGB fuer B2C, B2B oder beides gelten. Definieren Sie Vertragsgegenstand, Parteien und raeumlichen Anwendungsbereich — sonst droht Unwirksamkeit nach §305 Abs. 2 BGB.", }, { "id": "incorporation_clause", @@ -28,7 +28,7 @@ AGB_CHECKLIST = [ r"§\s*305", ], "severity": "MEDIUM", - "hint": "Es fehlt eine Einbeziehungsklausel gemaess §305 BGB. Stellen Sie klar, dass der Kunde vor Vertragsschluss auf die AGB hingewiesen wird und ihnen zustimmt.", + "hint": "Ohne wirksame Einbeziehung nach §305 Abs. 2 BGB werden AGB nicht Vertragsbestandteil. Der Kunde muss vor Vertragsschluss ausdruecklich auf die AGB hingewiesen werden und die Moeglichkeit zur Kenntnisnahme erhalten.", }, # ── L1: Vertragsschluss ─────────────────────────────────────────── @@ -41,7 +41,7 @@ AGB_CHECKLIST = [ r"contract\s+formation", r"angebot\s+und\s+annahme", ], "severity": "HIGH", - "hint": "Die AGB beschreiben nicht, wie ein Vertrag zustande kommt. Ergaenzen Sie eine Regelung zu Angebot und Annahme (z.B. Bestellung als Angebot, Bestaetigung als Annahme).", + "hint": "Haeufiger Fehler: Die Bestellung wird als Angebot des Kunden dargestellt, aber die Auftragsbestaetigung als Annahme — das ist nur wirksam, wenn klar zwischen Eingangsbestaetigung (§312i BGB) und Auftragsbestaetigung/Annahme unterschieden wird.", }, # ── L1: Haftung ─────────────────────────────────────────────────── @@ -54,7 +54,7 @@ AGB_CHECKLIST = [ r"schadensersatz", r"haftungsbeschr(?:ae|ä)nkung", ], "severity": "HIGH", - "hint": "Es fehlt eine Haftungsregelung. Nehmen Sie einen Abschnitt auf, der die Haftung regelt und dabei die gesetzlichen Mindestrechte (Vorsatz, grobe Fahrlaessigkeit, Personenschaeden) unberuehrt laesst.", + "hint": "Haftungsklauseln sind nach §309 Nr. 7 BGB unwirksam, wenn sie Haftung fuer Vorsatz, grobe Fahrlaessigkeit, Koerperschaeden oder Verletzung wesentlicher Vertragspflichten (Kardinalpflichten) ausschliessen. Haeufigster AGB-Abmahngrund.", }, # ── L1: Gerichtsstand / Anwendbares Recht ───────────────────────── @@ -67,7 +67,7 @@ AGB_CHECKLIST = [ r"jurisdiction", r"governing\s+law", ], "severity": "MEDIUM", - "hint": "Die AGB enthalten keine Angabe zum anwendbaren Recht oder Gerichtsstand. Benennen Sie das geltende Recht (z.B. deutsches Recht) und ggf. den Gerichtsstand.", + "hint": "Gerichtsstandsklauseln gegenueber Verbrauchern sind nach §38 ZPO nur sehr eingeschraenkt moeglich. Bei B2C-Shops: Besser auf eine Gerichtsstandsvereinbarung verzichten und nur das anwendbare Recht (deutsches Recht unter Ausschluss UN-Kaufrecht) benennen.", }, { "id": "dispute_odr_link", @@ -79,7 +79,7 @@ AGB_CHECKLIST = [ r"(?:online[\-\s]?streitbeilegung|online\s+dispute\s+resolution)", ], "severity": "MEDIUM", - "hint": "Der Link zur EU-Online-Streitbeilegungsplattform (https://ec.europa.eu/consumers/odr) fehlt. Dieser ist fuer Online-Haendler nach EU-Verordnung 524/2013 Pflicht.", + "hint": "Online-Haendler muessen nach Art. 14 EU-VO 524/2013 einen klickbaren Link zur OS-Plattform (https://ec.europa.eu/consumers/odr) setzen — nicht nur die URL als Text. Fehlt der Link, droht Abmahnung. Seit 20.07.2025 gilt: Plattform wird eingestellt, pruefen Sie ob Pflicht noch besteht.", }, { "id": "choice_of_law_specific", @@ -92,7 +92,7 @@ AGB_CHECKLIST = [ r"un[\-\s]kaufrecht.*(?:ausgeschlossen|findet\s+keine\s+anwendung)", ], "severity": "LOW", - "hint": "Es wird kein konkretes anwendbares Recht benannt. Geben Sie explizit an, welches Recht gilt (z.B. 'Es gilt das Recht der Bundesrepublik Deutschland') und ob das UN-Kaufrecht ausgeschlossen ist.", + "hint": "Formulierung: 'Es gilt das Recht der Bundesrepublik Deutschland unter Ausschluss des UN-Kaufrechts (CISG).' Bei B2C zusaetzlich: 'Zwingende Verbraucherschutzvorschriften des Aufenthaltsstaates bleiben unberuehrt' (Art. 6(2) Rom-I-VO).", }, # ── L1: Zahlungsbedingungen ─────────────────────────────────────── @@ -106,7 +106,7 @@ AGB_CHECKLIST = [ r"zahlungsweise", r"rechnungsstellung", ], "severity": "MEDIUM", - "hint": "Die AGB enthalten keine Zahlungsbedingungen. Ergaenzen Sie Angaben zu Preisen, Zahlungsarten und Faelligkeit.", + "hint": "Bei B2C muessen Preise den Gesamtpreis inkl. MwSt. angeben (§1 PAngV). Zusatzkosten (Versand, Nachnahme) muessen VOR Vertragsschluss transparent sein. Versteckte Kosten sind nach §312a Abs. 3 BGB unwirksam.", }, { "id": "payment_methods", @@ -116,7 +116,7 @@ AGB_CHECKLIST = [ r"(?:vorkasse|nachnahme|lastschrift|sepa|(?:ue|ü)berweisung|kreditkarte|paypal|sofort(?:ue|ü)berweisung|klarna|rechnung|giropay|apple\s*pay|google\s*pay)", ], "severity": "LOW", - "hint": "Es werden keine konkreten Zahlungsarten aufgefuehrt. Listen Sie die akzeptierten Zahlungsmethoden auf (z.B. Kreditkarte, PayPal, SEPA-Lastschrift, Ueberweisung).", + "hint": "Listen Sie alle akzeptierten Zahlungsmethoden auf. Hinweis: Gaengige unentgeltliche Zahlungsmethode ist Pflicht (§312a Abs. 4 BGB). Aufschlaege auf bestimmte Zahlungsarten (z.B. Kreditkarte) sind seit 13.01.2018 verboten (§270a BGB).", }, { "id": "payment_due_date", @@ -128,7 +128,7 @@ AGB_CHECKLIST = [ r"zahlungsfrist", ], "severity": "LOW", - "hint": "Es fehlt eine Angabe zur Faelligkeit der Zahlung. Geben Sie an, wann die Zahlung faellig ist (z.B. 'sofort nach Rechnungsstellung' oder 'innerhalb von 14 Tagen').", + "hint": "Ohne Faelligkeitsregelung gilt §271 BGB (sofort faellig). Bei 'Vorkasse' muss klar sein, dass erst nach Zahlungseingang geliefert wird. Verzugszinsen-Pauschalen ueber 40 EUR (§288 Abs. 5 BGB) sind in B2C-AGB unwirksam (§309 Nr. 5 BGB).", }, # ── L1: Lieferung ───────────────────────────────────────────────── @@ -142,7 +142,7 @@ AGB_CHECKLIST = [ r"(?:zugang|zugriff).*(?:dienst|leistung)", ], "severity": "MEDIUM", - "hint": "Die AGB regeln nicht die Lieferung oder Leistungserbringung. Ergaenzen Sie Angaben zu Liefergebiet, Versandart und Lieferfristen.", + "hint": "Bei Fernabsatzvertraegen muss der Unternehmer spaetestens 30 Tage nach Vertragsschluss liefern (§475 Abs. 1 BGB). Formulierungen wie 'Lieferung in der Regel in...' oder 'voraussichtlich' sind nur als Richtwert zulaessig, nicht als verbindliche Frist.", }, { "id": "delivery_timeframe", @@ -154,7 +154,7 @@ AGB_CHECKLIST = [ r"(?:liefer|versand).*\d+[\-\s]+(?:\d+\s+)?(?:werk)?tage", ], "severity": "LOW", - "hint": "Es wird keine konkrete Lieferzeit angegeben. Nennen Sie die voraussichtliche Lieferfrist (z.B. '3-5 Werktage nach Zahlungseingang').", + "hint": "Nennen Sie eine konkrete Lieferfrist (z.B. '3-5 Werktage'). Haeufiger Fehler: 'Lieferzeit ca. 2-4 Wochen' ist zu vage. Die Angabe muss so konkret sein, dass der Kunde den spaetesten Lieferzeitpunkt erkennen kann (BGH, Az. I ZR 133/20).", }, # ── L1: Gewaehrleistung ─────────────────────────────────────────── @@ -168,7 +168,7 @@ AGB_CHECKLIST = [ r"gew(?:ae|ä)hrleistungsfrist", ], "severity": "MEDIUM", - "hint": "Die AGB enthalten keine Gewaehrleistungsregelung. Nehmen Sie einen Abschnitt zu Maengelrechten auf, der die gesetzlichen Gewaehrleistungsansprueche beschreibt.", + "hint": "Gewaehrleistungsrechte (§§434ff BGB) duerfen bei B2C nicht eingeschraenkt werden (§476 BGB). Haeufiger Verstoss: AGB-Klausel 'Gewaehrleistung ausgeschlossen' — bei Verbrauchern stets unwirksam. Bei B2B ist Beschraenkung auf Nacherfuellung zulaessig.", }, { "id": "warranty_period", @@ -180,7 +180,7 @@ AGB_CHECKLIST = [ r"(?:gew(?:ae|ä)hrleistung|m(?:ae|ä)ngel|verj(?:ae|ä)hrung).*(?:2|zwei)\s+jahre", ], "severity": "LOW", - "hint": "Die Gewaehrleistungsfrist wird nicht genannt. Geben Sie die Frist an (gesetzlich: 2 Jahre bei Neuware, 1 Jahr bei Gebrauchtwaren gegenueber Verbrauchern moeglich).", + "hint": "Gesetzlich: 2 Jahre bei Neuware (§438 BGB). Bei Gebrauchtware kann die Frist auf 1 Jahr verkuerzt werden (§476 Abs. 2 BGB) — aber NUR bei ausdruecklicher Vereinbarung. Seit 01.01.2022 gilt zusaetzlich die Beweislastumkehr fuer 1 Jahr (statt 6 Monate).", }, # ── L1: Kuendigung ──────────────────────────────────────────────── @@ -194,7 +194,7 @@ AGB_CHECKLIST = [ r"k(?:ue|ü)ndigungsfrist", ], "severity": "MEDIUM", - "hint": "Es fehlt eine Kuendigungsregelung. Beschreiben Sie, wie und unter welchen Bedingungen der Vertrag gekuendigt werden kann.", + "hint": "Bei Dauerschuldverhaeltnissen (Abos, SaaS) muss das Recht zur ordentlichen Kuendigung gewaehrt werden. Automatische Verlaengerungen ueber 1 Jahr sind nach §309 Nr. 9 BGB unwirksam. Seit 01.03.2022: Kuendigungsbutton nach §312k BGB Pflicht.", }, { "id": "termination_period", @@ -206,7 +206,7 @@ AGB_CHECKLIST = [ r"(?:k(?:ue|ü)ndig|frist).*\d+\s+(?:tage?|wochen?|monate?)", ], "severity": "LOW", - "hint": "Es wird keine konkrete Kuendigungsfrist angegeben. Nennen Sie die Frist (z.B. '4 Wochen zum Monatsende') und den Zeitpunkt, ab dem sie gilt.", + "hint": "§309 Nr. 9 BGB: Erstlaufzeit max. 2 Jahre, Verlaengerung max. 1 Jahr, Kuendigungsfrist max. 3 Monate. Seit 01.03.2022: Nach Erstlaufzeit jederzeit mit 1 Monat kuendbar (§314 BGB analog). Laengere Fristen sind bei B2C unwirksam.", }, { "id": "termination_form", @@ -217,7 +217,7 @@ AGB_CHECKLIST = [ r"(?:schriftlich|textform).*k(?:ue|ü)ndigung", ], "severity": "LOW", - "hint": "Die Formvorschrift fuer Kuendigungen fehlt. Geben Sie an, in welcher Form eine Kuendigung erfolgen muss (z.B. Textform per E-Mail oder schriftlich per Post).", + "hint": "Kuendigung per E-Mail genuegt der Textform (§126b BGB). Klauseln, die Schriftform (§126 BGB, eigenhaendige Unterschrift) verlangen, sind bei B2C nach §309 Nr. 13 BGB unwirksam. Seit 01.07.2022: Kuendigung in Textform muss stets akzeptiert werden.", }, # ── L1: Datenschutzhinweis in AGB ───────────────────────────────── @@ -232,7 +232,7 @@ AGB_CHECKLIST = [ r"dsgvo.*(?:agb|vertrag)", ], "severity": "LOW", - "hint": "Die AGB enthalten keinen Verweis auf den Datenschutz. Ergaenzen Sie einen Hinweis, dass personenbezogene Daten gemaess Ihrer Datenschutzerklaerung verarbeitet werden, und verlinken Sie diese.", + "hint": "AGB und Datenschutzerklaerung sind rechtlich getrennte Dokumente. Mischen Sie KEINE Datenschutzhinweise in die AGB ein — stattdessen genuegt ein Verweis: 'Details zur Datenverarbeitung finden Sie in unserer Datenschutzerklaerung [Link].'", }, # ── Neue L1: Salvatorische Klausel ──────────────────────────────── @@ -247,7 +247,7 @@ AGB_CHECKLIST = [ r"(?:uebrigen|übrigen)\s+bestimmungen.*(?:unberuehrt|unberührt|wirksam|bestehen)", ], "severity": "LOW", - "hint": "Es fehlt eine salvatorische Klausel. Ergaenzen Sie eine Regelung, dass die uebrigen Bestimmungen wirksam bleiben, falls einzelne Klauseln unwirksam sein sollten.", + "hint": "Die klassische salvatorische Klausel ('unwirksame Bestimmungen werden durch wirksame ersetzt') ist nach BGH-Rechtsprechung in AGB selbst unwirksam. Besser: Nur die Erhaltungsklausel verwenden ('Die uebrigen Bestimmungen bleiben wirksam').", }, # ── Neue L1: Aenderungsklausel ──────────────────────────────────── @@ -262,7 +262,7 @@ AGB_CHECKLIST = [ r"(?:neue\s+fassung|neufassung).*(?:agb|bedingung)", ], "severity": "LOW", - "hint": "Die AGB enthalten keine Aenderungsklausel. Beschreiben Sie, wie und wann die AGB geaendert werden koennen und wie Kunden ueber Aenderungen informiert werden.", + "hint": "AGB-Aenderungsklauseln bei B2C sind nur unter engen Voraussetzungen wirksam (BGH Az. XI ZR 388/10): Aenderungsgrund muss konkret benannt sein, Kunde muss angemessene Frist zur Kuendigung erhalten. Pauschale 'Wir koennen jederzeit aendern'-Klauseln sind unwirksam.", }, # ── Neue L1: Verbraucherrechte §309 ─────────────────────────────── @@ -277,6 +277,6 @@ AGB_CHECKLIST = [ r"(?:verbrauch|konsument).*(?:recht|anspruch|schutz)", ], "severity": "LOW", - "hint": "Es fehlt ein Hinweis, dass zwingende Verbraucherrechte (§309 BGB) unberuehrt bleiben. Stellen Sie klar, dass gesetzliche Verbraucherrechte durch die AGB nicht eingeschraenkt werden.", + "hint": "Haeufigste §309 BGB-Verstoesse: Pauschalierter Schadensersatz ohne Gegenbeweismoeglichkeit (Nr. 5), Haftungsausschluss bei Koerperschaeden (Nr. 7a), Schriftformerfordernis fuer Kuendigung (Nr. 13). Jede dieser Klauseln ist einzeln abmahnfaehig.", }, ] diff --git a/backend-compliance/compliance/services/doc_checks/cookie_checks.py b/backend-compliance/compliance/services/doc_checks/cookie_checks.py index 2a4091a..b176e06 100644 --- a/backend-compliance/compliance/services/doc_checks/cookie_checks.py +++ b/backend-compliance/compliance/services/doc_checks/cookie_checks.py @@ -16,7 +16,7 @@ COOKIE_CHECKLIST = [ r"cookie.*(?:art|typ|kategori)", ], "severity": "HIGH", - "hint": "Ihre Cookie-Richtlinie muss die verschiedenen Arten von Cookies auflisten (z.B. notwendige, funktionale, Statistik-, Marketing-Cookies). Ergaenzen Sie eine Kategorisierung aller eingesetzten Cookie-Typen.", + "hint": "Gemaess §25 TDDDG und DSK-Orientierungshilfe muessen Cookie-Kategorien einzeln aufgeschluesselt werden (essentiell, funktional, Statistik, Marketing). Haeufiger Fehler: 'Wir verwenden Cookies' ohne Differenzierung genuegt nicht.", }, { "id": "cookie_names_listed", @@ -29,7 +29,7 @@ COOKIE_CHECKLIST = [ r"(?:name|bezeichnung)\s+.*(?:funktion|zweck|speicherdauer|laufzeit)", ], "severity": "MEDIUM", - "hint": "Neben den Kategorien sollten auch die konkreten Cookie-Namen aufgefuehrt werden (z.B. _ga, _gid, PHPSESSID). Listen Sie jeden einzelnen Cookie mit seinem technischen Namen auf.", + "hint": "Die DSK fordert eine Auflistung jedes einzelnen Cookies mit technischem Namen (z.B. _ga, _gid, PHPSESSID). Tipp: Browser-DevTools > Application > Cookies zeigt alle aktiven Cookies — gleichen Sie diese mit Ihrer Liste ab.", }, { "id": "cookie_essential_justified", @@ -43,7 +43,7 @@ COOKIE_CHECKLIST = [ r"(?:betrieb|funktion)\w*\s+(?:der|unserer)\s+(?:internetseite|website|webseite)", ], "severity": "LOW", - "hint": "Fuer essenzielle/notwendige Cookies muss begruendet werden, warum sie technisch erforderlich sind (z.B. Warenkorb, Session, Sicherheit). Ergaenzen Sie eine kurze Begruendung je Cookie.", + "hint": "§25 Abs. 2 TDDDG erlaubt einwilligungsfreie Cookies nur wenn 'unbedingt erforderlich'. Jedes essentielle Cookie braucht eine konkrete Begruendung (z.B. 'Session-ID fuer Warenkorb-Zuordnung'). Pauschale Behauptungen ('fuer den Betrieb noetig') reichen nicht.", }, # ── L1: Zwecke der Cookies ──────────────────────────────────────── @@ -60,7 +60,7 @@ COOKIE_CHECKLIST = [ r"cookies?\s+(?:dienen|helfen|erm(?:oe|ö)glichen)", ], "severity": "HIGH", - "hint": "Die Cookie-Richtlinie muss erklaeren, zu welchem Zweck Cookies eingesetzt werden (z.B. Analyse, Marketing, Funktionalitaet). Beschreiben Sie den Zweck fuer jede Cookie-Kategorie.", + "hint": "Art. 13 Abs. 1 lit. c DSGVO verlangt die Zweckangabe je Verarbeitung. Jede Cookie-Kategorie braucht einen konkreten Zweck (z.B. 'Reichweitenmessung', 'Conversion-Tracking'), nicht nur 'zur Verbesserung unserer Website'.", }, { "id": "cookie_providers_named", @@ -71,7 +71,7 @@ COOKIE_CHECKLIST = [ r"(?:anbieter|provider|dienst)\s*[:\|]\s*[A-Z]", ], "severity": "MEDIUM", - "hint": "Die konkreten Anbieter und Dienste, die Cookies setzen, muessen namentlich genannt werden (z.B. Google Analytics, Meta Pixel, Hotjar). Ergaenzen Sie alle Drittanbieter-Dienste mit Namen.", + "hint": "Art. 13 Abs. 1 lit. e DSGVO verlangt die Nennung der Empfaenger. Jeder Dienst, der Cookies setzt, muss mit Firmenname und Sitz benannt werden (z.B. 'Google Ireland Limited, Dublin'). Anonyme Angaben wie 'Drittanbieter' genuegen nicht.", }, { "id": "cookie_analytics_named", @@ -81,7 +81,7 @@ COOKIE_CHECKLIST = [ r"google\s+analytics|matomo|piwik|plausible|fathom|adobe\s+analytics|microsoft\s+clarity|hotjar|etracker", ], "severity": "LOW", - "hint": "Falls Sie Analyse-/Statistik-Tools einsetzen, muessen diese konkret benannt werden (z.B. Google Analytics, Matomo, Hotjar). Fuehren Sie jedes eingesetzte Analysetool namentlich auf.", + "hint": "Statistik-Cookies erfordern gemaess §25 Abs. 1 TDDDG eine Einwilligung — auch bei 'anonymisierter' Nutzung (vgl. CNIL-Leitlinie zu Google Analytics, 2022). Ausnahme: Serverseitige Tools ohne Endgeraetezugriff (z.B. Matomo ohne Cookies).", }, { "id": "cookie_marketing_named", @@ -91,7 +91,7 @@ COOKIE_CHECKLIST = [ r"(?:facebook|meta)\s+pixel|google\s+ads|linkedin\s+insight|tiktok\s+pixel|pinterest\s+tag|criteo|adroll|taboola", ], "severity": "LOW", - "hint": "Falls Sie Marketing- oder Tracking-Tools einsetzen, muessen diese konkret benannt werden (z.B. Meta Pixel, Google Ads, LinkedIn Insight Tag). Listen Sie alle Marketing-Dienste namentlich auf.", + "hint": "Marketing-Cookies (Meta Pixel, Google Ads etc.) erfordern immer eine Einwilligung vor dem Setzen (§25 Abs. 1 TDDDG). Haeufiger Fehler: Pixel wird beim Seitenaufruf geladen bevor der Nutzer im Banner zustimmt — das ist ein Verstoss.", }, # ── L1: Speicherdauer ───────────────────────────────────────────── @@ -104,7 +104,7 @@ COOKIE_CHECKLIST = [ r"cookie.*(?:\d+\s+(?:tag|monat|jahr)|session)", ], "severity": "MEDIUM", - "hint": "Die Cookie-Richtlinie muss Angaben zur Speicherdauer der Cookies enthalten. Ergaenzen Sie fuer jede Cookie-Kategorie oder jeden Cookie, wie lange er gespeichert wird (z.B. Session, 30 Tage, 1 Jahr).", + "hint": "Art. 13 Abs. 2 lit. a DSGVO verlangt die Speicherdauer oder Kriterien fuer deren Festlegung. Hinweis: Auch Session-Cookies muessen als solche gekennzeichnet werden ('wird beim Schliessen des Browsers geloescht').", }, { "id": "cookie_duration_values", @@ -116,7 +116,7 @@ COOKIE_CHECKLIST = [ r"(?:ablauf|expiry|laufzeit)\s*[:\|]\s*\d+", ], "severity": "LOW", - "hint": "Neben einer allgemeinen Angabe sollten konkrete Speicherdauern pro Cookie angegeben werden (z.B. _ga: 2 Jahre, Session-Cookie: bis Browser geschlossen). Ergaenzen Sie die exakte Laufzeit fuer jeden Cookie.", + "hint": "Die DSK-Orientierungshilfe verlangt die Speicherdauer pro Cookie (z.B. '_ga: 2 Jahre', '_gid: 24 Stunden'). Pruefen Sie die tatsaechlichen Werte in den Browser-DevTools — Anbieter-Dokumentation ist oft veraltet.", }, # ── L1: Drittanbieter ───────────────────────────────────────────── @@ -129,7 +129,7 @@ COOKIE_CHECKLIST = [ r"(?:google|facebook|meta|microsoft).*cookie", ], "severity": "MEDIUM", - "hint": "Falls Drittanbieter-Cookies eingesetzt werden, muss dies in der Cookie-Richtlinie erwaehnt werden. Geben Sie an, welche Drittanbieter Cookies auf Ihrer Website setzen.", + "hint": "Bei Drittanbieter-Cookies liegt eine Datenuebermittlung an Dritte vor (Art. 13 Abs. 1 lit. e DSGVO). Bei US-Anbietern pruefen Sie zusaetzlich den Drittlandtransfer: EU-US Data Privacy Framework (DPF) oder Standardvertragsklauseln (Art. 46(2)(c) DSGVO) noetig.", }, { "id": "cookie_legal_basis", @@ -144,7 +144,7 @@ COOKIE_CHECKLIST = [ r"(?:cookie|nutzung\s+von\s+cookie).*rechtsgrundlage", ], "severity": "MEDIUM", - "hint": "Die Rechtsgrundlage fuer Cookies muss genannt werden: §25 TDDDG fuer nicht-essentielle Cookies (Einwilligung), oder Art. 6(1)(f) DSGVO fuer technisch notwendige Cookies (berechtigtes Interesse).", + "hint": "Zweistufige Rechtsgrundlage beachten: §25 Abs. 1 TDDDG (Einwilligung fuer Endgeraetezugriff) + Art. 6(1)(a) DSGVO (Datenverarbeitung). Fuer technisch notwendige Cookies: §25 Abs. 2 TDDDG + Art. 6(1)(f) DSGVO. Haeufiger Fehler: Nur DSGVO ohne TDDDG angeben.", }, # ── L1: Widerspruch ─────────────────────────────────────────────── @@ -157,7 +157,7 @@ COOKIE_CHECKLIST = [ r"cookie.*(?:ablehnen|deaktivieren|l(?:oe|ö)schen)", ], "severity": "MEDIUM", - "hint": "Die Cookie-Richtlinie muss eine Widerspruchsmoeglichkeit beschreiben — also wie Nutzer Cookies ablehnen, deaktivieren oder loeschen koennen. Ergaenzen Sie einen Abschnitt zum Opt-out.", + "hint": "Art. 7 Abs. 3 DSGVO: Die Einwilligung muss jederzeit widerrufbar sein, und der Widerruf muss so einfach sein wie die Erteilung. Konkret: Ein 'Cookies verwalten'-Link im Footer genuegt; ein versteckter Link in der Datenschutzerklaerung reicht nicht.", }, { "id": "cookie_consent_mechanism", @@ -169,7 +169,7 @@ COOKIE_CHECKLIST = [ r"einwilligung\s+(?:jederzeit|widerrufen|zurueckziehen|zur(?:ue|ü)ckziehen)", ], "severity": "LOW", - "hint": "Beschreiben Sie das eingesetzte Consent-Tool oder Cookie-Banner und erklaeren Sie, wie Nutzer ihre Einwilligung jederzeit widerrufen koennen (z.B. ueber das Cookie-Banner oder eine Einstellungsseite).", + "hint": "Das Consent-Tool muss namentlich erwaehnt werden (z.B. Cookiebot, Usercentrics, Borlabs). Die DSK verlangt: Ablehnen muss auf derselben Ebene wie Akzeptieren moeglich sein — kein 'Ablehnen' erst auf Unterseite (sog. Dark Patterns).", }, { "id": "cookie_browser_settings", @@ -181,7 +181,7 @@ COOKIE_CHECKLIST = [ r"(?:chrome|firefox|safari|edge).*(?:cookie|einstellung)", ], "severity": "LOW", - "hint": "Weisen Sie Nutzer darauf hin, dass sie Cookies auch ueber die Browser-Einstellungen verwalten, blockieren oder loeschen koennen. Nennen Sie idealerweise die gaengigen Browser (Chrome, Firefox, Safari, Edge).", + "hint": "Ergaenzen Sie einen Hinweis auf Browser-Einstellungen mit konkreten Links zu den Hilfeseiten (Chrome, Firefox, Safari, Edge). Achtung: Browser-Einstellungen allein ersetzen nicht das Consent-Banner — §25 TDDDG verlangt aktive Einwilligung.", }, # ── Neue L1: Cookie-Tabelle ─────────────────────────────────────── @@ -198,6 +198,6 @@ COOKIE_CHECKLIST = [ r"(?:funktionale|session|analyse|tracking)\s+cookies?\s+\w+", ], "severity": "LOW", - "hint": "Eine strukturierte Cookie-Tabelle oder -Liste mit Spalten wie Name, Anbieter, Zweck und Speicherdauer erleichtert die Uebersichtlichkeit und wird von Aufsichtsbehoerden empfohlen. Ergaenzen Sie eine tabellarische Uebersicht aller Cookies.", + "hint": "Die DSK-Orientierungshilfe empfiehlt eine Tabelle mit 5 Spalten: Name, Anbieter, Zweck, Speicherdauer, Typ (First-/Third-Party). Viele Consent-Tools (Cookiebot, Usercentrics) generieren diese Tabelle automatisch — binden Sie sie ein.", }, ] diff --git a/backend-compliance/compliance/services/doc_checks/dse_checks.py b/backend-compliance/compliance/services/doc_checks/dse_checks.py index 2a6fd58..eaf93ae 100644 --- a/backend-compliance/compliance/services/doc_checks/dse_checks.py +++ b/backend-compliance/compliance/services/doc_checks/dse_checks.py @@ -19,7 +19,7 @@ ART13_CHECKLIST = [ r"responsible\s+(?:party|for)", ], "severity": "HIGH", - "hint": "Der Name und die Kontaktdaten des Verantwortlichen muessen gemaess Art. 13(1)(a) DSGVO angegeben werden. Ergaenzen Sie: Firmenname, Rechtsform, Anschrift, E-Mail und Telefon.", + "hint": "Art. 13(1)(a) DSGVO verlangt vollstaendige Identifizierung: Firmenname mit Rechtsform (z.B. 'Muster GmbH'), ladungsfaehige Anschrift, E-Mail und Telefon. Haeufiger Fehler: Nur Markenname ohne Rechtsform — das genuegt nicht zur Zustellung.", }, { "id": "controller_address", @@ -30,7 +30,7 @@ ART13_CHECKLIST = [ r"[a-z\u00c0-\u017e]\w+(?:str|stra(?:ss|ß)e|weg|platz|allee|gasse|ring|damm)\s*\.?\s*\d", ], "severity": "MEDIUM", - "hint": "Die ladungsfaehige Anschrift des Verantwortlichen fehlt oder ist unvollstaendig. Erforderlich: Strasse, Hausnummer, PLZ und Ort. Ein Postfach allein genuegt nicht.", + "hint": "Erforderlich ist eine ladungsfaehige Anschrift (Strasse, Hausnummer, PLZ, Ort). Haeufiger Fehler: Postfach oder c/o-Adresse — beides genuegt laut BGH (I ZR 228/03) nicht fuer die Zustellung.", }, { "id": "controller_email", @@ -40,7 +40,7 @@ ART13_CHECKLIST = [ r"[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,}", ], "severity": "MEDIUM", - "hint": "Eine E-Mail-Adresse des Verantwortlichen muss angegeben werden, damit Betroffene ihre Rechte ausueben koennen.", + "hint": "Ohne E-Mail-Adresse koennen Betroffene ihre Rechte (Art. 15-21 DSGVO) nicht niedrigschwellig ausueben. Haeufiger Fehler: Nur Kontaktformular statt E-Mail — ein Formular allein genuegt nicht als unmittelbarer Kommunikationskanal.", }, { "id": "controller_phone", @@ -51,7 +51,7 @@ ART13_CHECKLIST = [ r"\+49\s*[\d\s/\-]{8,}", ], "severity": "MEDIUM", - "hint": "Eine Telefonnummer sollte angegeben werden, um eine niedrigschwellige Kontaktaufnahme zu ermoeglichen.", + "hint": "EuGH (C-298/17, 'Verein fuer Konsumenteninformation') verlangt effektive Kontaktmoeglichkeit. Telefon ist nicht zwingend, aber empfohlen — fehlt sie, muss ein gleichwertiger Kanal (z.B. Chat, Rueckruf) angeboten werden.", }, # ── L1: Datenschutzbeauftragter ─────────────────────────────────── @@ -65,7 +65,7 @@ ART13_CHECKLIST = [ r"dsb", r"dpo", ], "severity": "MEDIUM", - "hint": "Falls ein Datenschutzbeauftragter bestellt ist (Pflicht ab 20 Personen regelmaessig mit Datenverarbeitung), muessen dessen Kontaktdaten angegeben werden (Art. 13(1)(b) DSGVO).", + "hint": "DSB-Benennungspflicht besteht ab 20 Personen regelmaessig mit automatisierter Datenverarbeitung (§38 BDSG) oder bei Kerntaetigkeit in Ueberwachung/sensiblen Daten (Art. 37 DSGVO). Haeufiger Fehler: DSB bestellt, aber nicht in der DSE erwaehnt.", }, { "id": "dpo_contact", @@ -77,7 +77,7 @@ ART13_CHECKLIST = [ r"datenschutz@", ], "severity": "MEDIUM", - "hint": "Fuer den DSB muss mindestens eine direkte Kontaktmoeglichkeit angegeben sein (E-Mail-Adresse oder Telefon). Empfehlung: datenschutz@ihredomain.de", + "hint": "Art. 37(7) DSGVO verlangt Veroeffentlichung der Kontaktdaten des DSB. Mindestens eine E-Mail ist noetig — den Namen muessen Sie nicht nennen. Haeufiger Fehler: DSB wird erwaehnt, aber ohne jede Kontaktmoeglichkeit.", }, # ── L1: Zwecke der Verarbeitung ─────────────────────────────────── @@ -93,7 +93,7 @@ ART13_CHECKLIST = [ r"daten\s+werden\s+(?:zu|fuer|für)\s+(?:folgende|diese)", ], "severity": "HIGH", - "hint": "Art. 13(1)(c) verlangt eine Angabe der Zwecke, fuer die personenbezogene Daten verarbeitet werden. Listen Sie alle Verarbeitungszwecke konkret auf (z.B. Vertragserfuellung, Newsletter, Webanalyse).", + "hint": "Art. 13(1)(c) verlangt konkrete Zweckangaben — nicht nur 'Wir verarbeiten Ihre Daten'. Jeder Dienst braucht einen eigenen Zweck: z.B. 'Webanalyse via Matomo', 'Newsletter-Versand', 'Kontaktanfragen'. Pauschalformulierungen verstiessen laut DSK gegen den Transparenzgrundsatz (Art. 5(1)(a)).", }, { "id": "purposes_specific", @@ -104,7 +104,7 @@ ART13_CHECKLIST = [ r"(?:bereitstellung|betrieb|sicherheit|optimierung)\s+(?:der|des|unserer|unseres)", ], "severity": "LOW", - "hint": "Allgemeine Formulierungen wie 'Wir verarbeiten Daten' genuegen nicht. Nennen Sie konkrete Zwecke: z.B. Vertragsabwicklung, Kontaktanfragen, Website-Analyse, Newsletter-Versand.", + "hint": "Mindestens 2 konkrete Zwecke benennen, jeweils mit zugehoeriger Rechtsgrundlage. Beispiel: 'Vertragsabwicklung (Art. 6(1)(b))', 'Website-Analyse (Art. 6(1)(f))'. Einzelne Pauschalangabe genuegt nicht dem Bestimmtheitsgrundsatz.", }, # ── L1: Rechtsgrundlage ─────────────────────────────────────────── @@ -122,7 +122,7 @@ ART13_CHECKLIST = [ r"einwilligung\s+gem", ], "severity": "HIGH", - "hint": "Fuer jeden Verarbeitungszweck muss die Rechtsgrundlage nach Art. 6(1) DSGVO genannt werden: Einwilligung (a), Vertrag (b), rechtliche Pflicht (c), lebenswichtige Interessen (d), oeffentliches Interesse (e) oder berechtigtes Interesse (f).", + "hint": "Jeder Verarbeitungszweck braucht eine eigene Rechtsgrundlage aus Art. 6(1) DSGVO (lit. a-f). Haeufiger Fehler: 'berechtigtes Interesse' als Auffangtatbestand fuer alles — das ist unzulaessig. Cookies/Tracking erfordern i.d.R. Einwilligung (lit. a), nicht lit. f.", }, { "id": "legal_basis_consent_6a", @@ -133,7 +133,7 @@ ART13_CHECKLIST = [ r"einwilligung\s+(?:gem|nach|i\.?\s*s\.?\s*d\.?)", ], "severity": "LOW", - "hint": "Wenn Daten auf Basis einer Einwilligung verarbeitet werden (z.B. Newsletter, Cookies), sollte Art. 6(1)(a) DSGVO als Rechtsgrundlage genannt und auf das Widerrufsrecht hingewiesen werden.", + "hint": "Bei Einwilligung (Art. 6(1)(a)) muss zwingend auf das jederzeitige Widerrufsrecht hingewiesen werden (Art. 7(3) DSGVO). Haeufiger Fehler: Widerruf wird erwaehnt, aber ohne konkreten Weg (z.B. Link, E-Mail-Adresse, Abmeldelink).", }, { "id": "legal_basis_contract_6b", @@ -145,7 +145,7 @@ ART13_CHECKLIST = [ r"durchf(?:ue|ü)hrung\s+(?:eines|des|vorvertragliche)", ], "severity": "LOW", - "hint": "Daten, die zur Vertragserfuellung oder vorvertraglichen Massnahmen verarbeitet werden, sollten auf Art. 6(1)(b) DSGVO gestuetzt werden.", + "hint": "Art. 6(1)(b) gilt nur fuer Daten, die zur Vertragsdurchfuehrung objektiv erforderlich sind. Haeufiger Fehler: Tracking/Werbung auf lit. b stuetzen — laut EDSA (Guidelines 2/2019) ist das unzulaessig. Solche Zwecke erfordern lit. a oder lit. f.", }, { "id": "legal_basis_interest_6f", @@ -156,7 +156,7 @@ ART13_CHECKLIST = [ r"berechtigte[sn]?\s+interesse", ], "severity": "LOW", - "hint": "Wenn Sie sich auf ein berechtigtes Interesse (Art. 6(1)(f)) stuetzen, muss dieses Interesse konkret benannt werden (z.B. Betrugspraevention, IT-Sicherheit, Direktwerbung).", + "hint": "Bei Art. 6(1)(f) muss das konkrete Interesse benannt werden — 'berechtigtes Interesse' allein genuegt nicht. Beispiele: 'IT-Sicherheit', 'Betrugspraevention', 'Direktwerbung (ErwGr. 47)'. Ohne Benennung ist die Angabe intransparent.", }, { "id": "legal_basis_balancing", @@ -168,7 +168,7 @@ ART13_CHECKLIST = [ r"abw(?:ae|ä)gung.*(?:recht|interesse|freiheit)", ], "severity": "LOW", - "hint": "Bei Verarbeitung auf Basis von Art. 6(1)(f) muss dokumentiert werden, warum Ihr berechtigtes Interesse die Rechte der Betroffenen ueberwiegt. Ergaenzen Sie eine Interessenabwaegung oder verweisen Sie auf eine solche.", + "hint": "Art. 6(1)(f) erfordert eine dokumentierte Interessenabwaegung. Beschreiben Sie: (1) das konkrete Interesse, (2) warum es die Grundrechte der Betroffenen ueberwiegt, (3) welche Schutzmassnahmen bestehen. Fehlende Abwaegung ist ein haeufiger Bussgeldgrund.", }, # ── L1: Empfaenger ──────────────────────────────────────────────── @@ -183,7 +183,7 @@ ART13_CHECKLIST = [ r"auftragsverarbeit", ], "severity": "MEDIUM", - "hint": "Empfaenger oder Kategorien von Empfaengern der Daten muessen benannt werden (Art. 13(1)(e) DSGVO). Beispiele: Hosting-Anbieter, Zahlungsdienstleister, Steuerberater.", + "hint": "Art. 13(1)(e) verlangt Benennung der Empfaenger oder Empfaenger-Kategorien. Haeufiger Fehler: Google Analytics, Meta Pixel o.ae. werden eingebunden, aber nicht als Empfaenger genannt. Jeder Drittdienst mit Datenzugang muss erwaehnt werden.", }, { "id": "recipients_categories", @@ -194,7 +194,7 @@ ART13_CHECKLIST = [ r"(?:dienstleister|auftragnehmer|subunternehmer).*(?:fuer|für|im bereich)", ], "severity": "LOW", - "hint": "Listen Sie konkrete Empfaenger-Kategorien auf: z.B. IT-Dienstleister, Hosting-Anbieter, Zahlungsabwickler, Versandunternehmen, Steuerberater. 'Dritte' allein genuegt nicht.", + "hint": "'An Dritte' oder 'an Dienstleister' ist zu unbestimmt. Nennen Sie Kategorien: z.B. 'Hosting (Hetzner)', 'Zahlungsabwicklung (Stripe)', 'E-Mail-Versand (Mailchimp)'. EuGH (C-154/21, 'RW') fordert moeglichst konkrete Benennung.", }, { "id": "recipients_processor", @@ -206,7 +206,7 @@ ART13_CHECKLIST = [ r"avv|av-vertrag|auftragsverarbeitungsvertrag", ], "severity": "LOW", - "hint": "Falls Auftragsverarbeiter eingesetzt werden (z.B. Cloud-Hosting, E-Mail-Service), sollte dies erwaehnt und auf bestehende AVVs nach Art. 28 DSGVO hingewiesen werden.", + "hint": "Jeder Auftragsverarbeiter (Cloud-Hosting, Newsletter-Tool, CRM) erfordert einen AVV nach Art. 28 DSGVO. Erwaehnen Sie, dass AVVs abgeschlossen sind. Haeufiger Fehler: SaaS-Dienste (Mailchimp, HubSpot) ohne AVV einsetzen — das ist ein eigener DSGVO-Verstoss.", }, # ── L1: Drittlandtransfer ───────────────────────────────────────── @@ -223,7 +223,7 @@ ART13_CHECKLIST = [ r"privacy\s+shield", r"data\s+privacy\s+framework", ], "severity": "MEDIUM", - "hint": "Falls Daten ausserhalb des EWR uebermittelt werden (z.B. USA-basierte Dienste wie Google, Microsoft, AWS), muss dies angegeben werden — inkl. des Empfaengerlandes und der Schutzgarantien.", + "hint": "Art. 13(1)(f) DSGVO: Bei jedem Drittlandtransfer muessen Empfaengerland und Schutzgarantien genannt werden. Pruefen Sie: Google Fonts, reCAPTCHA, YouTube-Embeds, CDNs — all das sind USA-Transfers. Fehlende Angabe war Grundlage zahlreicher DSGVO-Bussgelder.", }, { "id": "third_country_mechanism", @@ -255,7 +255,7 @@ ART13_CHECKLIST = [ r"gesetzliche.*aufbewahrung", ], "severity": "HIGH", - "hint": "Die Speicherdauer oder die Kriterien zur Festlegung der Dauer muessen angegeben werden (Art. 13(2)(a) DSGVO). Nennen Sie konkrete Fristen (z.B. '10 Jahre steuerrechtliche Aufbewahrung') oder Loeschkriterien.", + "hint": "Art. 13(2)(a) verlangt Speicherdauer ODER Kriterien zur Festlegung. 'So lange wie noetig' genuegt nicht. Nennen Sie gesetzliche Fristen: 6 Jahre Handelsrecht (§257 HGB), 10 Jahre Steuerrecht (§147 AO), oder eigene Fristen pro Zweck.", }, { "id": "retention_periods", @@ -267,7 +267,7 @@ ART13_CHECKLIST = [ r"(?:nach|innerhalb)\s+(?:von\s+)?\d+\s+(?:tag|monat|jahr)", ], "severity": "MEDIUM", - "hint": "Statt allgemeiner Aussagen ('so lange wie noetig') sollten konkrete Fristen stehen: z.B. 'Logfiles: 7 Tage', 'Vertragsdaten: 10 Jahre (§257 HGB)', 'Bewerbungen: 6 Monate nach Absage'.", + "hint": "Konkrete Fristen pro Datenkategorie nennen: Logfiles 7-30 Tage, Rechnungen 10 Jahre (§147 AO), Bewerbungen 6 Monate (AGG-Frist), Newsletter-Daten bis Widerruf. Haeufiger Fehler: Nur eine pauschale Frist fuer alle Datenarten.", }, { "id": "retention_deletion", @@ -279,7 +279,7 @@ ART13_CHECKLIST = [ r"nach\s+(?:ablauf|wegfall).*(?:gel(?:oe|ö)scht|l(?:oe|ö)sch)", ], "severity": "LOW", - "hint": "Beschreiben Sie, wie und wann Daten geloescht werden: z.B. 'Nach Ablauf der Aufbewahrungsfrist werden die Daten routinemaessig geloescht.' oder Verweis auf ein internes Loeschkonzept.", + "hint": "Art. 5(1)(e) DSGVO (Speicherbegrenzung) erfordert ein Loeschkonzept. Beschreiben Sie den Prozess: automatische Loeschung nach Fristablauf, regelmaessige Pruefzyklen, oder Verweis auf DIN 66398 (Loeschkonzept). Reine Archivierung ohne Loeschfrist genuegt nicht.", }, # ── L1: Betroffenenrechte ───────────────────────────────────────── @@ -296,7 +296,7 @@ ART13_CHECKLIST = [ r"ihnen\s+(?:stehen|steht)\s+(?:ein|folgende)\s+recht", ], "severity": "HIGH", - "hint": "Die Betroffenenrechte (Art. 15-22 DSGVO) muessen vollstaendig aufgezaehlt werden: Auskunft, Berichtigung, Loeschung, Einschraenkung, Datenportabilitaet, Widerspruch und ggf. automatisierte Entscheidungen.", + "hint": "Art. 13(2)(b)-(d) verlangt Nennung ALLER Betroffenenrechte: Auskunft (Art. 15), Berichtigung (16), Loeschung (17), Einschraenkung (18), Portabilitaet (20), Widerspruch (21). Haeufiger Fehler: Art. 18 (Einschraenkung) oder Art. 20 (Portabilitaet) fehlen.", }, { "id": "rights_art15", @@ -304,7 +304,7 @@ ART13_CHECKLIST = [ "level": 2, "parent": "rights", "patterns": [r"art\.\s*15", r"recht\s+auf\s+auskunft", r"right\s+(?:of|to)\s+access"], "severity": "LOW", - "hint": "Ergaenzen Sie den Hinweis auf das Auskunftsrecht nach Art. 15 DSGVO: Betroffene koennen eine Kopie aller ueber sie gespeicherten Daten anfordern.", + "hint": "Art. 15 DSGVO: Betroffene koennen kostenlos Auskunft und eine Kopie aller Daten verlangen. Antwortfrist: 1 Monat (Art. 12(3)). Haeufiger Fehler: Kein Hinweis auf Kostenfreiheit oder den konkreten Anfrageweg (E-Mail-Adresse).", }, { "id": "rights_art16", @@ -312,7 +312,7 @@ ART13_CHECKLIST = [ "level": 2, "parent": "rights", "patterns": [r"art\.\s*16", r"recht\s+auf\s+berichtigung", r"right\s+to\s+rectification"], "severity": "LOW", - "hint": "Ergaenzen Sie das Recht auf Berichtigung nach Art. 16 DSGVO: Betroffene koennen die Korrektur unrichtiger Daten verlangen.", + "hint": "Art. 16 DSGVO: Betroffene koennen Berichtigung unrichtiger Daten und Vervollstaendigung unvollstaendiger Daten verlangen. Nennen Sie den konkreten Weg zur Geltendmachung (z.B. E-Mail an datenschutz@...).", }, { "id": "rights_art17", @@ -320,7 +320,7 @@ ART13_CHECKLIST = [ "level": 2, "parent": "rights", "patterns": [r"art\.\s*17", r"recht\s+auf\s+l(?:oe|ö)schung", r"right\s+to\s+erasure"], "severity": "LOW", - "hint": "Ergaenzen Sie das Recht auf Loeschung ('Recht auf Vergessenwerden') nach Art. 17 DSGVO.", + "hint": "Art. 17 DSGVO ('Recht auf Vergessenwerden'): Loeschung ist Pflicht, wenn Zweck entfaellt, Einwilligung widerrufen wird oder Daten unrechtmaessig verarbeitet wurden. Erwaehnen Sie auch die Ausnahmen (z.B. gesetzliche Aufbewahrungspflichten §257 HGB, §147 AO).", }, { "id": "rights_art18", @@ -328,7 +328,7 @@ ART13_CHECKLIST = [ "level": 2, "parent": "rights", "patterns": [r"art\.\s*18", r"einschr(?:ae|ä)nkung\s+der\s+verarbeitung", r"right\s+to\s+restriction"], "severity": "LOW", - "hint": "Ergaenzen Sie das Recht auf Einschraenkung der Verarbeitung nach Art. 18 DSGVO.", + "hint": "Art. 18 DSGVO wird am haeufigsten vergessen. Einschraenkung greift z.B. bei bestrittener Richtigkeit oder laufendem Widerspruch. Konkret nennen: 'Statt Loeschung koennen Sie Einschraenkung der Verarbeitung verlangen (Art. 18 DSGVO).'", }, { "id": "rights_art20", @@ -336,7 +336,7 @@ ART13_CHECKLIST = [ "level": 2, "parent": "rights", "patterns": [r"art\.\s*20", r"daten(?:ue|ü)bertragbarkeit|datenportabilit", r"right\s+to\s+data\s+portability"], "severity": "LOW", - "hint": "Ergaenzen Sie das Recht auf Datenuebertragbarkeit nach Art. 20 DSGVO: Betroffene koennen ihre Daten in einem maschinenlesbaren Format erhalten.", + "hint": "Art. 20 DSGVO: Gilt nur bei Verarbeitung auf Basis von Einwilligung (Art. 6(1)(a)) oder Vertrag (Art. 6(1)(b)) UND automatisierter Verarbeitung. Format: strukturiert, gaengig, maschinenlesbar (z.B. JSON, CSV). Nicht anwendbar bei Art. 6(1)(f).", }, { "id": "rights_art21", @@ -344,7 +344,7 @@ ART13_CHECKLIST = [ "level": 2, "parent": "rights", "patterns": [r"art\.\s*21", r"widerspruchsrecht", r"right\s+to\s+object"], "severity": "LOW", - "hint": "Ergaenzen Sie das Widerspruchsrecht nach Art. 21 DSGVO, insbesondere bei Verarbeitung auf Basis von Art. 6(1)(e) oder (f). Der Hinweis muss gesondert und in klarer Sprache erfolgen.", + "hint": "Art. 21(4) DSGVO: Der Widerspruchshinweis muss spaetestens zum Zeitpunkt der ersten Kommunikation GESONDERT und in klarer Sprache erfolgen. Haeufiger Fehler: Widerspruchsrecht nur im Fliesstext versteckt — eigener Abschnitt/Hervorhebung noetig.", }, { "id": "rights_art22_profiling", @@ -355,7 +355,7 @@ ART13_CHECKLIST = [ r"profiling", r"automated\s+(?:decision|individual)", ], "severity": "LOW", - "hint": "Falls automatisierte Entscheidungen oder Profiling stattfinden, muss dies offengelegt werden (Art. 22 DSGVO). Falls nicht: Ergaenzen Sie 'Es findet keine automatisierte Entscheidungsfindung einschliesslich Profiling statt.'", + "hint": "Art. 13(2)(f): Bei automatisierten Einzelentscheidungen muessen Logik, Tragweite und Auswirkungen erklaert werden. Falls kein Profiling stattfindet, explizit verneinen: 'Es findet keine automatisierte Entscheidungsfindung i.S.d. Art. 22 DSGVO statt.'", }, # ── L1: Beschwerderecht ─────────────────────────────────────────── @@ -372,7 +372,7 @@ ART13_CHECKLIST = [ r"(?:zust(?:ae|ä)ndige|competent)\s+(?:beh(?:oe|ö)rde|authority)", ], "severity": "MEDIUM", - "hint": "Betroffene muessen auf ihr Recht hingewiesen werden, sich bei einer Aufsichtsbehoerde zu beschweren (Art. 77 DSGVO). Nennen Sie idealerweise die zustaendige Landesbehoerde.", + "hint": "Art. 13(2)(d) verlangt einen Hinweis auf das Beschwerderecht bei der Aufsichtsbehoerde (Art. 77 DSGVO). Zustaendig ist die Behoerde am Sitz des Verantwortlichen — z.B. LfDI Baden-Wuerttemberg, BayLDA, oder LfD Niedersachsen. Name und Website angeben.", }, { "id": "complaint_authority_named", @@ -385,6 +385,6 @@ ART13_CHECKLIST = [ r"(?:bayerische|hessische|s(?:ae|ä)chsische|berliner)\s+(?:datenschutz|aufsicht)", ], "severity": "LOW", - "hint": "Nennen Sie die zustaendige Aufsichtsbehoerde mit Name und Kontakt. Z.B.: 'Der Landesbeauftragte fuer den Datenschutz und die Informationsfreiheit Baden-Wuerttemberg' mit Adresse und Website.", + "hint": "Vollstaendigen Namen, Adresse und Website der Aufsichtsbehoerde angeben. Haeufiger Fehler: 'die zustaendige Aufsichtsbehoerde' ohne Konkretisierung. Korrekt z.B.: 'LfDI BW, Koenigstrasse 10a, 70173 Stuttgart, www.baden-wuerttemberg.datenschutz.de'.", }, ] diff --git a/backend-compliance/compliance/services/doc_checks/dsfa_checks.py b/backend-compliance/compliance/services/doc_checks/dsfa_checks.py index 6415c14..6ef9d76 100644 --- a/backend-compliance/compliance/services/doc_checks/dsfa_checks.py +++ b/backend-compliance/compliance/services/doc_checks/dsfa_checks.py @@ -19,7 +19,7 @@ DSFA_CHECKLIST = [ r"folgen.*(?:verarbeitung|schutz).*personenbezogen", ], "severity": "HIGH", - "hint": "Es fehlt eine Schwellwertanalyse gemaess Art. 35 Abs. 1 DSGVO. Beschreiben Sie, warum die Verarbeitung voraussichtlich ein hohes Risiko fuer die Rechte und Freiheiten natuerlicher Personen birgt und eine DSFA erforderlich ist.", + "hint": "Pruefen Sie die DSK-Blacklist (Positivliste der Aufsichtsbehoerden) und die EDSA-Leitlinien WP 248 Rev.01: Treffen 2+ Kriterien zu (z.B. Profiling, systematische Ueberwachung, grosse Datenmenge), ist die DSFA nach Art. 35(1) DSGVO Pflicht.", }, # ── L1: Beschreibung der Verarbeitungsvorgaenge ─────────────────── @@ -34,7 +34,7 @@ DSFA_CHECKLIST = [ r"(?:kan(?:ae|ä)le|plattform).*(?:facebook|twitter|instagram|youtube|linkedin|xing)", ], "severity": "HIGH", - "hint": "Eine systematische Beschreibung der geplanten Verarbeitungsvorgaenge fehlt. Fuegen Sie einen Abschnitt hinzu, der Art, Umfang, Umstaende und Zweck der Verarbeitung detailliert beschreibt.", + "hint": "Art. 35(7)(a) DSGVO verlangt eine 'systematische Beschreibung'. Nutzen Sie die Struktur der EDSA-Leitlinien: Art der Verarbeitung, Umfang (Datenkategorien, Betroffenenanzahl), Kontext (Umstaende), Zweck und Rechtsgrundlage. Ein Datenflussdiagramm wird von LfDI-Behoerden empfohlen.", }, { "id": "processing_named", @@ -47,7 +47,7 @@ DSFA_CHECKLIST = [ r"kan(?:ae|ä)le\w*\s+(?:facebook|twitter|instagram|youtube|linkedin|xing)", ], "severity": "LOW", - "hint": "Der konkrete Verarbeitungsvorgang ist nicht namentlich benannt. Benennen Sie den spezifischen Vorgang (z.B. Betrieb einer Fanpage, Verwaltung eines Social-Media-Kanals) explizit im Dokument.", + "hint": "Benennen Sie den Verarbeitungsvorgang konkret, z.B. 'Betrieb einer Facebook-Fanpage inkl. Page Insights' oder 'Videobeobachtung oeffentlicher Bereiche'. Abstrakte Beschreibungen wie 'Nutzung von Social Media' genuegen nicht den Anforderungen der DSK.", }, # ── L1: Notwendigkeit / Verhaeltnismaessigkeit ──────────────────── @@ -63,7 +63,7 @@ DSFA_CHECKLIST = [ r"freiwillig\s+angegeben", ], "severity": "HIGH", - "hint": "Die Bewertung der Notwendigkeit und Verhaeltnismaessigkeit der Verarbeitung fehlt. Begruenden Sie, warum die Verarbeitung erforderlich ist und in einem angemessenen Verhaeltnis zum Zweck steht.", + "hint": "Art. 35(7)(b) DSGVO: Pruefen Sie Erforderlichkeit (gibt es mildere Mittel?), Zweckbindung (Art. 5(1)(b)) und Datenminimierung (Art. 5(1)(c)). Bei Social-Media-DSFA: Begruenden Sie, warum eine Fanpage noetig ist und nicht z.B. eine eigene Website genuegt.", }, { "id": "legal_basis_dsfa", @@ -75,7 +75,7 @@ DSFA_CHECKLIST = [ r"(?:einwilligung|vertrag|berechtigt).*(?:rechtsgrundlage|grundlage)", ], "severity": "LOW", - "hint": "Die Rechtsgrundlage der Verarbeitung ist nicht angegeben. Nennen Sie die einschlaegige Rechtsgrundlage nach Art. 6 Abs. 1 DSGVO (z.B. Einwilligung, berechtigtes Interesse, Vertragserfuellung).", + "hint": "Die Rechtsgrundlage ist Teil der Verhaeltnismaessigkeitspruefung. Bei Art. 6(1) lit. f (berechtigtes Interesse) muss die Interessenabwaegung dokumentiert werden. Bei Art. 9-Daten (z.B. Gesundheit, politische Meinungen) ist zusaetzlich Art. 9(2) DSGVO zu pruefen.", }, # ── L1: Risikobewertung ─────────────────────────────────────────── @@ -92,7 +92,7 @@ DSFA_CHECKLIST = [ r"systematische\s+beobachtung", ], "severity": "HIGH", - "hint": "Eine Risikobewertung fuer die Rechte und Freiheiten der Betroffenen fehlt. Fuehren Sie eine strukturierte Risikoanalyse durch, die moegliche Schaeden und deren Auswirkungen auf die betroffenen Personen beschreibt.", + "hint": "Art. 35(7)(c) DSGVO: Verwenden Sie eine Risikomatrix (Eintrittswahrscheinlichkeit x Schadenshoehe). Die DSK empfiehlt das SDM (Standard-Datenschutzmodell) mit den Schutzzielen: Vertraulichkeit, Integritaet, Verfuegbarkeit, Nichtverkettbarkeit, Transparenz, Intervenierbarkeit.", }, { "id": "risk_probability", @@ -104,7 +104,7 @@ DSFA_CHECKLIST = [ r"(?:gering|mittel|hoch)\w*\s+(?:wahrscheinlichkeit|eintritt)", ], "severity": "MEDIUM", - "hint": "Die Eintrittswahrscheinlichkeit der identifizierten Risiken ist nicht bewertet. Ordnen Sie jedem Risiko eine Eintrittswahrscheinlichkeit zu (z.B. gering, mittel, hoch).", + "hint": "Nutzen Sie eine 4-stufige Skala (gering/mittel/hoch/sehr hoch) analog zum CNIL-DSFA-Tool oder dem BSI-IT-Grundschutz. Die Eintrittswahrscheinlichkeit muss je Risiko einzeln bewertet und nachvollziehbar begruendet werden.", }, { "id": "risk_severity", @@ -118,7 +118,7 @@ DSFA_CHECKLIST = [ r"(?:risiko|gefahr).*(?:gering|mittel|hoch|wesentlich|begrenzt)", ], "severity": "MEDIUM", - "hint": "Die Schwere der moeglichen Auswirkungen auf Betroffene ist nicht bewertet. Bewerten Sie fuer jedes Risiko die Schadenshoehe (z.B. gering, mittel, hoch, kritisch) und unterscheiden Sie physische, materielle und immaterielle Schaeden.", + "hint": "EG 75 DSGVO nennt konkrete Schadensbeispiele: Diskriminierung, Identitaetsdiebstahl, finanzielle Verluste, Rufschaedigung, Verlust der Vertraulichkeit bei Berufsgeheimnissen. Bewerten Sie physische, materielle UND immaterielle Schaeden getrennt.", }, # ── L1: Abhilfemassnahmen ───────────────────────────────────────── @@ -134,7 +134,7 @@ DSFA_CHECKLIST = [ r"risiko.*(?:minim|reduz|begrenzen)", ], "severity": "HIGH", - "hint": "Abhilfemassnahmen zur Risikominderung fehlen. Beschreiben Sie die geplanten technischen und organisatorischen Massnahmen (TOMs), mit denen die identifizierten Risiken eingedaemmt werden sollen.", + "hint": "Art. 35(7)(d) DSGVO: Ordnen Sie jedem identifizierten Risiko konkrete Abhilfemassnahmen zu. Orientieren Sie sich am SDM (Standard-Datenschutzmodell) der DSK. Das Restrisiko nach Umsetzung der Massnahmen muss explizit bewertet werden.", }, { "id": "tom_encryption", @@ -145,7 +145,7 @@ DSFA_CHECKLIST = [ r"(?:transport|ende[\-\s]zu[\-\s]ende)[\-\s]?verschl(?:ue|ü)sselung", ], "severity": "LOW", - "hint": "Verschluesselung ist nicht als Schutzmassnahme aufgefuehrt. Ergaenzen Sie, ob und welche Verschluesselungsverfahren eingesetzt werden (z.B. TLS-Transportverschluesselung, Ende-zu-Ende-Verschluesselung).", + "hint": "Art. 32(1)(a) DSGVO nennt Verschluesselung ausdruecklich als Massnahme. Dokumentieren Sie konkret: TLS 1.2+ fuer Transport, AES-256 fuer Speicherung, ggf. E2E-Verschluesselung. Bei Social Media: Weisen Sie auf HTTPS-Erzwingung der Plattform hin.", }, { "id": "tom_pseudonymization", @@ -156,7 +156,7 @@ DSFA_CHECKLIST = [ r"(?:pseudonymisiert|anonymisiert).*(?:daten|verarbeit)", ], "severity": "LOW", - "hint": "Pseudonymisierung oder Anonymisierung ist nicht als Massnahme erwaehnt. Pruefen Sie, ob personenbezogene Daten pseudonymisiert oder anonymisiert werden koennen, und dokumentieren Sie dies.", + "hint": "Art. 25(1) DSGVO (Privacy by Design) nennt Pseudonymisierung als Leitbeispiel. Unterscheiden Sie korrekt: Pseudonymisierung (Zuordnung noch moeglich, DSGVO gilt) vs. Anonymisierung (kein Personenbezug mehr, DSGVO gilt nicht). Bei Insights: Aggregation genuegt oft als Anonymisierung.", }, { "id": "tom_access_control", @@ -168,7 +168,7 @@ DSFA_CHECKLIST = [ r"(?:need[\-\s]to[\-\s]know|least\s+privilege|minimalprinzip)", ], "severity": "LOW", - "hint": "Zugriffskontrollmassnahmen sind nicht dokumentiert. Beschreiben Sie, wie der Zugriff auf personenbezogene Daten beschraenkt wird (z.B. Berechtigungskonzept, Rollenmodell, Need-to-know-Prinzip).", + "hint": "Dokumentieren Sie ein Berechtigungskonzept nach dem Need-to-know-Prinzip (Art. 32(1)(b) DSGVO). Bei Social Media: Wer hat Admin-Zugriff auf die Fanpage? Wie oft werden Zugriffsrechte geprueft? Mehrstufige Rollenkonzepte (Admin, Editor, Analyst) empfohlen.", }, { "id": "tom_logging", @@ -179,7 +179,7 @@ DSFA_CHECKLIST = [ r"(?:zugriff|(?:ae|ä)nderung).*(?:protokoll|logging|nachvollzieh)", ], "severity": "LOW", - "hint": "Protokollierung und Nachvollziehbarkeit sind nicht als Massnahme aufgefuehrt. Ergaenzen Sie, wie Zugriffe und Aenderungen an personenbezogenen Daten protokolliert und nachvollziehbar gemacht werden.", + "hint": "Protokollierung dient der Nachweispflicht nach Art. 5(2) DSGVO (Accountability). Dokumentieren Sie: Was wird geloggt (Zugriffe, Aenderungen, Loeschungen), wie lange werden Logs aufbewahrt, wer hat Zugriff auf die Logs. Achtung: Logs selbst sind personenbezogene Daten.", }, # ── L1: Landesbehoerden ─────────────────────────────────────────── @@ -194,7 +194,7 @@ DSFA_CHECKLIST = [ r"(?:aufsichtsbeh(?:oe|ö)rde|beh(?:oe|ö)rde).*(?:richtlinie|empfehlung|vorgabe)", ], "severity": "MEDIUM", - "hint": "Es fehlt ein Verweis auf die Richtlinien der zustaendigen Landesbehoerde (LfDI). Pruefen Sie, ob Ihre Landesdatenschutzbehoerde spezifische Vorgaben oder Empfehlungen fuer diese Verarbeitung veroeffentlicht hat, und beruecksichtigen Sie diese.", + "hint": "Die DSK hat eine Positivliste (Blacklist) nach Art. 35(4) DSGVO veroeffentlicht, die DSFA-pflichtige Verarbeitungen auflistet. Zusaetzlich hat jedes Bundesland eigene LfDI-Empfehlungen — z.B. der LfDI BaWue zu Social-Media-Fanpages. Pruefen und zitieren Sie die fuer Sie zustaendige Behoerde.", }, # ── L1: Einbeziehung DSB ────────────────────────────────────────── @@ -209,7 +209,7 @@ DSFA_CHECKLIST = [ r"(?:rat|empfehlung).*datenschutzbeauftragt", ], "severity": "MEDIUM", - "hint": "Die Einbeziehung des Datenschutzbeauftragten (DSB) ist nicht dokumentiert. Gemaess Art. 35 Abs. 2 DSGVO muss der DSB bei der DSFA konsultiert werden — dokumentieren Sie dessen Beteiligung und Stellungnahme.", + "hint": "Art. 35(2) DSGVO: 'Der Verantwortliche holt bei der Durchfuehrung einer DSFA den Rat des DSB ein.' Die Nichtbeteiligung des DSB ist ein eigener Verstoss (Art. 83(4)(a) DSGVO). Dokumentieren Sie Datum, Form und Ergebnis der Konsultation.", }, { "id": "dsb_opinion_documented", @@ -221,7 +221,7 @@ DSFA_CHECKLIST = [ r"(?:empfehlung|beurteilung|einsch(?:ae|ä)tzung)\s+(?:des|der)\s+(?:dsb|datenschutzbeauftragt)", ], "severity": "LOW", - "hint": "Die Stellungnahme des Datenschutzbeauftragten ist nicht im Dokument enthalten. Fuegen Sie die schriftliche Stellungnahme oder Empfehlung des DSB zur DSFA hinzu.", + "hint": "Die DSB-Stellungnahme sollte enthalten: Bewertung der Risiken, Empfehlung zu Massnahmen, Einschaetzung ob Restrisiko akzeptabel ist. Falls der DSB Bedenken aeussert und die Verarbeitung dennoch erfolgt, ist dies nach Art. 39(1)(c) DSGVO besonders zu dokumentieren.", }, # ── L1: Dokumentation ───────────────────────────────────────────── @@ -238,7 +238,7 @@ DSFA_CHECKLIST = [ r"(?:gering|mittel|hoch).*(?:einzustufen|zu\s+bewerten)", ], "severity": "MEDIUM", - "hint": "Die Ergebnisse der DSFA sind nicht zusammenfassend dokumentiert. Erstellen Sie einen Ergebnisabschnitt, der die Schlussfolgerungen der Folgenabschaetzung und die Gesamtbewertung des Restrisikos festhält.", + "hint": "Dokumentieren Sie das Ergebnis eindeutig: Ist das Restrisiko nach Umsetzung der Massnahmen tragbar? Falls das Restrisiko 'hoch' bleibt, ist vor Beginn der Verarbeitung die Aufsichtsbehoerde nach Art. 36 DSGVO (vorherige Konsultation) zu befragen.", }, { "id": "review_cycle", @@ -250,6 +250,6 @@ DSFA_CHECKLIST = [ r"n(?:ae|ä)chste\s+(?:ueberpr(?:ue|ü)fung|überprüfung|review)", ], "severity": "LOW", - "hint": "Ein Ueberpruefungszyklus fuer die DSFA ist nicht festgelegt. Definieren Sie, in welchem Turnus die DSFA ueberprueft und aktualisiert wird (z.B. jaehrlich oder bei wesentlichen Aenderungen der Verarbeitung).", + "hint": "Art. 35(11) DSGVO: Die DSFA ist regelmaessig zu ueberpruefen. Best Practice: Jaehrliche Review + anlassbezogen bei wesentlichen Aenderungen (neue Plattform, geaenderte AGB der Plattform, neue Rechtsprechung). Legen Sie einen konkreten naechsten Prueftermin fest.", }, ] diff --git a/backend-compliance/compliance/services/doc_checks/impressum_checks.py b/backend-compliance/compliance/services/doc_checks/impressum_checks.py index e073201..cc9c704 100644 --- a/backend-compliance/compliance/services/doc_checks/impressum_checks.py +++ b/backend-compliance/compliance/services/doc_checks/impressum_checks.py @@ -16,7 +16,7 @@ IMPRESSUM_CHECKLIST = [ r"firma", r"unternehmen", ], "severity": "HIGH", - "hint": "Der vollstaendige Name des Unternehmens oder der Person muss im Impressum stehen (z.B. 'Musterfirma GmbH'). Bei Einzelunternehmen genuegt der vollstaendige Vor- und Nachname.", + "hint": "§5(1) Nr.1 TMG: Vollstaendiger Firmenname MIT Rechtsform (z.B. 'Muster GmbH', nicht nur 'Muster'). Bei Einzelunternehmen: Vor- und Nachname plus ggf. Geschaeftsbezeichnung. Haeufiger Abmahngrund: Nur Markenname ohne juristische Person.", }, # ── L1: Anschrift ───────────────────────────────────────────────── @@ -29,7 +29,7 @@ IMPRESSUM_CHECKLIST = [ r"d-\d{5}", r"\d{5}\s+\w+", ], "severity": "HIGH", - "hint": "Eine vollstaendige ladungsfaehige Anschrift (Strasse, Hausnummer, PLZ, Ort) muss im Impressum angegeben werden. Ein Postfach genuegt nicht.", + "hint": "§5(1) Nr.1 TMG verlangt eine ladungsfaehige Anschrift fuer Klagezustellungen. Postfach, c/o-Adresse oder nur Ortsangabe genuegen laut BGH (I ZR 228/03) nicht. Erforderlich: Strasse + Hausnummer + PLZ + Ort.", }, { "id": "address_zip_city", @@ -39,7 +39,7 @@ IMPRESSUM_CHECKLIST = [ r"(?:d[\-\s]?)?\d{5}\s+[a-z\u00c0-\u017e]\w{2,}", ], "severity": "MEDIUM", - "hint": "Die Anschrift muss eine fuenfstellige Postleitzahl und den Ortsnamen enthalten (z.B. '10115 Berlin').", + "hint": "Ohne PLZ und Ort ist die Anschrift nicht ladungsfaehig und damit unvollstaendig i.S.d. §5 TMG. Haeufiger Fehler: Nur Strasse und Hausnummer ohne PLZ/Ort, oder PLZ ohne Ortsangabe.", }, { "id": "address_street_number", @@ -50,7 +50,7 @@ IMPRESSUM_CHECKLIST = [ r"\w+\s+(?:str|stra(?:ss|ß)e|weg|platz|allee)\s*\.?\s*\d+", ], "severity": "MEDIUM", - "hint": "Bitte den Strassennamen und die Hausnummer angeben (z.B. 'Musterstrasse 12'). Ohne Hausnummer ist die Anschrift nicht ladungsfaehig.", + "hint": "Strasse + Hausnummer fehlen oder sind unvollstaendig. Ohne Hausnummer keine Zustellbarkeit — das ist ein klassischer Abmahngrund bei Impressumspruefungen nach §5 TMG. Auch 'Am Markt' ohne Nummer genuegt nicht.", }, # ── L1: Kontaktdaten ────────────────────────────────────────────── @@ -63,7 +63,7 @@ IMPRESSUM_CHECKLIST = [ r"\+?\d[\d\s/\-]{8,}", ], "severity": "HIGH", - "hint": "Das Impressum muss mindestens eine E-Mail-Adresse und eine Telefonnummer enthalten, damit Nutzer schnell Kontakt aufnehmen koennen.", + "hint": "§5(1) Nr.2 TMG verlangt Angaben fuer 'schnelle elektronische Kontaktaufnahme und unmittelbare Kommunikation': E-Mail ist Pflicht. EuGH (C-298/17): Telefon nicht zwingend, aber ein zweiter unmittelbarer Kanal (Telefon, Fax oder Chat) ist erforderlich.", }, { "id": "contact_email_format", @@ -73,7 +73,7 @@ IMPRESSUM_CHECKLIST = [ r"[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,}", ], "severity": "MEDIUM", - "hint": "Die E-Mail-Adresse muss in einem gueltigen Format vorliegen (z.B. 'info@beispiel.de'). Bitte pruefen Sie, ob ein '@'-Zeichen und eine Domain vorhanden sind.", + "hint": "E-Mail-Adresse fehlt oder ist nicht als solche erkennbar. Ein reines Kontaktformular genuegt laut OLG Hamm (4 U 59/20) NICHT als Ersatz — die E-Mail-Adresse muss direkt im Impressum als Text sichtbar sein.", }, { "id": "contact_phone_format", @@ -85,7 +85,7 @@ IMPRESSUM_CHECKLIST = [ r"0\d{2,4}\s*[/\-\s]\s*\d{4,}", ], "severity": "MEDIUM", - "hint": "Bitte eine Telefonnummer mit Vorwahl angeben (z.B. '+49 30 12345678' oder '030 / 12345678'). Ein reines Kontaktformular reicht nicht aus.", + "hint": "Telefonnummer mit Vorwahl angeben (z.B. '+49 30 12345678'). Falls kein Telefon: Ein alternativer unmittelbarer Kommunikationskanal (Chat, Messenger) ist laut EuGH (C-298/17) noetig — Kontaktformular allein genuegt nicht.", }, # ── L1: Handelsregister ─────────────────────────────────────────── @@ -98,7 +98,7 @@ IMPRESSUM_CHECKLIST = [ r"register.*(?:nr|nummer)", ], "severity": "MEDIUM", - "hint": "Falls das Unternehmen im Handelsregister eingetragen ist, muessen Registergericht und Registernummer angegeben werden (z.B. 'Amtsgericht Muenchen, HRB 12345').", + "hint": "§5(1) Nr.4 TMG: Bei Eintragung im Handels-, Vereins-, Partnerschafts- oder Genossenschaftsregister muessen Registergericht UND Registernummer angegeben werden. Haeufiger Fehler: GmbH ohne HR-Angabe — das ist abmahnfaehig.", }, { "id": "register_court", @@ -109,7 +109,7 @@ IMPRESSUM_CHECKLIST = [ r"ag\s+[A-Z\u00c0-\u017e]\w+", ], "severity": "LOW", - "hint": "Bitte das zustaendige Registergericht benennen (z.B. 'Amtsgericht Muenchen'). Die alleinige Angabe der Registernummer ohne Gericht ist unvollstaendig.", + "hint": "Registernummer ohne Registergericht ist unvollstaendig i.S.d. §5(1) Nr.4 TMG. Korrekt: 'Amtsgericht Muenchen, HRB 12345'. Das Gericht am Sitz der Gesellschaft ist zustaendig — pruefen Sie den aktuellen HR-Auszug.", }, { "id": "register_number", @@ -119,7 +119,7 @@ IMPRESSUM_CHECKLIST = [ r"(?:hrb|hra)\s*\d+", ], "severity": "LOW", - "hint": "Die Registernummer muss mit dem Praefix HRB oder HRA und der zugehoerigen Nummer angegeben werden (z.B. 'HRB 12345').", + "hint": "Registernummer im Format 'HRB 12345' (Kapitalgesellschaften) oder 'HRA 12345' (Personengesellschaften) angeben. Haeufiger Fehler: Steuernummer statt Registernummer — die Steuernummer ersetzt nicht die HR-Angabe nach §5(1) Nr.4 TMG.", }, # ── L1: USt-IdNr ────────────────────────────────────────────────── @@ -132,7 +132,7 @@ IMPRESSUM_CHECKLIST = [ r"vat.*id", r"de\s*\d{9}", ], "severity": "MEDIUM", - "hint": "Falls eine Umsatzsteuer-Identifikationsnummer vorhanden ist, muss diese im Impressum angegeben werden. Die Steuernummer allein genuegt nicht als Ersatz.", + "hint": "§5(1) Nr.6 TMG: Die USt-IdNr. muss angegeben werden, sofern vorhanden. Haeufiger Fehler: Steuernummer (z.B. '123/456/78901') statt USt-IdNr. (DE123456789) — die Steuernummer ist KEIN Ersatz und sollte aus Datenschutzgruenden nicht im Impressum stehen.", }, { "id": "vat_de_format", @@ -142,7 +142,7 @@ IMPRESSUM_CHECKLIST = [ r"de\s*\d{9}", ], "severity": "LOW", - "hint": "Die USt-IdNr. muss im Format 'DE' gefolgt von 9 Ziffern angegeben werden (z.B. 'DE123456789'). Bitte pruefen Sie, ob die Nummer vollstaendig ist.", + "hint": "Deutsche USt-IdNr.: Laendercode 'DE' + exakt 9 Ziffern (z.B. DE123456789). Haeufiger Fehler: Nur 8 Ziffern, fehlender Laendercode, oder Verwechslung mit Wirtschafts-ID. Validierung: https://evatr.bff-online.de/", }, # ── L1: Vertretungsberechtigte ──────────────────────────────────── @@ -155,7 +155,7 @@ IMPRESSUM_CHECKLIST = [ r"vorstand", r"inhaber", ], "severity": "MEDIUM", - "hint": "Bei juristischen Personen (GmbH, AG etc.) muss die vertretungsberechtigte Person namentlich genannt werden (z.B. 'Geschaeftsfuehrer: Max Mustermann').", + "hint": "§5(1) Nr.1 TMG: Bei juristischen Personen (GmbH, AG, UG, eG) muss der/die Vertretungsberechtigte(n) namentlich benannt werden. Haeufiger Fehler: Nur 'Geschaeftsfuehrung' ohne Personenname — das genuegt nicht, Vor- und Nachname sind Pflicht.", }, { "id": "representative_person", @@ -166,7 +166,7 @@ IMPRESSUM_CHECKLIST = [ r"(?:vertreten\s+durch|repr(?:ae|ä)sentiert)\s*:?\s*[A-Z\u00c0-\u017e]", ], "severity": "LOW", - "hint": "Bitte den vollstaendigen Vor- und Nachnamen der vertretungsberechtigten Person angeben (z.B. 'Geschaeftsfuehrer: Max Mustermann'). Eine reine Funktionsbezeichnung reicht nicht.", + "hint": "Voller Vor- und Nachname mit Funktionsbezeichnung erforderlich (z.B. 'Geschaeftsfuehrer: Max Mustermann'). Bei mehreren Geschaeftsfuehrern alle nennen. Haeufiger Fehler: Nur Nachname oder nur 'Die Geschaeftsfuehrung' ohne Namen.", }, # ── Neue L1: Redaktionell Verantwortlicher ──────────────────────── @@ -180,7 +180,7 @@ IMPRESSUM_CHECKLIST = [ r"§\s*18\s+m(?:edien)?st(?:aat)?v", ], "severity": "LOW", - "hint": "Wenn die Website journalistisch-redaktionelle Inhalte enthaelt, muss ein inhaltlich Verantwortlicher mit Name und Anschrift benannt werden (§18 MStV, 'V.i.S.d.P.').", + "hint": "§18(2) MStV: Bei journalistisch-redaktionellen Inhalten (Blog, Ratgeber, News) muss ein V.i.S.d.P. mit Name und Anschrift benannt werden. Gilt auch fuer Unternehmensblogs. Haeufiger Fehler: V.i.S.d.P. fehlt bei Seiten mit Ratgeber-/Blogartikeln.", }, # ── Neue L1: Streitbeilegung ────────────────────────────────────── @@ -196,6 +196,6 @@ IMPRESSUM_CHECKLIST = [ r"alternative\s+streitbeilegung", ], "severity": "LOW", - "hint": "Online-Haendler muessen einen Link zur EU-Streitbeilegungsplattform (https://ec.europa.eu/consumers/odr) angeben und erklaeren, ob sie zur Teilnahme an Streitbeilegungsverfahren bereit oder verpflichtet sind.", + "hint": "Art. 14(1) ODR-VO + §36 VSBG: Online-Haendler muessen den ODR-Link (https://ec.europa.eu/consumers/odr) als klickbaren Hyperlink einbinden UND erklaeren, ob sie zur Streitbeilegung bereit/verpflichtet sind. Fehlender Link ist abmahnfaehig (LG Bochum, 14 O 21/16).", }, ] diff --git a/backend-compliance/compliance/services/doc_checks/social_media_checks.py b/backend-compliance/compliance/services/doc_checks/social_media_checks.py index 06f930b..24c7994 100644 --- a/backend-compliance/compliance/services/doc_checks/social_media_checks.py +++ b/backend-compliance/compliance/services/doc_checks/social_media_checks.py @@ -19,7 +19,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:betreiber|netzwerk).*verantwortlich", ], "severity": "HIGH", - "hint": "Es fehlt der Hinweis auf die gemeinsame Verantwortlichkeit nach Art. 26 DSGVO. Benennen Sie ausdruecklich, dass Sie und die jeweilige Plattform gemeinsam Verantwortliche fuer die Datenverarbeitung sind.", + "hint": "Seit dem EuGH-Urteil 'Fanpage' (C-210/16, Juni 2018) sind Fanpage-Betreiber gemeinsam Verantwortliche nach Art. 26 DSGVO. Ohne ausdrueckliche Benennung der gemeinsamen Verantwortlichkeit fehlt die Rechtsgrundlage fuer Ihre gesamte Social-Media-Datenverarbeitung.", }, { "id": "facebook_meta_named", @@ -30,7 +30,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"meta\s+platforms.*(?:verantwortlich|controller|betreiber)", ], "severity": "MEDIUM", - "hint": "Facebook/Meta ist nicht namentlich als gemeinsam Verantwortlicher aufgefuehrt. Nennen Sie die vollstaendige Firmenbezeichnung (z.B. Meta Platforms Ireland Limited) als Mitverantwortlichen.", + "hint": "Korrekte Bezeichnung: 'Meta Platforms Ireland Limited, 4 Grand Canal Square, Dublin 2, Irland'. Achtung: Seit 2022 ist Meta Platforms Ireland Ltd. (nicht Facebook Ireland Ltd.) der europaeische Verantwortliche — veraltete Firmennamen aktualisieren.", }, # ── L1: Vereinbarung Art. 26 ────────────────────────────────────── @@ -45,7 +45,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"addendum|nachtrag|seiten.*insights", ], "severity": "HIGH", - "hint": "Es fehlt ein Verweis auf die Vereinbarung nach Art. 26 DSGVO zwischen Ihnen und der Plattform. Erwaehnen Sie die bestehende Vereinbarung (z.B. Page Controller Addendum bei Facebook) und deren wesentlichen Inhalt.", + "hint": "Art. 26 DSGVO verlangt eine transparente Vereinbarung ueber die Aufgabenverteilung. Bei Facebook ist das 'Page Controller Addendum' abzuschliessen und in der DSE zu verlinken. Ohne diese Vereinbarung besteht ein Bussgeldrisiko nach Art. 83(4)(a) DSGVO.", }, { "id": "insights_referenced", @@ -57,7 +57,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:statistik|nutzungsstatistik).*(?:facebook|meta|fanpage|seite)", ], "severity": "MEDIUM", - "hint": "Die Verarbeitung von Seiten-Insights bzw. Page Insights wird nicht erwaehnt. Erlaeutern Sie, dass bei Nutzung Ihrer Social-Media-Seite Insights-Daten erhoben und verarbeitet werden.", + "hint": "Page Insights umfassen demografische Daten, Reichweite und Interaktionen. Der EuGH (C-210/16) hat klargestellt, dass der Fanpage-Betreiber fuer die Insights-Verarbeitung mitverantwortlich ist — auch wenn er keinen Zugriff auf Rohdaten hat.", }, { "id": "page_controller_addendum", @@ -69,7 +69,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:addendum|nachtrag|erg(?:ae|ä)nzung).*(?:controller|verantwortlich)", ], "severity": "LOW", - "hint": "Das Page Controller Addendum (bzw. die Seiten-Insights-Ergaenzung) wird nicht namentlich erwaehnt. Verweisen Sie konkret auf das Addendum und verlinken Sie es, damit Betroffene die Vereinbarung nachvollziehen koennen.", + "hint": "Verlinken Sie das Page Controller Addendum direkt: https://www.facebook.com/legal/controller_addendum. Art. 26(2) S. 2 DSGVO verlangt, dass das Wesentliche der Vereinbarung dem Betroffenen zur Verfuegung gestellt wird.", }, # ── L1: Anlaufstelle ────────────────────────────────────────────── @@ -85,7 +85,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"wenden\s+sie\s+sich", ], "severity": "MEDIUM", - "hint": "Es fehlt eine Anlaufstelle fuer Betroffene gemaess Art. 26(1) S.3 DSGVO. Geben Sie an, an wen sich Betroffene zur Wahrnehmung ihrer Rechte wenden koennen.", + "hint": "Art. 26(1) S. 3 DSGVO: Betroffene koennen ihre Rechte bei jedem der Verantwortlichen geltend machen. Benennen Sie sich als primaere Anlaufstelle mit konkreten Kontaktdaten (E-Mail, Anschrift) — die Plattform ist oft schwer erreichbar.", }, { "id": "contact_both_parties", @@ -97,7 +97,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:facebook|meta|google|plattform).*(?:als\s+auch|oder|und).*(?:uns|bei\s+uns)", ], "severity": "LOW", - "hint": "Die Kontaktdaten beider Verantwortlicher sind nicht vollstaendig angegeben. Stellen Sie klar, dass Betroffene ihre Rechte sowohl bei Ihnen als auch bei der Plattform geltend machen koennen, und nennen Sie die jeweiligen Kontaktwege.", + "hint": "EuGH C-210/16 Rn. 43: Beide Verantwortliche muessen erreichbar sein. Nennen Sie Ihre eigenen Kontaktdaten UND verlinken Sie den Datenschutzkontakt der Plattform (z.B. Meta: https://www.facebook.com/help/contact/540977946302970).", }, # ── L1: Verarbeitungsaufteilung ─────────────────────────────────── @@ -112,7 +112,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:nutzungsstatistik|statistik|insight).*(?:betreiber|netzwerk)", ], "severity": "HIGH", - "hint": "Es fehlt eine Beschreibung, welche Datenverarbeitungen Sie und welche die Plattform vornimmt. Erlaeutern Sie die Aufgabenverteilung (z.B. wer Insights-Daten erhebt und wer sie auswertet).", + "hint": "Art. 26(1) DSGVO verlangt eine transparente Aufgabenteilung. Typisch: Die Plattform erhebt und aggregiert Nutzerdaten; Sie als Betreiber nutzen die Insights-Statistiken. Stellen Sie klar, dass Sie keinen Zugriff auf Einzelnutzer-Rohdaten haben (falls zutreffend).", }, # ── L1: Datenkategorien ─────────────────────────────────────────── @@ -127,7 +127,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:nutzername|beitr(?:ae|ä)g|profil|like|kommentar)", ], "severity": "HIGH", - "hint": "Die Kategorien der verarbeiteten Daten sind nicht aufgefuehrt. Listen Sie auf, welche Daten verarbeitet werden (z.B. IP-Adresse, Standort, Geraetedaten, Interaktionen, demografische Daten).", + "hint": "Art. 13(1)(d) DSGVO: Datenkategorien muessen benannt werden. Bei Social Media typisch: Profildaten, IP-Adresse, Geraete-/Browserdaten, Interaktionsdaten (Likes, Kommentare), demografische Daten (Alter, Geschlecht, Standort) aus Insights.", }, # ── L1: Plattformen ─────────────────────────────────────────────── @@ -141,7 +141,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"social\s*media.*(?:angebot|pr(?:ae|ä)senz|auftritte)", ], "severity": "MEDIUM", - "hint": "Die genutzten Social-Media-Plattformen werden nicht aufgelistet. Fuehren Sie alle Plattformen namentlich auf, auf denen Sie Praesenzen betreiben (z.B. Facebook, Instagram, LinkedIn, YouTube).", + "hint": "Jede Plattform hat eigene Datenschutz-Konditionen und Joint-Controller-Vereinbarungen. Listen Sie alle Plattformen einzeln auf — eine gemeinsame Pauschalerklaerung fuer 'Social Media' genuegt nicht den Transparenzanforderungen nach Art. 13 DSGVO.", }, { "id": "platform_dse_links", @@ -153,7 +153,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:privacy\s+policy|datenschutzerkl(?:ae|ä)rung).*(?:finden\s+sie|abrufbar|unter)", ], "severity": "LOW", - "hint": "Es fehlen Links zu den Datenschutzerklaerungen der einzelnen Plattformen. Verlinken Sie die jeweilige Privacy Policy (z.B. von Meta, Google, LinkedIn), damit Nutzer sich dort informieren koennen.", + "hint": "Verlinken Sie pro Plattform direkt die Privacy Policy: Meta (https://www.facebook.com/privacy/policy), Google/YouTube (https://policies.google.com/privacy), LinkedIn (https://www.linkedin.com/legal/privacy-policy). Pruefen Sie Links regelmaessig auf Aktualitaet.", }, # ── L1: Drittlandtransfer ───────────────────────────────────────── @@ -168,7 +168,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:(?:ue|ü)bermittlung|(?:ueber|über)mittlung).*(?:usa|drittland|au(?:ss|ß)erhalb)", ], "severity": "MEDIUM", - "hint": "Es fehlt ein Hinweis auf den Drittlandtransfer in die USA. Informieren Sie darueber, dass Daten in die USA uebermittelt werden, und nennen Sie die Rechtsgrundlage dafuer (z.B. Angemessenheitsbeschluss, Standardvertragsklauseln).", + "hint": "Bei Social Media werden Daten regelhaft in die USA uebermittelt. Hinweis: Das Privacy Shield ist seit 'Schrems II' (EuGH C-311/18, Juli 2020) ungueltig. Aktuell: EU-US Data Privacy Framework/DPF (Angemessenheitsbeschluss seit Juli 2023) oder SCC (Art. 46(2)(c) DSGVO).", }, { "id": "usa_transfer_scc", @@ -179,7 +179,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"standard\s+contractual\s+clause", ], "severity": "MEDIUM", - "hint": "Standardvertragsklauseln (SCC) als Garantie fuer den US-Datentransfer werden nicht erwaehnt. Falls SCC als Rechtsgrundlage genutzt werden, fuehren Sie diese ausdruecklich auf.", + "hint": "SCC allein genuegen nach 'Schrems II' (C-311/18) nicht — es muss zusaetzlich ein Transfer Impact Assessment (TIA) durchgefuehrt werden. Pruefen Sie, ob die Plattform ergaenzende Schutzmassnahmen (z.B. Verschluesselung, Pseudonymisierung) dokumentiert.", }, { "id": "usa_transfer_dpf", @@ -191,7 +191,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"adequacy\s+decision", ], "severity": "LOW", - "hint": "Das EU-US Data Privacy Framework (DPF) wird nicht als Transfergrundlage erwaehnt. Falls sich die Plattform auf den Angemessenheitsbeschluss stuetzt, erwaehnen Sie dies und verweisen Sie auf die DPF-Zertifizierung.", + "hint": "Meta, Google und LinkedIn sind unter dem DPF zertifiziert (pruefbar unter https://www.dataprivacyframework.gov). Erwaehnen Sie den Angemessenheitsbeschluss der EU-Kommission vom 10.07.2023 und pruefen Sie die Zertifizierung der jeweiligen Plattform.", }, # ── L1: Rechtsgrundlage ─────────────────────────────────────────── @@ -205,7 +205,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"einwilligung.*art\.\s*6", r"lit\.\s*[a-f]", ], "severity": "MEDIUM", - "hint": "Die Rechtsgrundlage fuer die Datenverarbeitung nach Art. 6 DSGVO fehlt. Nennen Sie die einschlaegige Rechtsgrundlage (z.B. berechtigtes Interesse nach Art. 6(1) lit. f oder Einwilligung nach Art. 6(1) lit. a).", + "hint": "Fuer Fanpage-Insights stuetzen sich die meisten Betreiber auf Art. 6(1) lit. f DSGVO (berechtigtes Interesse an Reichweitenanalyse). Achtung: Die DSK hat 2018 die Rechtsgrundlage fuer Fanpages in Frage gestellt — dokumentieren Sie Ihre Interessenabwaegung sorgfaeltig.", }, { "id": "legal_basis_specific_lit", @@ -215,7 +215,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"art\.\s*6\s*(?:abs\.\s*)?1\s*(?:s\.\s*1\s*)?(?:lit\.\s*)?[a-f]", ], "severity": "LOW", - "hint": "Der konkrete Buchstabe in Art. 6(1) DSGVO ist nicht angegeben. Nennen Sie den spezifischen Erlaubnistatbestand (z.B. lit. a fuer Einwilligung oder lit. f fuer berechtigtes Interesse).", + "hint": "Praxistipp: Nennen Sie pro Verarbeitungszweck den passenden Buchstaben. Typisch bei Social Media: Art. 6(1) lit. a (Einwilligung bei Direktnachrichten), lit. b (Vertrag bei Gewinnspielen), lit. f (berechtigtes Interesse bei Insights/PR).", }, # ── L1: Betroffenenrechte ───────────────────────────────────────── @@ -230,7 +230,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"widerspruchsrecht", ], "severity": "MEDIUM", - "hint": "Die Betroffenenrechte nach Art. 15-21 DSGVO sind nicht aufgefuehrt. Listen Sie die Rechte auf (Auskunft, Berichtigung, Loeschung, Einschraenkung, Datenuebertragbarkeit, Widerspruch) und erklaeren Sie, wie Betroffene diese ausueben koennen.", + "hint": "Besonders relevant bei Social Media: Widerspruchsrecht (Art. 21 DSGVO) gegen Insights-Tracking und Recht auf Loeschung (Art. 17 DSGVO). Weisen Sie darauf hin, dass Rechte gegenueber beiden Verantwortlichen geltend gemacht werden koennen (Art. 26(3) DSGVO).", }, { "id": "opt_out_social", @@ -242,7 +242,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:abmelden|abschalten).*(?:tracking|statistik|insight)", ], "severity": "LOW", - "hint": "Eine konkrete Opt-Out-Moeglichkeit fuer das Social-Media-Tracking fehlt. Beschreiben Sie, wie Nutzer dem Tracking widersprechen oder es deaktivieren koennen (z.B. ueber Plattform-Einstellungen oder Cookie-Opt-Out).", + "hint": "Verlinken Sie konkrete Opt-Out-Seiten: Facebook Ad-Settings (https://www.facebook.com/ads/preferences), Google Ads-Einstellungen (https://adssettings.google.com). Weisen Sie auch auf die allgemeine Widerspruchsmoeglichkeit via YourOnlineChoices.eu hin.", }, # ── L1: Social Bookmarks vs Plugins ─────────────────────────────── @@ -256,7 +256,7 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:link|verweis|weiterleitung).*(?:dienst|anbieter|netzwerk)", ], "severity": "MEDIUM", - "hint": "Es fehlt ein Hinweis, ob Social-Media-Plugins oder nur einfache Links (Bookmarks) eingebunden sind. Stellen Sie klar, ob beim Seitenaufruf bereits Daten an die Plattformen uebertragen werden oder erst nach Klick.", + "hint": "Social-Media-Plugins (Like-Button, Share-Widget) uebertragen beim Seitenaufruf Nutzerdaten an die Plattform — ohne Einwilligung ein DSGVO-Verstoss (EuGH C-40/17, 'Fashion ID'). Empfehlung: Shariff-Buttons oder reine Bild-Links (Social Bookmarks) verwenden.", }, { "id": "two_click_solution", @@ -271,6 +271,6 @@ JOINT_CONTROLLER_CHECKLIST = [ r"(?:link|verweis|grafik).*(?:weitergeleitet|weiterleitung)", ], "severity": "LOW", - "hint": "Erlaeutern Sie die eingesetzte datenschutzfreundliche Technik: z.B. Social Bookmarks (reine Links ohne automatische Datenuebertragung), 2-Klick-Loesung oder Shariff-Buttons.", + "hint": "Datenschutzfreundliche Alternativen: Shariff (Heise, Open Source), 2-Klick-Loesung oder reine Bild-Links/Social Bookmarks. Dokumentieren Sie die eingesetzte Technik — nach EuGH 'Fashion ID' (C-40/17) muss der Website-Betreiber eine Einwilligung einholen, wenn Plugins direkt laden.", }, ] diff --git a/backend-compliance/compliance/services/doc_checks/widerruf_checks.py b/backend-compliance/compliance/services/doc_checks/widerruf_checks.py index d220693..3e2c0e1 100644 --- a/backend-compliance/compliance/services/doc_checks/widerruf_checks.py +++ b/backend-compliance/compliance/services/doc_checks/widerruf_checks.py @@ -17,7 +17,7 @@ WIDERRUF_CHECKLIST = [ r"recht\s+(?:zum|auf)\s+widerruf", ], "severity": "HIGH", - "hint": "Die Widerrufsbelehrung muss ausdruecklich ueber das Bestehen eines Widerrufsrechts informieren. Ergaenzen Sie einen Abschnitt, der den Verbraucher klar auf sein Widerrufsrecht hinweist.", + "hint": "Gemaess Art. 246a §1 Abs. 2 Nr. 1 EGBGB muss ueber das Bestehen des Widerrufsrechts informiert werden. Verwenden Sie die gesetzliche Musterbelehrung (Anlage 1 zu Art. 246a EGBGB) — eigene Formulierungen sind fehleranfaellig und abmahngefaehrdet.", }, # ── L1: Widerrufsfrist ──────────────────────────────────────────── @@ -30,7 +30,7 @@ WIDERRUF_CHECKLIST = [ r"14\s+days", r"fourteen\s+days", ], "severity": "HIGH", - "hint": "Die gesetzliche Widerrufsfrist von 14 Tagen muss explizit genannt werden. Fuegen Sie die Angabe '14 Tage' oder 'vierzehn Tage' in Ihre Widerrufsbelehrung ein.", + "hint": "§355 Abs. 2 BGB: Die Widerrufsfrist betraegt 14 Tage. Haeufiger Fehler: Wird die Belehrung fehlerhaft erteilt, verlaengert sich die Frist auf 12 Monate und 14 Tage (§356 Abs. 3 S. 2 BGB). Exakte Formulierung ist daher geschaeftskritisch.", }, { "id": "deadline_calendar_days", @@ -41,7 +41,7 @@ WIDERRUF_CHECKLIST = [ r"14\s+calendar\s+days", ], "severity": "LOW", - "hint": "Zur Klarstellung sollte 'Kalendertage' statt nur 'Tage' angegeben werden. Aendern Sie die Formulierung zu '14 Kalendertage', um Missverstaendnisse auszuschliessen.", + "hint": "Die gesetzliche Musterbelehrung (Anlage 1 zu Art. 246a EGBGB) spricht von 'vierzehn Tagen'. Kalendertage statt Werktage — die Klarstellung vermeidet Abmahnungen. BGH-Rechtsprechung: Unklare Fristangaben gelten als fehlerhafte Belehrung.", }, { "id": "deadline_receipt_trigger", @@ -53,7 +53,7 @@ WIDERRUF_CHECKLIST = [ r"beginnt\s+(?:mit|ab)\s+(?:dem\s+)?(?:zugang|erhalt)", ], "severity": "MEDIUM", - "hint": "Der Fristbeginn muss klar definiert sein (z.B. ab Erhalt der Ware oder ab Vertragsschluss). Ergaenzen Sie eine Angabe wie 'Die Frist beginnt ab dem Tag des Erhalts der Ware'.", + "hint": "§356 Abs. 2 BGB unterscheidet den Fristbeginn nach Vertragstyp: Bei Waren ab Erhalt (Nr. 1a), bei Dienstleistungen ab Vertragsschluss (Nr. 2). Haeufiger Fehler: Pauschal 'ab Vertragsschluss' auch fuer Warenlieferungen — das ist falsch.", }, # ── L1: Form des Widerrufs ──────────────────────────────────────── @@ -66,7 +66,7 @@ WIDERRUF_CHECKLIST = [ r"withdrawal\s+form", r"formular", ], "severity": "MEDIUM", - "hint": "Die Widerrufsbelehrung muss ueber die Form des Widerrufs informieren und auf das Muster-Widerrufsformular hinweisen. Fuegen Sie einen entsprechenden Abschnitt mit Verweis auf das Formular hinzu.", + "hint": "Art. 246a §1 Abs. 2 Nr. 1 EGBGB verlangt einen Hinweis auf das Muster-Widerrufsformular (Anlage 2 zu Art. 246a EGBGB). Das Formular muss dem Verbraucher zur Verfuegung gestellt werden — ein blosser Verweis auf §355 BGB genuegt nicht.", }, { "id": "form_text_required", @@ -77,7 +77,7 @@ WIDERRUF_CHECKLIST = [ r"(?:mittels|durch)\s+(?:einer?\s+)?(?:eindeutige|klare)\w*\s+erkl(?:ae|ä)rung", ], "severity": "LOW", - "hint": "Es sollte klargestellt werden, dass der Widerruf in Textform (z.B. per Brief, E-Mail oder Fax) erfolgen kann. Nennen Sie die zulaessigen Kommunikationswege ausdruecklich.", + "hint": "§355 Abs. 1 S. 3 BGB: Der Widerruf erfolgt durch 'eindeutige Erklaerung'. Textform (§126b BGB) genuegt — Brief, E-Mail oder Fax. Achtung: Telefonischer Widerruf ist ebenfalls wirksam; Sie duerfen den Widerruf nicht auf Schriftform beschraenken.", }, { "id": "model_form", @@ -89,7 +89,7 @@ WIDERRUF_CHECKLIST = [ r"widerruf.*(?:beigef(?:ue|ü)gt|anlage|anhang|formular)", ], "severity": "LOW", - "hint": "Das gesetzliche Muster-Widerrufsformular muss beigefuegt oder verlinkt sein. Fuegen Sie das Formular als Anlage bei oder verlinken Sie es direkt in der Belehrung.", + "hint": "Das Muster-Widerrufsformular (Anlage 2 zu Art. 246a EGBGB) ist gesetzlich vorgeschrieben und darf inhaltlich nicht veraendert werden. Haeufiger Fehler: Eigenes Formular statt Gesetzesmuster — das macht die Belehrung angreifbar (vgl. BGH, Az. I ZR 7/16).", }, # ── L1: Folgen des Widerrufs ────────────────────────────────────── @@ -103,7 +103,7 @@ WIDERRUF_CHECKLIST = [ r"r(?:ue|ü)ckerstattung", ], "severity": "MEDIUM", - "hint": "Die Folgen des Widerrufs (insbesondere die Rueckerstattungspflicht) muessen erlaeutert werden. Ergaenzen Sie einen Abschnitt 'Folgen des Widerrufs' mit Angaben zur Rueckabwicklung.", + "hint": "Art. 246a §1 Abs. 2 Nr. 2 EGBGB verlangt Informationen ueber die Folgen des Widerrufs. Pflichtinhalte: Rueckerstattungspflicht (§357 Abs. 1 BGB), Ruecksendepflicht (§357 Abs. 1 BGB) und Wertersatz-Regelung (§357a BGB).", }, { "id": "refund_timeline", @@ -115,7 +115,7 @@ WIDERRUF_CHECKLIST = [ r"(?:unverz(?:ue|ü)glich|sp(?:ae|ä)testens).*(?:r(?:ue|ü)ck|erstatt)", ], "severity": "MEDIUM", - "hint": "Die Rueckerstattung muss innerhalb von 14 Tagen nach Eingang des Widerrufs erfolgen. Geben Sie an, dass die Rueckzahlung spaetestens 14 Tage nach Zugang des Widerrufs erfolgt.", + "hint": "§357 Abs. 1 BGB: Rueckzahlung binnen 14 Tagen nach Zugang des Widerrufs. Achtung: Bei Warenlieferung darf die Rueckzahlung bis zum Erhalt der Ruecksendung zurueckgehalten werden (§357 Abs. 4 BGB) — dieses Zurueckbehaltungsrecht muss erwaehnt werden.", }, { "id": "return_costs", @@ -127,7 +127,7 @@ WIDERRUF_CHECKLIST = [ r"(?:tragen|uebernehmen|übernehmen)\s+(?:die\s+)?(?:kosten|r(?:ue|ü)cksende)", ], "severity": "LOW", - "hint": "Es muss angegeben werden, wer die Kosten der Ruecksendung traegt. Stellen Sie klar, ob der Verbraucher oder der Unternehmer die Ruecksendekosten uebernimmt.", + "hint": "§357 Abs. 5 BGB: Ruecksendekosten traegt der Verbraucher, wenn der Unternehmer dies vorab mitgeteilt hat. Fehlt diese Info in der Belehrung, traegt der Unternehmer die Kosten. Bei >40kg-Waren: Kostenvoranschlag fuer Ruecksendung angeben (§357 Abs. 5 S. 2 BGB).", }, # ── L1: Empfaenger des Widerrufs ────────────────────────────────── @@ -141,7 +141,7 @@ WIDERRUF_CHECKLIST = [ r"widerruf.*(?:per|via|an)", ], "severity": "MEDIUM", - "hint": "Name und Anschrift des Widerrufsempfaengers muessen angegeben werden. Fuegen Sie den vollstaendigen Firmennamen und die Postanschrift hinzu, an die der Widerruf zu richten ist.", + "hint": "Art. 246a §1 Abs. 2 Nr. 1 EGBGB verlangt Name, Anschrift und ggf. Telefonnummer/E-Mail des Widerrufsempfaengers. Fehlt die Adresse, ist die Belehrung fehlerhaft und die Widerrufsfrist beginnt nicht zu laufen (§356 Abs. 3 BGB).", }, { "id": "recipient_full_address", @@ -152,7 +152,7 @@ WIDERRUF_CHECKLIST = [ r"(?:d[\-\s]?)?\d{5}\s+[a-z\u00c0-\u017e]\w+.*widerruf", ], "severity": "LOW", - "hint": "Die vollstaendige Postanschrift mit Postleitzahl und Ort fehlt beim Widerrufsempfaenger. Ergaenzen Sie Strasse, PLZ und Ort des Unternehmens in der Widerrufsbelehrung.", + "hint": "Die gesetzliche Musterbelehrung verlangt: '[Name des Unternehmers], [Anschrift], [ggf. Telefon/Fax/E-Mail]'. Haeufiger Fehler: Nur E-Mail-Adresse ohne Postanschrift — der Verbraucher muss auch postalisch widerrufen koennen.", }, # ── L1: Hinweis kein Grund erforderlich ─────────────────────────── @@ -165,7 +165,7 @@ WIDERRUF_CHECKLIST = [ r"(?:kein|keine).*(?:begr(?:ue|ü)ndung|grund).*(?:erforderlich|n(?:oe|ö)tig)", ], "severity": "LOW", - "hint": "Der Verbraucher muss darauf hingewiesen werden, dass er keinen Grund fuer den Widerruf angeben muss. Ergaenzen Sie den Satz 'Der Widerruf muss nicht begruendet werden'.", + "hint": "Die gesetzliche Musterbelehrung (Anlage 1 zu Art. 246a EGBGB) enthaelt: 'Sie muessen uns [...] mittels einer eindeutigen Erklaerung [...] informieren' — ohne Begruendungspflicht. Manche Shops verlangen faelschlich einen Grund; das ist unzulaessig.", }, # ── L1: Online-Kuendigungsbutton ────────────────────────────────── @@ -179,7 +179,7 @@ WIDERRUF_CHECKLIST = [ r"k(?:ue|ü)ndigung.*(?:button|link|formular|online)", ], "severity": "MEDIUM", - "hint": "Seit Juli 2022 ist ein Online-Kuendigungsbutton fuer Dauerschuldverhaeltnisse Pflicht (§312k BGB). Stellen Sie auf Ihrer Website einen gut sichtbaren Kuendigungsbutton bereit.", + "hint": "§312k BGB (seit 01.07.2022): Pflicht zum Kuendigungsbutton fuer Dauerschuldverhaeltnisse (Abos, Mitgliedschaften). Der Button muss 'Vertraege hier kuendigen' heissen, direkt auf eine Bestaetigungsseite fuehren und ohne Login erreichbar sein.", }, # ── Neue L1: Ausnahme digitale Inhalte ──────────────────────────── @@ -194,6 +194,6 @@ WIDERRUF_CHECKLIST = [ r"(?:ausnahme|ausschluss).*widerruf.*digital", ], "severity": "LOW", - "hint": "Falls Sie digitale Inhalte verkaufen, muss auf den moeglichen Verlust des Widerrufsrechts nach §356 BGB hingewiesen werden. Ergaenzen Sie eine Belehrung ueber die Ausnahme fuer digitale Inhalte.", + "hint": "§356 Abs. 5 BGB: Bei digitalen Inhalten erlischt das Widerrufsrecht, wenn der Verbraucher ausdruecklich zustimmt und bestaetigt, dass er vom Erloeschen weiss. Pflicht: Checkbox + Bestaetigungsmail. Fehlt die Belehrung, bleibt das Widerrufsrecht 14 Tage bestehen.", }, ]