docs: Add EUIPO registration as compliance agent reference test case
Real-world case from EU authority (EUIPO) with 7 findings: - Grammatically broken consent text (bad DE translation) - Coupling prohibition violation (login = consent, Art. 7(4) DSGVO) - No reject button, no granularity, no active opt-in - Broken link layout (DSE/ToS links appear after submit button) - Includes correction suggestion and planned agent check implementations - Pattern: WSO2 Identity Server default templates (systemic issue) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
# Compliance Agent — Reference Test Cases
|
||||
|
||||
Reale Befunde von echten Websites. Jeder Case dokumentiert:
|
||||
- Was gefunden wurde
|
||||
- Welche Rechtsgrundlage verletzt ist
|
||||
- Was der Agent erkennen sollte
|
||||
- Wie die Korrektur aussehen muss
|
||||
|
||||
## Cases
|
||||
|
||||
| Case | Website | Typ | Schwere |
|
||||
|------|---------|-----|---------|
|
||||
| [EUIPO Registration](euipo-registration-consent.md) | login.euipo.europa.eu | Consent-Text + Koppelungsverbot | HIGH |
|
||||
@@ -0,0 +1,127 @@
|
||||
# Test Case: EUIPO Registration — Consent-Formulierung
|
||||
|
||||
**Quelle:** EU-Behoerde (Amt der Europaeischen Union fuer geistiges Eigentum)
|
||||
**URL:** https://login.euipo.europa.eu (Registrierungsseite)
|
||||
**Entdeckt:** 2026-05-04
|
||||
**Typ:** Consent-Text-Fehler + Koppelungsverbot
|
||||
**Schwere:** HIGH
|
||||
|
||||
---
|
||||
|
||||
## Befund
|
||||
|
||||
Auf der Registrierungsseite des EUIPO steht (vollstaendiger Text):
|
||||
|
||||
> "Wenn Sie auf Anmelden klicken, stimmen Sie unseren zu
|
||||
> Nutzungsbedingungen und Datenschutz-Bestimmungen gelesen und verstanden
|
||||
> Registrieren
|
||||
> Haben Sie bereits ein Konto? Anmelden
|
||||
> Datenschutz-Bestimmungen gelesen und verstanden
|
||||
> Nutzungsbedingungen
|
||||
> Deutsch"
|
||||
|
||||
Der Text "Datenschutz-Bestimmungen gelesen und verstanden" und
|
||||
"Nutzungsbedingungen" erscheinen als separate Links unterhalb des
|
||||
Registrieren-Buttons — vermutlich soll der obere Satz darauf verweisen,
|
||||
aber die Verknuepfung ist kaputt (Links nach dem Button statt inline).
|
||||
|
||||
### Fehler
|
||||
|
||||
| # | Typ | Beschreibung | Rechtsgrundlage |
|
||||
|---|-----|-------------|-----------------|
|
||||
| 1 | Sprachfehler | Satz grammatisch unvollstaendig ("stimmen Sie unseren zu" ergibt keinen Sinn) | Art. 12(1) DSGVO (klare und verstaendliche Sprache) |
|
||||
| 2 | Zwangs-Consent | Login = automatische Zustimmung, kein separater Opt-in | Art. 7(4) DSGVO (Koppelungsverbot) |
|
||||
| 3 | Keine Ablehnung | Kein Button um NICHT zuzustimmen (nur Login oder Seite verlassen) | Art. 7(3) DSGVO (Widerruf so einfach wie Erteilung) |
|
||||
| 4 | Keine Granularitaet | Nutzungsbedingungen und Datenschutz werden in einer Zustimmung zusammengefasst | EDPB Guidelines 05/2020 Rn. 43 (Granularitaet) |
|
||||
| 5 | Kein aktiver Consent | Kein Checkbox oder aktive Handlung — blosse Nutzung gilt als Zustimmung | EuGH C-673/17 Planet49 (aktive Einwilligung) |
|
||||
| 6 | Kaputtes Link-Layout | Links zu DSE und Nutzungsbedingungen erscheinen NACH dem Registrieren-Button statt inline im Consent-Text — der Satz oben verweist ins Leere | Art. 12(1) DSGVO (leicht zugaenglich) |
|
||||
| 7 | Uebersetzungsfehler | Offensichtlich maschinell aus EN uebersetzt ("stimmen Sie unseren zu" ist kein korrektes Deutsch) — widerspricht Anforderung an Muttersprache des Nutzers | Art. 12(1) DSGVO (klare und einfache Sprache) |
|
||||
|
||||
---
|
||||
|
||||
## Erwartete Agent-Erkennung
|
||||
|
||||
Der Compliance Agent sollte folgende Checks ausfuehren:
|
||||
|
||||
### 1. Consent-Text-Analyse (consent_scanner.py)
|
||||
- `banner_text_violations`: Grammatisch fehlerhafte Consent-Formulierung erkennen
|
||||
- Severity: HIGH
|
||||
- Finding: "Consent-Text ist grammatisch unvollstaendig und nicht verstaendlich (Art. 12(1) DSGVO)"
|
||||
|
||||
### 2. Koppelungs-Check (authenticated_scanner.py)
|
||||
- Login-Button darf nicht gleichzeitig Consent erteilen
|
||||
- Finding: "Einwilligung wird an Registrierung/Login gekoppelt (Art. 7(4) DSGVO)"
|
||||
|
||||
### 3. Ablehn-Button-Check (consent_scanner.py)
|
||||
- `reject_button_check`: Kein gleichwertiger Ablehn-Button vorhanden
|
||||
- Finding: "Keine Moeglichkeit die Einwilligung abzulehnen"
|
||||
|
||||
### 4. Granularitaets-Check (NEU — zu implementieren)
|
||||
- Nutzungsbedingungen ≠ Datenschutz-Einwilligung
|
||||
- Muessen separat zustimmbar sein
|
||||
- Finding: "Nutzungsbedingungen und Datenschutz in einer Zustimmung zusammengefasst"
|
||||
|
||||
---
|
||||
|
||||
## Korrekturvorschlag
|
||||
|
||||
### Korrekte Formulierung
|
||||
|
||||
```
|
||||
☐ Ich habe die Nutzungsbedingungen gelesen und stimme ihnen zu. (Pflichtfeld)
|
||||
|
||||
☐ Ich habe die Datenschutzerklaerung gelesen und erklaere mich mit der
|
||||
Verarbeitung meiner personenbezogenen Daten gemaess Art. 6(1)(a) DSGVO
|
||||
einverstanden. (Freiwillig — Registrierung auch ohne moeglich)
|
||||
|
||||
[Registrieren] [Abbrechen]
|
||||
```
|
||||
|
||||
### Warum korrekt:
|
||||
- Zwei separate Checkboxen (Granularitaet)
|
||||
- Aktive Handlung noetig (Checkbox ankreuzen, nicht nur Button klicken)
|
||||
- Datenschutz-Consent ist freiwillig (Koppelungsverbot)
|
||||
- Klare Sprache, vollstaendige Saetze
|
||||
- Abbrechen-Button als Alternativhandlung
|
||||
|
||||
---
|
||||
|
||||
## Technische Implementierung als Agent-Check
|
||||
|
||||
### Neuer Check: `consent_text_quality`
|
||||
|
||||
```python
|
||||
# In consent_scanner.py oder neuer Check
|
||||
CONSENT_TEXT_PATTERNS = [
|
||||
# Zwangs-Consent bei Login/Registrierung
|
||||
r"(?:klicken|anmelden|registrieren).*stimmen\s+(?:Sie|sie|du).*zu",
|
||||
r"(?:login|sign.?up|register).*(?:agree|accept|consent)",
|
||||
# Grammatisch unvollstaendige Saetze
|
||||
r"stimmen\s+(?:Sie|sie|du)\s+unseren?\s+zu",
|
||||
# Fehlende Granularitaet
|
||||
r"(?:nutzungsbedingungen|terms).*(?:und|and).*(?:datenschutz|privacy).*(?:zu|agree|accept)",
|
||||
]
|
||||
|
||||
MISSING_ELEMENTS = [
|
||||
"checkbox", # Aktive Zustimmung (nicht nur Button)
|
||||
"button.*ablehnen", # Ablehn-Option
|
||||
"button.*cancel", # Abbrechen-Option
|
||||
]
|
||||
```
|
||||
|
||||
### Neuer Check: `coupling_prohibition`
|
||||
|
||||
Prueft ob Einwilligung an Registrierung/Login/Kauf gekoppelt ist:
|
||||
- Login-Button text enthalt "zustimmen/agree/accept" → Koppelungsverbot
|
||||
- Kein separater Consent-Checkbox vor Login-Button → Koppelungsverbot
|
||||
- Einwilligung als Pflichtfeld bei Registrierung → Koppelungsverbot (wenn Service auch ohne nutzbar)
|
||||
|
||||
---
|
||||
|
||||
## Relevanz
|
||||
|
||||
Dieser Case ist besonders relevant weil:
|
||||
1. **EU-Behoerde** — wenn selbst das EUIPO es falsch macht, wie sollen KMUs es richtig machen?
|
||||
2. **OIDC-Registrierung** — sehr haeufiges Pattern bei SaaS-Produkten
|
||||
3. **Mehrsprachig** — der deutsche Text ist offensichtlich schlecht uebersetzt
|
||||
4. **Systemisch** — WSO2 Identity Server Templates enthalten dieses Pattern standardmaessig
|
||||
Reference in New Issue
Block a user