Analysezeitpunkt: 2026-08-13 11:05:34
Gesamtbewertung
⚠ Diese Website weist schwerwiegende DSGVO-Mängel auf. Es besteht dringender Handlungsbedarf.
DSGVO-Probleme erkannt (2):
❌ 2 Drittanbieter-Server außerhalb der EU/des EWR — Datenübermittlung ohne Rechtsgrundlage kann gegen Art. 44–49 DSGVO verstoßen.
Betroffene Server außerhalb der EU:
❌ 1 Tracking-Dienst(e) erkannt — ohne vorherige Einwilligung (Opt-in) ein Verstoß gegen Art. 6 Abs. 1 DSGVO und § 25 TDDDG.
Erkannte Tracker:
Hinweis: Diese automatisierte Analyse ersetzt keine rechtliche Beratung. Für eine vollständige DSGVO-Bewertung konsultieren Sie einen Datenschutzbeauftragten.
↓ Detaillierte Ergebnisse zu allen Kategorien finden Sie weiter unten.
Die Website nutzt eine verschlüsselte Verbindung (HTTPS).
Neueste Verschlüsselung aktiv (TLS 1.3 — TLSv1.3).
Das Sicherheitszertifikat ist gültig (läuft ab am 2026-10-06).
Starke Verschlüsselungsmethode (TLS_AES_256_GCM_SHA384, 256 Bit).
HSTS ist aktiviert — der Browser wird angewiesen, immer die verschlüsselte Verbindung zu nutzen.
HSTS-Dauer: nur 2592000 Sekunden — zu kurz. Mindestens 180 Tage empfohlen.
Ihr HSTS-Zeitraum ist zu kurz (nur 2592000 Sekunden) — Browser „vergessen" die HTTPS-Pflicht schnell wieder. Empfohlen: mindestens 180 Tage (15552000 Sekunden), besser 1 Jahr (31536000).
Datei: .htaccess im Web-Root
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>⚠ Falls bereits ein anderer Header-set für Strict-Transport-Security existiert, diesen ersetzen (nicht zusätzlich einfügen, sonst wird der erste verworfen).
Datei: .htaccess im WordPress-Root
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>⚠ Vorhandenen HSTS-Eintrag im .htaccess durch diese Zeile ersetzen.
✓ So prüfen Sie, ob es funktioniert: curl -I https://ihre-domain.de | grep -i strict — der max-age-Wert muss mindestens 15552000 sein.
HSTS gilt auch für alle Subdomains (includeSubDomains).
Content Security Policy vorhanden (via HTTP-Header).
Skript-Quellen sind zu weit gefasst (Wildcard, http: etc.) — praktisch kein Schutz.
Ihre script-src-Quellen sind so weit gefasst (Wildcard *, http:, …), dass praktisch jeder Code geladen werden darf — die Schutzwirkung ist gleich null. Sie müssen die erlaubten Domains konkret auflisten.
Datei: .htaccess im Web-Root
<IfModule mod_headers.c>
Header always set Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.googletagmanager.com https://www.google-analytics.com; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'"
</IfModule>⚠ Listen Sie HINTER „script-src 'self'" nur die Domains, die Sie wirklich brauchen. Schritt-für-Schritt-Methode: alle Wildcards entfernen, Seite laden, F12-Konsole zeigt blockierte Domain → ergänzen → wiederholen. Die übrigen Direktiven (img-src data:, style-src 'unsafe-inline') sind bewusst tolerant gehalten, damit WordPress-Emoji, Admin-Bar und Plugin-Inline-Styles nicht zerschossen werden.
Datei: .htaccess im WordPress-Root
<IfModule mod_headers.c>
Header always set Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.googletagmanager.com; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'"
</IfModule>⚠ Domains nach „script-src 'self'" je nach Bedarf erweitern (jeweils mit Leerzeichen getrennt, https:// vorangestellt). WICHTIG: img-src data: und style-src 'unsafe-inline' MÜSSEN drinbleiben, sonst zerschießt es WordPress-Emoji, Admin-Bar-Icons und alle Plugin-Inline-Styles.
✓ So prüfen Sie, ob es funktioniert: F12 → Konsole. Wenn etwas geblockt wird, steht dort „Refused to load the script ‚https://…‘" — diese URL identifizieren, die Domain in script-src ergänzen, neu laden.
Einbettungsschutz (frame-ancestors) ist konfiguriert — schützt vor Clickjacking.
Gute Grundregel: Nur eigene Inhalte sind standardmäßig erlaubt (default-src: self).
Referrer-Policy: strict-origin-when-cross-origin (via HTTP-Header).
Sichere Einstellung „strict-origin-when-cross-origin" — kein Pfad-Leak, kein HTTP-Downgrade-Leak. Bestmöglich.
MIME-Typ-Schutz aktiv (nosniff) — Browser interpretieren Dateien nicht falsch.
Clickjacking-Schutz aktiv über CSP frame-ancestors.
Permissions-Policy ist konfiguriert — Zugriff auf sensible Geräte-APIs wird kontrolliert.
6 von 6 sensiblen APIs eingeschränkt — sehr gut.
2 Erstanbieter- und 0 Drittanbieter-Cookie(s).
| Name | Domain | Verschlüsselt | Nur Server | SameSite |
|---|---|---|---|---|
| cfzs_google-analytics_v4 | .digitaler-pflegeantrag.de | Ja | Ja | Lax |
| cfz_google-analytics_v4 | .digitaler-pflegeantrag.de | Ja | Ja | Lax |
Kein lokaler Speicher (Web Storage) genutzt — kein Tracking-Risiko.
5 Anfrage(n) an 4 verschiedene Drittanbieter-Server.
2 Drittanbieter-Server außerhalb der EU/des EWR — potenziell problematisch für die DSGVO.
DSGVO-relevant: Daten Ihrer Besucher (mindestens IP-Adresse + User-Agent) werden an Server außerhalb der EU/des EWR übertragen. Seit dem Schrems-II-Urteil (2020) ist das nur mit Standardvertragsklauseln + zusätzlichen Schutzmaßnahmen UND vorheriger Einwilligung zulässig. Beste Lösung: durch EU-Alternativen ersetzen, wo möglich.
WordPress-Plugin: Häufige Übeltäter und EU-Alternativen: Google Fonts → Bunny Fonts oder lokal hosten (Plugin „OMGF — Host Google Fonts Locally"). Google Analytics → Matomo (selbst gehostet) oder Plausible (EU-Server). Google reCAPTCHA → hCaptcha (EU) oder Friendly Captcha. Google Maps → OpenStreetMap. YouTube-Einbettung → Plugin „WP YouTube Lyte" lädt erst nach Klick. CDN: Cloudflare → BunnyCDN (EU) oder KeyCDN.
✓ So prüfen Sie, ob es funktioniert: Im Inkognito-Modus laden, F12 → Netzwerk → alle Anfragen auflisten → unter „Domain" auf Server außerhalb EU prüfen. Nach Umstellung sollte hier keine US-Domain mehr unaufgefordert geladen werden.
2 Drittanbieter-Server innerhalb der EU/des EWR.
Aufgerufene URLs:
https://versandhandel.dimdi.de/img/logo.png
https://versandhandel.dimdi.de/img/logo.gif
Aufgerufene URLs:
https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496
Aufgerufene URLs:
https://stats.g.doubleclick.net/g/collect?t=dc&aip=1&_r=3&v=1&_v=j86&tid=G-8RFV54ELLS&cid=07ced2a1-9ac0-4663-a00a-4a11a6ab2522&_u=KGDAAEADQAAAAC%7E&z=821812490
Aufgerufene URLs:
https://www.google.com/ads/ga-audiences?t=sr&aip=1&_r=4&v=1&_v=j86&tid=G-8RFV54ELLS&cid=07ced2a1-9ac0-4663-a00a-4a11a6ab2522&_u=KGDAAEADQAAAAC%7E&z=821812490&slf_rd=1
1 bekannte(r) Tracker erkannt! Diese verfolgen Besucher über verschiedene Websites.
Tracker (Google Analytics, Facebook Pixel, …) erfassen Besucher und verfolgen sie über mehrere Websites. Nach § 25 TDDDG und Art. 6 Abs. 1 DSGVO erforderlich: ausdrückliche Einwilligung VOR dem Laden des Trackers. „Weiter scrollen = Zustimmung" ist NICHT zulässig.
WordPress-Plugin: Consent-Plugins, die Tracker korrekt blockieren bis zur Einwilligung: „Complianz" (kostenlos, sehr gut), „Real Cookie Banner", „Borlabs Cookie" (kostenpflichtig, am gründlichsten). Prinzip nach Einrichtung: Tracker-Snippet (z.B. GA-Script) NICHT direkt im Theme einbauen, sondern dem Consent-Plugin übergeben, das schaltet sie erst nach „Zustimmen" frei. Datenschutzfreundliche Tracker-Alternativen: Matomo (Cookieless-Modus → braucht u.U. kein Consent), Plausible (EU, anonym, kein Consent nötig laut Anbieter — Rechtsberatung empfohlen).
✓ So prüfen Sie, ob es funktioniert: Inkognito-Browser, Seite laden — VOR „Zustimmen": F12 → Netzwerk → keine Anfragen an google-analytics.com, facebook.com/tr usw. NACH „Zustimmen" dann ja.
Google (Content): www.google.com
1 von 1 externen Ressource(n) nutzen Integritätsprüfung (SRI).
CAA-Einträge vorhanden: comodoca.com, digicert.com; cansignhttpexchanges=yes, letsencrypt.org, pki.goog; cansignhttpexchanges=yes, ssl.com, comodoca.com, digicert.com; cansignhttpexchanges=yes, letsencrypt.org, pki.goog; cansignhttpexchanges=yes, ssl.com — nur bestimmte Zertifizierungsstellen dürfen Zertifikate ausstellen.
2 Nameserver vorhanden — gute Redundanz.
IPv6-Unterstützung vorhanden (AAAA-Einträge).
SPF-Eintrag vorhanden: v=spf1 mx a include:spf.protection.outlook.com include:eu.transmail.net include:eu.zcsend.net include:usermail.zohocreat — schützt vor E-Mail-Spoofing.
DMARC-Eintrag vorhanden: v=DMARC1; p=reject; — E-Mail-Authentifizierung aktiv.
security.txt gefunden: https://digitaler-pflegeantrag.de/.well-known/security.txt
Kontaktfeld vorhanden (Pflichtfeld) — Sicherheitsforscher können Schwachstellen melden.
Ablaufdatum vorhanden (Pflichtfeld).
Verschlüsselungsinformationen angegeben.
Bevorzugte Sprachen angegeben.
Network Error Logging (NEL) aktiv — Netzwerkfehler werden an einen externen Dienst gemeldet.
Network Error Logging (NEL) meldet Netzwerkfehler an einen externen Server. Wie bei externem Reporting: in Datenschutzerklärung erwähnen und prüfen, ob der Empfänger DSGVO-konform arbeitet.
Datei: .htaccess im Web-Root
<IfModule mod_headers.c>
Header always unset NEL
Header always unset Report-To
</IfModule>⚠ Wenn Sie NEL nicht aktiv brauchen: diese zwei Zeilen entfernen beide Reporting-Header. Wenn doch: in der Datenschutzerklärung dokumentieren.
Datei: .htaccess im WordPress-Root
<IfModule mod_headers.c>
Header always unset NEL
Header always unset Report-To
</IfModule>⚠ Falls die Header von einem Plugin gesetzt werden, das Plugin selbst konfigurieren.
✓ So prüfen Sie, ob es funktioniert: F12 → Netzwerk → erste Anfrage → Response Header: KEINE Einträge „nel" und „report-to" mehr (oder bewusst dokumentiert).
Daten werden an externen Dienst gemeldet: Report-To: a.nel.cloudflare.com
Ihre Website sendet Fehler- oder CSP-Berichte an einen externen Dienst (Report-To: a.nel.cloudflare.com). DSGVO-relevant: dabei werden mindestens IP-Adresse und URL übertragen. Prüfen Sie, ob (a) der Empfänger DSGVO-konform arbeitet, (b) die Übermittlung in Ihrer Datenschutzerklärung erwähnt ist, (c) ein Auftragsverarbeitungsvertrag (AVV) besteht.
WordPress-Plugin: Wenn Sie den Reporting-Empfänger nicht selbst eingerichtet haben, kommt er meist aus einem Plugin (z.B. Sentry, Rollbar, Datadog). Im Plugin-Konfigurationsbereich prüfen — entweder deaktivieren, durch EU-Anbieter ersetzen oder konsent-pflichtig stellen.
✓ So prüfen Sie, ob es funktioniert: Datenschutzerklärung enthält Eintrag zu Fehler-Reporting + AVV liegt vor. Im Inkognito-Modus: F12 → Netzwerk → keine ungewollten Berichts-Anfragen.
Cookie-Einwilligungssystem erkannt: TCF API (__tcfapi), Borlabs Cookie, borlabs.
TCF-kompatibles Consent-System (Transparency & Consent Framework) — Standard der IAB.
Consent-System erkannt, aber Banner scheint nicht sichtbar zu sein.
Ihr Consent-System ist eingebaut, aber das Banner scheint nicht sichtbar — möglicherweise von einem anderen Plugin oder eigenen CSS-Regeln verborgen. Das ist ein Risiko: ohne sichtbares Banner gilt keine Einwilligung.
WordPress-Plugin: Vorgehen: 1) Browser-Cache + Cookies löschen, Inkognito-Tab nutzen. 2) Im Consent-Plugin: prüfen, ob Anzeige-Bedingungen das Banner versehentlich ausblenden (z.B. „nur für EU-Besucher" — und Sie testen vom EU-Server gerade aus). 3) Browser-Konsole F12 → Tab „Konsole" auf rote Fehler von consent-Skripten prüfen. 4) Inspektor → DOM nach „cookie", „consent" durchsuchen — Element vorhanden, aber display:none? Z-Index zu niedrig? 5) Anderes Plugin (Cookie-Notice-Konkurrent) deinstallieren.
✓ So prüfen Sie, ob es funktioniert: Inkognito-Tab, Seite laden, 5 Sekunden warten — Banner sichtbar zentral/unten, blockiert Hauptinhalt nicht komplett, ist anklickbar.
Tracker werden bereits beim Seitenaufruf geladen — möglicherweise VOR der Einwilligung.
Ihre Tracker werden geladen, bevor der Nutzer einwilligen kann („pre-consent loading"). Das ist ein häufiger Konfigurationsfehler bei Cookie-Plugins — Banner erscheint, aber zu spät: GA-Skript läuft schon. Verstößt gegen § 25 TDDDG.
WordPress-Plugin: Ursache liegt fast immer im Theme oder einem Tracking-Plugin, das den Tracker-Code direkt einbettet (z.B. „Google Analytics for WordPress" mit Auto-Insert). Lösung: 1) Tracking-Code AUS dem Theme/Plugin entfernen. 2) In Consent-Plugin (Complianz/Real Cookie Banner): Tracker als „Service" anlegen, Skript-Snippet dort hinterlegen — das Plugin lädt es erst bei Einwilligung. 3) ALTERNATIV: Plugin „Pys — PixelYourSite" + Consent-Verknüpfung. KEIN „GA bevor Consent als anonymisiert laden" — ist DSGVO-rechtlich nicht abschließend geklärt und riskant.
✓ So prüfen Sie, ob es funktioniert: Inkognito → F12 → Netzwerk (alles löschen, dann Aufzeichnung starten) → Seite laden, NICHT auf Banner klicken, 10 Sekunden warten → es darf KEINE Anfrage an google-analytics.com, googletagmanager.com, facebook.com/tr, doubleclick.net etc. erscheinen.
Datenschutzerklärung verlinkt: „Datenschutzerklärung" (https://digitaler-pflegeantrag.de/datenschutzerklarung/).
Impressum verlinkt: „Impressum" (https://digitaler-pflegeantrag.de/impressum/).
Datenschutzerklärung ist erreichbar (HTTP 200).
Alle fehlenden Security-Header zu einem einzigen Block kombiniert. Diesen Block ans Ende Ihrer .htaccess hängen — fertig. 2 Header werden gesetzt.
Die Content-Security-Policy oben enthält bewusst 'unsafe-inline' sowohl für style-src als auch für script-src. Damit ist KEIN vollständiger XSS-Schutz möglich — das ist eine pragmatische Entscheidung, kein Bug.
Warum? Ein typisches WordPress-Setup (Theme + 5-15 Plugins) schreibt 10-50 verschiedene Inline-<script>-Blocks ins HTML: jQuery-Init, Slider-Initialisierung, Cookie-Banner, Tracking, GTM, Web Vitals, Lazy-Load, Speculation Rules usw. Wenn die strikte CSP script-src 'self' diese alle blockt, ist die Site optisch und funktional kaputt (Slider weiß, Cookie-Banner zerschossen, Plugins tot). Genau dieses Problem hatten Sie soeben mit Ihrer Slider-Seite.
Konsequenz fürs Scoring: Sites, die WordPress mit Plugins einsetzen, können in dieser App maximal ~75-85 Punkte in der CSP-Kategorie erreichen — das volle 100%-Rating ist erst möglich, wenn der inline-Code per Nonce oder Hash signiert wird (technisch anspruchsvoll, bricht bei jedem Theme/Plugin-Update).
Wege zum vollen XSS-Schutz (in steigender Komplexität):
Wer keinen dieser Wege geht, lebt mit 'unsafe-inline' — wie ca. 95% aller produktiven WordPress-Sites im Web. Die anderen CSP-Direktiven schützen weiterhin: default-src 'self' blockt externe Ressourcen, object-src 'none' verbietet Flash/Java, frame-ancestors 'self' verhindert Clickjacking, base-uri 'self' verhindert Base-Tag-Hijacking. Es ist kein Maximalschutz, aber realistischer Schutz für die WP-Praxis.
Diesen Block ans Ende Ihrer .htaccess im Web-Root hängen — fertig.
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; upgrade-insecure-requests"
</IfModule>
Diesen Block OBERHALB der Zeile „# BEGIN WordPress" einfügen, sonst überschreibt WP ihn bei Permalink-Änderungen.
# BEGIN WebForensik Security
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set Content-Security-Policy "default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; upgrade-insecure-requests"
</IfModule>
# END WebForensik Security
Falls Ihr Hoster .htaccess-Änderungen nicht erlaubt: dieses PHP-Snippet ans Ende der functions.php Ihres CHILD-Themes hängen. Vorher Backup machen — NIE das Haupt-Theme bearbeiten, das wird bei Updates überschrieben.
add_action('send_headers', function () {
header("Strict-Transport-Security: max-age=31536000; includeSubDomains");
header("Content-Security-Policy: default-src 'self'; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline'; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; upgrade-insecure-requests");
});
| Header | Wert |
|---|---|
| alt-svc | h3=":443"; ma=86400 |
| cf-cache-status | DYNAMIC |
| cf-ray | a2a68ee54efcd114-CDG |
| content-encoding | br |
| content-security-policy | default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src 'self' 'unsafe-inline' https:; img-src 'self' data: https:; font-src 'self' data: https:; connect-src 'self' https:; frame-src https:; frame-ancestors 'self' https://pflegeantrag.de https://enkian-solutions. |
| content-type | text/html; charset=UTF-8 |
| date | Thu, 13 Aug 2026 09:05:27 GMT |
| expect-ct | max-age=86400, enforce |
| last-modified | Thu, 13 Aug 2026 07:39:11 GMT |
| link | <https://digitaler-pflegeantrag.de/wp-json/>; rel="https://api.w.org/", <https://digitaler-pflegeantrag.de/wp-json/wp/v2/pages/3440>; rel="alternate"; title="JSON"; type="application/json", <https://digitaler-pflegeantrag.de/>; rel=shortlink |
| nel | {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800} |
| permissions-policy | geolocation=(), microphone=(), camera=(), payment=(), usb=(), interest-cohort=() |
| referrer-policy | strict-origin-when-cross-origin |
| report-to | {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=nMe1L3LgG6Tv5YFuEhI%2BqvPIqX3c69NXWSpJSIhZtRUDAdlWShjTjA0QbLJYpZZq9RGNC%2B8g60JgzWgikbcP0Ps%2BO3CtJ%2F6S7vEpPbLwsNMz6TjqEACSYZ34HIP%2FODU3MyV2EkLu1hhU8yPXfKYjFXy4MSliJ8U%3D"}]} |
| server | cloudflare |
| server-timing | cfCacheStatus;desc="DYNAMIC" cfEdge;dur=71,cfOrigin;dur=0 |
| strict-transport-security | max-age=2592000; includeSubDomains |
| vary | Accept-Encoding |
| x-cache | HIT |
| x-cache-enabled | true |
| x-content-type-options | nosniff |
| x-frame-options | SAMEORIGIN |
| x-xss-protection | 1; mode=block |