Deutsch | English Header test API About WebForensik

WebForensik

Results for https://sterkyachts.com/

Scan time: 2026-08-30 01:23:32

60

Overall Score

Changes since the last scan +1 improved

Compared with scan from 13.08.2026 16:22 (Score 59 → 60) · View full history

External Resource Integrity (SRI) 20→25 Third-Party Requests 15→30

Score history for this domain View full history →

GDPR Summary

⚠ This website has serious GDPR deficiencies. Immediate action is required.

GDPR Issues Detected (4):

❌ 4 third-party server(s) outside the EU/EEA — data transfers without legal basis may violate Art. 44–49 GDPR.

Affected servers outside the EU:

  • www.google.com (United States)
  • www.googletagmanager.com (United States)
  • www.gstatic.com (United States)
  • fonts.gstatic.com (United States)

❌ 1 tracking service(s) detected — without prior consent (opt-in) this violates Art. 6(1) GDPR.

Detected trackers:

  • Google (Content)

⚠ Third-party cookies are being set — without consent this violates the ePrivacy Directive.

⚠ No Content Security Policy — increased risk of cross-site scripting (XSS) and data theft.

Note: This automated analysis does not replace legal advice. For a complete GDPR assessment, consult a data protection officer.

↓ See detailed results for each category below.

Show:
100 HTTPS / Encryption

The website uses an encrypted connection (HTTPS).

Latest encryption active (TLS 1.3 — TLSv1.3).

The security certificate is valid (expires 2026-10-07).

Strong encryption method (TLS_AES_256_GCM_SHA384, 256 bit).

90 Enforced Encryption (HSTS)

HSTS is enabled — the browser is instructed to always use the encrypted connection.

HSTS duration: 31536000 seconds (at least 1 year) — very good.

HSTS also applies to all subdomains (includeSubDomains).

0 Content Security Policy (CSP)

No Content Security Policy (CSP) found. The website has no protection against injected malicious code.

☛ Action needed: Set up a Content Security Policy. This protects your visitors from injected malicious code (Cross-Site Scripting/XSS). Start with a simple policy: Content-Security-Policy: default-src 'self'. Your web developer or hosting provider can help.
▸ How to fix this — step-by-step guide

A Content Security Policy (CSP) is a doorkeeper rule for the browser: "Scripts and styles may only be loaded from these allowed sources." Without CSP, injected malicious code (XSS) can freely fetch anything. Start with a simple, secure baseline.

Apache server (classic hosting at most providers)

File: .htaccess in the 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'; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'"
</IfModule>

⚠ This policy is intentionally pragmatic (allows inline styles since many themes/plugins rely on them). If something breaks after enabling: F12 → Console shows "Refused to load…" — add the affected domain after script-src / img-src.

WordPress Special for WordPress: where to add this

Option 1: via .htaccess (recommended — no theme editing)

File: .htaccess in the WordPress root

# BEGIN WebForensik CSP
<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'; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'"
</IfModule>
# END WebForensik CSP

⚠ WordPress often loads external scripts (Google Fonts, jQuery CDN, analytics pixel) — if CSP blocks them: open the console, see which domain is blocked, append that domain to "script-src 'self'" separated by a space.

Option 2: via functions.php in the child theme (Advanced alternative)

File: functions.php of your CHILD theme

add_action('send_headers', function () {
    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'");
});

⚠ If unsure: start with "Content-Security-Policy-Report-Only" (only monitor, don’t block), watch violations in the console, then switch to enforced mode.

✓ How to verify it works: Open page, F12 → Console — no red "Refused to load…" messages. Network tab → first request → Response Header "content-security-policy" visible.

↓ SHOW COMPLETE SOLUTION All missing security headers bundled at the end of the report — ready to copy.
100 Referrer Policy

Referrer-Policy: strict-origin-when-cross-origin (via HTTP-Header).

Strict setting "strict-origin-when-cross-origin" — no path leak, no HTTP downgrade leak. Best practice.

0 MIME Type Protection

Invalid value: nosniff nosniff. Expected "nosniff".

☛ Action needed: The current value is incorrect. Set the header correctly: X-Content-Type-Options: nosniff
▸ How to fix this — step-by-step guide

Your X-Content-Type-Options header has an invalid value (nosniff nosniff) — expected is exactly "nosniff". Correct it.

Apache server (classic hosting at most providers)

File: .htaccess in the web root

<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
</IfModule>

⚠ Replace the existing malformed line.

WordPress Special for WordPress: where to add this

Option 1: via .htaccess (recommended — no theme editing)

File: .htaccess in the WordPress root

<IfModule mod_headers.c>
    Header always set X-Content-Type-Options "nosniff"
</IfModule>

⚠ Replace the malformed entry.

✓ How to verify it works: F12 → Network → Response Header: value exactly "nosniff".

↓ SHOW COMPLETE SOLUTION All missing security headers bundled at the end of the report — ready to copy.
100 Clickjacking Protection

Clickjacking protection active: X-Frame-Options = SAMEORIGIN.

0 Permissions (Camera, Microphone, etc.)

No Permissions-Policy set. Third-party scripts could access camera, microphone, or location.

☛ Action needed: Set a Permissions-Policy to control access to camera, microphone, and location. GDPR-relevant: Without this setting, third-party scripts could silently access sensitive device features. Example: Permissions-Policy: camera=(), microphone=(), geolocation=()
▸ How to fix this — step-by-step guide

Permissions-Policy controls whether scripts (including third-party) may access camera, microphone, location, motion sensors etc. GDPR-relevant because sensitive device APIs can otherwise be reached unnoticed.

Apache server (classic hosting at most providers)

File: .htaccess in the web root

<IfModule mod_headers.c>
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), accelerometer=(), gyroscope=(), magnetometer=(), interest-cohort=()"
</IfModule>

⚠ "()" at the end means: no caller (not even your own page) may use this API. If you need geolocation (e.g. a map feature): use geolocation=(self) instead of geolocation=(). "interest-cohort=()" disables Google’s FLoC tracking.

WordPress Special for WordPress: where to add this

Option 1: via .htaccess (recommended — no theme editing)

File: .htaccess in the WordPress root

<IfModule mod_headers.c>
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()"
</IfModule>

⚠ Standard WordPress needs none of these APIs. If you use a plugin that needs the camera (QR scanner, video upload), set that API to "(self)".

Option 2: via functions.php in the child theme (Advanced alternative)

File: functions.php of your CHILD theme

add_action('send_headers', function () {
    header('Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()');
});

⚠ Back up functions.php before edits.

✓ How to verify it works: F12 → Network → Response Header: "permissions-policy" visible.

↓ SHOW COMPLETE SOLUTION All missing security headers bundled at the end of the report — ready to copy.
75 Cookies

3 first-party and 1 third-party cookie(s).

1 third-party cookie(s) detected. These can be used to track you across different websites.

☛ Action needed: GDPR VIOLATION: Third-party cookies track visitors across multiple websites. This requires explicit consent (opt-in) BEFORE the cookies are set. Solution: (1) Check which external services set the cookies. (2) Remove unnecessary services. (3) For essential services: Implement a cookie consent banner that only loads these cookies after consent.
▸ How to fix this — step-by-step guide

Third-party cookies (e.g. from Google, Facebook) track visitors across websites. Under GDPR Art. 6 and ePrivacy / national implementations, explicit consent is required BEFORE setting them. Three-step fix: (1) identify which external services set the cookies, (2) remove services you don’t strictly need, (3) for essential services, add a consent banner that loads them only after "Accept".

WordPress Special for WordPress: where to add this

WordPress plugin: Cookie-consent plugins for WordPress: "Complianz" (free, GDPR-focused, thorough wizard), "Real Cookie Banner" (free, knows many services), "Borlabs Cookie" (paid, most feature-complete). Critical configuration: set all tracking services to "do NOT load before consent" — most plugins detect standard services (GA, Maps, YouTube) automatically.

✓ How to verify it works: Open the site in incognito mode → F12 → Application → Cookies → your-domain.com. BEFORE clicking "Accept" there must be NO cookies from google.com, facebook.com etc. AFTER consent, yes.

3 of 4 cookie(s) without HttpOnly flag — could be read by malicious code.

☛ Action needed: Set the HttpOnly flag for all cookies that are not needed by JavaScript. This protects against session data theft through malicious code.
▸ How to fix this — step-by-step guide

Cookies without the "HttpOnly" flag can be read by JavaScript — an XSS attacker can steal session cookies and impersonate the logged-in user. Set HttpOnly for all cookies JavaScript doesn’t actively need.

Apache server (classic hosting at most providers)

File: .htaccess in the web root

<IfModule mod_headers.c>
    Header always edit Set-Cookie "^(.*)$" "$1; HttpOnly" "expr=!(resp('Set-Cookie') -strmatch '*HttpOnly*')"
</IfModule>

⚠ Cleaner: set cookies with HttpOnly directly (PHP: setcookie(..., [..., 'httponly'=>true])). Exception: cookies that JS actively reads (e.g. some consent cookies).

WordPress Special for WordPress: where to add this

Option 2: via functions.php in the child theme (Advanced alternative)

File: functions.php of your CHILD theme (or better wp-config.php)

@ini_set('session.cookie_httponly', '1');
@ini_set('session.cookie_secure', '1');

⚠ WordPress login cookies have been HttpOnly since 2.x. If you use a plugin that sets session cookies (e.g. WooCommerce cart pre-login), check its settings.

✓ How to verify it works: F12 → Application → Cookies → "HttpOnly" column shows checkmarks everywhere (except for deliberately JS-readable cookies like the consent cookie).

1 of 4 cookie(s) without SameSite protection — sent with requests from other websites.

☛ Action needed: Set the SameSite attribute (Lax or Strict) for all cookies. This prevents cookies from being sent with requests from other websites (CSRF protection).
▸ How to fix this — step-by-step guide

Without "SameSite" cookies are sent on requests from foreign sites — the basis of CSRF attacks (a foreign page silently triggers actions in your name because the login cookie travels along). Set SameSite=Lax as a minimum.

Apache server (classic hosting at most providers)

File: .htaccess in the web root

<IfModule mod_headers.c>
    Header always edit Set-Cookie "^(.*)$" "$1; SameSite=Lax" "expr=!(resp('Set-Cookie') -strmatch '*SameSite*')"
</IfModule>

⚠ SameSite=Lax is a good default. Strict is safer but breaks external links (user clicks from Google to your site — cookies are NOT sent, login is lost). None allows cross-site but requires "; Secure".

WordPress Special for WordPress: where to add this

Option 2: via functions.php in the child theme (Advanced alternative)

File: wp-config.php (above "/* That’s all, stop editing! */")

@ini_set('session.cookie_samesite', 'Lax');
@ini_set('session.cookie_secure', '1');
@ini_set('session.cookie_httponly', '1');

⚠ Sets SameSite/Secure/HttpOnly for PHP session cookies. WordPress login cookies have been SameSite=Lax since WP 6.2. Update older versions!

✓ How to verify it works: F12 → Application → Cookies → "SameSite" column should show "Lax" or "Strict" everywhere, not empty.

First-party cookies (from the website itself)

Name Domain Encrypted Server only SameSite
uncode_privacy[consent_types] sterkyachts.com Yes No Strict
cookieyes-consent sterkyachts.com Yes No Strict
uncode_gdpr_session_2bd8634f1eb114eb7f50 sterkyachts.com Yes No Strict

Third-party cookies (from external services)

Name Domain Encrypted Server only SameSite
_GRECAPTCHA www.google.com Yes Yes None
↓ SHOW COMPLETE SOLUTION All missing security headers bundled at the end of the report — ready to copy.
70 Local Storage (Web Storage)

4 localStorage and 1 sessionStorage item(s) found.

localStorage

NameValue
onetap-accessibility-free {"dynamicFeatureSet":{"visionImpairedMode":false,"seizureSafeProfileMode":false,
_grecaptcha 09AKhCRwjNNSzQm46LVWk5I_TeVknK_l8CcxlPx4zIFXjU7cGzhmtMt2NLQQPq8AQfcHHFBgd62ExEk1
webp_lossy_supported true
webp_lossless_supported true

sessionStorage

NameValue
wpEmojiSettingsSupports {"supportTests":{"flag":false,"emoji":true},"timestamp":1788045806988}
30 Third-Party Requests

21 request(s) to 6 different third-party servers.

4 third-party server(s) outside the EU/EEA — potentially problematic for GDPR compliance.

☛ Action needed: POSSIBLE GDPR VIOLATION: Your visitors' data is being transferred to servers outside the EU/EEA. Since the Schrems II ruling, this is only permitted with special safeguards. Solutions: (1) Switch to EU-based alternatives (e.g., Matomo instead of Google Analytics, Bunny Fonts instead of Google Fonts). (2) If not possible: Ensure Standard Contractual Clauses (SCC) and additional technical measures are in place. (3) Obtain explicit visitor consent BEFORE data is transferred.
▸ How to fix this — step-by-step guide

GDPR-relevant: visitor data (at least IP + User-Agent) is transmitted to servers outside the EU/EEA. Since the Schrems-II ruling (2020) this requires Standard Contractual Clauses + supplementary technical measures AND prior consent. Best fix: replace with EU alternatives where possible.

WordPress Special for WordPress: where to add this

WordPress plugin: Common culprits and EU alternatives: Google Fonts → Bunny Fonts or self-host (plugin "OMGF — Host Google Fonts Locally"). Google Analytics → Matomo (self-hosted) or Plausible (EU servers). Google reCAPTCHA → hCaptcha (EU) or Friendly Captcha. Google Maps → OpenStreetMap. YouTube embeds → plugin "WP YouTube Lyte" loads only after click. CDN: Cloudflare → BunnyCDN (EU) or KeyCDN.

✓ How to verify it works: Load in incognito mode, F12 → Network → list all requests → check "Domain" column for non-EU servers. After migration no unrequested US domains should load.

2 third-party server(s) within the EU/EEA.

cdn-cookieyes.com 8 Requests · Canada (CA) · EU/EEA

Requested URLs:

https://cdn-cookieyes.com/client_data/80def7f247de04a03921b7bac35cdc63/script.js

https://cdn-cookieyes.com/client_data/80def7f247de04a03921b7bac35cdc63/banner.js

https://cdn-cookieyes.com/client_data/80def7f247de04a03921b7bac35cdc63/CbSYxzX-.json

https://cdn-cookieyes.com/client_data/80def7f247de04a03921b7bac35cdc63/config/G3yp5Oeg.json

https://cdn-cookieyes.com/client_data/80def7f247de04a03921b7bac35cdc63/translations/QYJOQYrr.json

https://cdn-cookieyes.com/client_data/80def7f247de04a03921b7bac35cdc63/audit-table/hcK4NF5o.json

https://cdn-cookieyes.com/assets/images/revisit.svg

https://cdn-cookieyes.com/assets/images/close.svg

www.google.com 5 Requests · United States (US) · Non-EU
⚠ GDPR Issue: This server is located outside the EU/EEA. Transferring personal data (e.g. your visitors' IP addresses) to this server may violate Art. 44-49 GDPR. Without a valid legal basis (e.g. consent, Standard Contractual Clauses) this data transfer is unlawful.

Requested URLs:

https://www.google.com/recaptcha/api.js?render=6Le_7OUrAAAAALVRpAYisfgyV734KwCOo8a2VZYk&ver=3.0

https://www.google.com/recaptcha/api2/anchor?ar=1&k=6Le_7OUrAAAAALVRpAYisfgyV734KwCOo8a2VZYk&co=aHR0cHM6Ly9zdGVya3lhY2h0cy5jb206NDQz&hl=en&v=ox8dsmiqR62P1bqhciWOn7Fg&size=invisible&anchor-ms=20000&exe

https://www.google.com/recaptcha/api2/webworker.js?hl=en&v=ox8dsmiqR62P1bqhciWOn7Fg

https://www.google.com/recaptcha/api2/reload?k=6Le_7OUrAAAAALVRpAYisfgyV734KwCOo8a2VZYk

https://www.google.com/recaptcha/api2/clr?k=6Le_7OUrAAAAALVRpAYisfgyV734KwCOo8a2VZYk

www.gstatic.com 5 Requests · United States (US) · Non-EU
⚠ GDPR Issue: This server is located outside the EU/EEA. Transferring personal data (e.g. your visitors' IP addresses) to this server may violate Art. 44-49 GDPR. Without a valid legal basis (e.g. consent, Standard Contractual Clauses) this data transfer is unlawful.

Requested URLs:

https://www.gstatic.com/recaptcha/releases/ox8dsmiqR62P1bqhciWOn7Fg/recaptcha__en.js

https://www.gstatic.com/recaptcha/releases/ox8dsmiqR62P1bqhciWOn7Fg/styles__ltr.css

https://www.gstatic.com/recaptcha/api2/logo_48.png

... and 2 more request(s)

log.cookieyes.com 1 Requests · Canada (CA) · EU/EEA

Requested URLs:

https://log.cookieyes.com/api/v1/log

www.googletagmanager.com 1 Requests · United States (US) · Non-EU
⚠ GDPR Issue: This server is located outside the EU/EEA. Transferring personal data (e.g. your visitors' IP addresses) to this server may violate Art. 44-49 GDPR. Without a valid legal basis (e.g. consent, Standard Contractual Clauses) this data transfer is unlawful.

Requested URLs:

https://www.googletagmanager.com/gtag/js?id=GT-TBNN44J

fonts.gstatic.com 1 Requests · United States (US) · Non-EU
⚠ GDPR Issue: This server is located outside the EU/EEA. Transferring personal data (e.g. your visitors' IP addresses) to this server may violate Art. 44-49 GDPR. Without a valid legal basis (e.g. consent, Standard Contractual Clauses) this data transfer is unlawful.

Requested URLs:

https://fonts.gstatic.com/s/roboto/v48/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBA.woff2

80 Tracker Detection

1 known tracker(s) detected! These track visitors across different websites.

☛ Action needed: GDPR VIOLATION: Trackers follow your visitors across different websites. This requires explicit consent BEFORE loading the trackers. Solutions: (1) Remove all unnecessary trackers. (2) Switch to privacy-friendly alternatives (e.g., Matomo, Plausible, Fathom instead of Google Analytics). (3) For essential trackers: Implement a consent banner that only loads trackers AFTER consent.
▸ How to fix this — step-by-step guide

Trackers (Google Analytics, Facebook Pixel, …) capture visitors and follow them across multiple sites. Under GDPR Art. 6 and ePrivacy / national implementations, explicit consent is required BEFORE loading the tracker. "Continued scrolling = consent" is NOT acceptable.

WordPress Special for WordPress: where to add this

WordPress plugin: Consent plugins that properly block trackers until consent: "Complianz" (free, very good), "Real Cookie Banner", "Borlabs Cookie" (paid, most thorough). Principle after setup: do NOT embed the tracker snippet (e.g. GA script) directly in your theme — register it with the consent plugin, which only releases it after "Accept". Privacy-friendly tracker alternatives: Matomo (cookieless mode → may need no consent), Plausible (EU, anonymous, vendor claims no consent needed — legal advice recommended).

✓ How to verify it works: Incognito, load page — BEFORE "Accept": F12 → Network → no requests to google-analytics.com, facebook.com/tr etc. AFTER "Accept", yes.

Google (Content): www.google.com, www.gstatic.com

25 External Resource Integrity (SRI)

1 of 4 external resource(s) use integrity verification (SRI).

☛ Action needed: Not all external resources have integrity verification. Add SRI hashes for the missing resources.
▸ How to fix this — step-by-step guide

Only some of your external resources (1 of 4) are protected by SRI. Add integrity attributes to the remaining ones too.

WordPress Special for WordPress: where to add this

WordPress plugin: Approach: view page source → all <script src="https://…"> and <link href="https://…"> without integrity attribute → generate hash at https://www.srihash.org/ → add integrity="sha384-…" crossorigin="anonymous". Plugin "WP-SRI" automates many cases.

✓ How to verify it works: F12 → Console on page load: no "Failed to find a valid digest" messages. Source: all external <script>/<link> have an integrity attribute.

75 DNS Security

No CAA records. Any certificate authority could issue a certificate for this domain.

☛ Action needed: Create CAA DNS records to specify which certificate authorities may issue certificates for your domain. This prevents unauthorized certificates from being issued.
▸ How to fix this — step-by-step guide

CAA records (Certification Authority Authorization) define in DNS which Certificate Authorities are allowed to issue certificates for your domain. Without a CAA record an attacker could request a fraudulent certificate for your domain at any CA. CAA is pure DNS configuration — set in your registrar/DNS-panel, NOT in WordPress.

☞ Concrete CAA values for the ten most common DACH-region hosts

Find your host in the table, copy the values to your DNS panel. For multi-CA hosts: one separate CAA record per CA (all with tag issue, flag 0, name @). Additionally recommended: an iodef record with a contact email for abuse reports.

#HostCA(s) usedCAA value(s) — tag issue
1Hetzner Webhosting (basic certificate, free in package)DigiCert (programme „Encryption Everywhere")digicert.com
1Hetzner Webhosting (Let’s Encrypt, free)Let’s Encrypt (ISRG)letsencrypt.org
2All-InklLet’s Encrypt + Sectigo (Pro)letsencrypt.org
sectigo.com
3IONOS (1&1)DigiCert (GeoTrust) + Let’s Encryptdigicert.com
letsencrypt.org
4STRATOSectigo + Let’s Encryptsectigo.com
letsencrypt.org
5Cloudflare (Universal SSL)Google Trust Services + DigiCert + Let’s Encryptpki.goog
digicert.com
letsencrypt.org
6AWS (ACM / CloudFront)Amazon Trust Servicesamazon.com
amazontrust.com
awstrust.com
amazonaws.com
7MittwaldLet’s Encrypt + Sectigoletsencrypt.org
sectigo.com
8WebgoLet’s Encrypt + Sectigoletsencrypt.org
sectigo.com
9raidboxes (Managed WordPress)Let’s Encryptletsencrypt.org
10Host Europe / DomainFactorySectigo + Let’s Encryptsectigo.com
letsencrypt.org
Name   Type   Flag   Tag      Value
@      CAA    0      issue    "digicert.com"
@      CAA    0      issue    "letsencrypt.org"
@      CAA    0      iodef    "mailto:security@your-domain.com"

The iodef line (last line) is optional but recommended: CAs report abuse attempts to that address. For subdomains (e.g. shop.your-domain.com) create separate records with the subdomain name instead of @ — modern CAs check parent CAA automatically though.

If your host is not on the list: open your current certificate in the browser (padlock → certificate → issuer). The CA name is shown there (e.g. "Sectigo RSA Domain Validation Secure Server CA" → value sectigo.com). Add that as a CAA record, done.

WordPress Special for WordPress: where to add this

WordPress plugin: CAA records are NOT created in WordPress but in your domain registrar / DNS provider panel (e.g. Hetzner-Robot, IONOS Domains, Cloudflare Dashboard, INWX, etc.). Common label: "CAA record" or under "TXT records" with type selector "CAA". One separate record per CA.

✓ How to verify it works: On https://www.ssllabs.com/ssltest/analyze.html?d=your-domain.com → "DNS CAA" section → all your CAs should be listed. Or via dig: dig CAA your-domain.com.

2 nameservers present — good redundancy.

IPv6 support present (AAAA records).

SPF record present: v=spf1 ip4:86.107.36.76 +mx +a +ip4:86.107.32.59/24 ~all — protects against email spoofing.

No DMARC record. The domain is vulnerable to email phishing.

☛ Action needed: Create a DMARC DNS record at _dmarc.yourdomain.com. DMARC protects against phishing and email spoofing. Example: v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com
▸ How to fix this — step-by-step guide

DMARC combines SPF and DKIM into an explicit instruction for receiving mail servers: "What to do if emails claim to come from us but SPF/DKIM fail?" Without DMARC each server decides — usually generously. With DMARC=reject you effectively prevent phishing in your name.

WordPress Special for WordPress: where to add this

WordPress plugin: DNS matter. TXT record at subdomain _dmarc.your-domain.com. Recommended stages: Observe first: v=DMARC1; p=none; rua=mailto:dmarc-reports@your-domain.com — review reports for weeks. Then tighten: v=DMARC1; p=quarantine; rua=… — suspicious mails go to spam. Final: v=DMARC1; p=reject; rua=… — they’re refused outright.

✓ How to verify it works: dig TXT _dmarc.your-domain.com — or online https://dmarcian.com/dmarc-inspector/.

0 Security Contact (security.txt)

No security.txt file found (RFC 9116). Security researchers don't know how to report vulnerabilities.

☛ Action needed: Create a security.txt file at /.well-known/security.txt. This allows security researchers to responsibly report vulnerabilities. Required fields: Contact (email or URL) and Expires (expiration date).
▸ How to fix this — step-by-step guide

A security.txt (RFC 9116) tells security researchers how to responsibly report vulnerabilities to you. Without it, reports may go to spam or never be sent. A plain text file at the correct path is enough.

Apache server (classic hosting at most providers)

File: /.well-known/security.txt (create the folder if it doesn’t exist)

Contact: mailto:security@your-domain.com
Expires: 2027-12-31T23:59:59.000Z
Preferred-Languages: en, de
Canonical: https://your-domain.com/.well-known/security.txt

⚠ Replace "security@your-domain.com" with your actual security contact (or a generic info@). "Expires" must be a future date and should be renewed regularly. The file is plain .txt, not PHP.

WordPress Special for WordPress: where to add this

Option 1: via .htaccess (recommended — no theme editing)

File: security.txt file in /.well-known/ under your WordPress root

Contact: mailto:security@your-domain.com
Expires: 2027-12-31T23:59:59.000Z
Preferred-Languages: en, de
Canonical: https://your-domain.com/.well-known/security.txt

⚠ Via FTP/SFTP create a folder ".well-known" in the WordPress root (the leading dot matters — some FTP tools need "show hidden files" enabled), inside save the file security.txt with the content above. If WordPress redirects the URL: add to .htaccess: RewriteRule ^\.well-known/ - [L]

WordPress plugin: Plugin "security.txt" (search the plugin directory) lets you configure this in the WordPress backend without FTP.

✓ How to verify it works: Open https://your-domain.com/.well-known/security.txt in a browser — content must be visible (no 404).

100 External Reporting Endpoints

No external reporting endpoints detected.

70 Cookie Consent

Cookie consent system detected: cookieyes.com.

Consent system detected, but banner does not appear to be visible.

☛ Action needed: The consent system does not appear to be visible. Ensure the cookie banner is displayed on the first visit and is not hidden by CSS or JavaScript.
▸ How to fix this — step-by-step guide

Your consent system is wired up but the banner doesn’t appear visibly — perhaps hidden by another plugin or custom CSS. Risk: without a visible banner, no consent is given.

WordPress Special for WordPress: where to add this

WordPress plugin: Approach: 1) clear browser cache + cookies, use incognito. 2) In the consent plugin: check display conditions (e.g. "only EU visitors" — and you’re testing from a non-EU server). 3) F12 → Console for red errors from consent scripts. 4) Inspector → search DOM for "cookie", "consent" — element present but display:none? z-index too low? 5) Uninstall conflicting cookie-notice plugins.

✓ How to verify it works: Incognito tab, load page, wait 5 seconds — banner visible centered/bottom, doesn’t fully block main content, is clickable.

Trackers are loaded on page load — possibly BEFORE consent is given.

☛ Action needed: Trackers are loaded on page load, possibly before the visitor has consented. Ensure your consent system only activates trackers AFTER consent (opt-in, not opt-out).
▸ How to fix this — step-by-step guide

Your trackers are loaded BEFORE the user can consent ("pre-consent loading"). Common misconfiguration in cookie plugins — banner appears, but too late: the GA script is already running. Violates ePrivacy.

WordPress Special for WordPress: where to add this

WordPress plugin: Almost always caused by the theme or a tracking plugin that embeds the tracker code directly (e.g. "Google Analytics for WordPress" with auto-insert). Fix: 1) remove tracking code from the theme/plugin. 2) In the consent plugin (Complianz/Real Cookie Banner): register the tracker as a "service", paste the snippet there — the plugin will load it only after consent. 3) ALTERNATIVELY: plugin "PYS PixelYourSite" combined with consent gating. Do NOT rely on "GA anonymized before consent" — legally unsettled and risky.

✓ How to verify it works: Incognito → F12 → Network (clear all, start recording) → load page, do NOT click banner, wait 10 seconds → there must be NO requests to google-analytics.com, googletagmanager.com, facebook.com/tr, doubleclick.net etc.

100 Privacy Policy & Legal Notice

Privacy policy linked: "Privacy Policy" (https://sterkyachts.com/datenschutzerklaerung/).

Legal notice linked: "Imprint" (https://sterkyachts.com/imprint/).

Privacy policy page is accessible (HTTP 200).

⚙ Your ready-to-use security .htaccess

All missing security headers combined into one block. Append this block to the end of your .htaccess — done. 5 headers will be set.

⚠ Why this recommendation does NOT give a 100% score — and why that's how it is with WordPress

The Content-Security-Policy above deliberately includes 'unsafe-inline' for both style-src and script-src. This does NOT provide full XSS protection — it's a pragmatic trade-off, not a bug.

Why? A typical WordPress setup (theme + 5-15 plugins) emits 10-50 different inline <script> blocks into the HTML: jQuery init, slider init, cookie banner, tracking, GTM, web vitals, lazy-load, speculation rules and so on. A strict script-src 'self' blocks them all — the site becomes visually and functionally broken (blank slider, broken cookie banner, dead plugins).

Consequence for scoring: Sites running WordPress with plugins can score at most ~75-85 points in the CSP category in this app — the full 100% rating is only achievable when inline code is signed via nonce or hash (technically demanding, breaks on every theme/plugin update).

Paths to full XSS protection (in increasing complexity):

  • Plugin "WP Content Security Policy & Headers" — automatically adds nonces to inline scripts (medium effort, cleanest WP solution).
  • Hash-based CSP — whitelist every inline script via SHA-256 in the CSP (fragile, breaks on updates).
  • Externalize inline scripts — rebuild theme/plugins so no inline JS is emitted (huge effort, often impossible).

Anyone who doesn't take one of these paths lives with 'unsafe-inline' — like about 95% of all production WordPress sites on the web. The other CSP directives still protect: default-src 'self' blocks external resources, object-src 'none' bans Flash/Java, frame-ancestors 'self' prevents clickjacking, base-uri 'self' prevents base-tag hijacking. Not maximum protection, but realistic protection for WP reality.

⚠ Important on Hetzner-Konsoleh webhosting (managed / shared hosting)

On Hetzner-Konsoleh webhosting (and comparable shared hosts like All-Inkl, IONOS, Strato, 1blu, …), Apache throws a 500 Internal Server Error as soon as Header always edit Set-Cookie … expr=… appears in .htaccess. The Apache error log says:

Can't parse envclause/expression: syntax error, unexpected T_OP_STR_EQ, expecting $end

This is not a WebForensik bug and not a typo — the shared host has blocked the mod_headers expr= subset via AllowOverride limits (for security, because Header edit could also manipulate cookies of other tenants).

☛ For Hetzner-Konsoleh users: use the variant below marked with the red "Hetzner / Shared" badge. It consists of two files (.htaccess + wp-config.php) instead of one, but avoids the 500 error reliably. Cookie flags go into wp-config.php instead of .htaccess.

Apache Standard Apache (any host, without WordPress)

Append this block to the end of your .htaccess in the web root — done.

<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'; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; upgrade-insecure-requests"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), accelerometer=(), gyroscope=(), magnetometer=(), interest-cohort=(), browsing-topics=()"

    # Fehlende Cookie-Flags konditional ergänzen (nur wenn nicht schon gesetzt)
    Header always edit Set-Cookie "^(.*)$" "$1; HttpOnly" "expr=!(resp('Set-Cookie') -strmatch '*HttpOnly*')"
    Header always edit Set-Cookie "^(.*)$" "$1; SameSite=Lax" "expr=!(resp('Set-Cookie') -strmatch '*SameSite*')"
</IfModule>

Hetzner / Shared Hetzner-Konsoleh / Managed Hosting (two files)

This variant avoids the 500 Internal Server Error on Hetzner-Konsoleh and similar shared hosts (All-Inkl, IONOS, Strato, 1blu …): the .htaccess only contains the header directives (no "Header edit"), cookie flags move into wp-config.php. Two files to edit instead of one, but guaranteed to run.

1. File: .htaccess in the WordPress root
# BEGIN WebForensik Security
<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'; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; upgrade-insecure-requests"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), accelerometer=(), gyroscope=(), magnetometer=(), interest-cohort=(), browsing-topics=()"
</IfModule>
# END WebForensik Security
2. File: wp-config.php in the WordPress root

Insert ABOVE the line "/* That's all, stop editing! */". Back up wp-config.php first!

// === WebForensik: Cookie-Hardening (Hetzner-Konsoleh-tauglich) ===
// Bitte OBERHALB der Zeile "/* That's all, stop editing! */" einfügen.
// Wirkt auf PHP-Session- und WordPress-Login-Cookies.
// Plugin-eigene Cookies (z.B. WooCommerce, Cookie-Banner) müssen in den
// Plugin-Einstellungen separat auf "Secure" gestellt werden.
@ini_set('session.cookie_httponly', '1');
@ini_set('session.cookie_samesite', 'Lax');

WordPress WordPress: .htaccess in WP root

Insert this block ABOVE the "# BEGIN WordPress" line, otherwise WP overwrites it on permalink changes.

# BEGIN WebForensik Security
<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'; font-src 'self' https: data:; object-src 'none'; frame-ancestors 'self'; base-uri 'self'; upgrade-insecure-requests"
    Header always set X-Content-Type-Options "nosniff"
    Header always set Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), accelerometer=(), gyroscope=(), magnetometer=(), interest-cohort=(), browsing-topics=()"

    # Fehlende Cookie-Flags konditional ergänzen
    Header always edit Set-Cookie "^(.*)$" "$1; HttpOnly" "expr=!(resp('Set-Cookie') -strmatch '*HttpOnly*')"
    Header always edit Set-Cookie "^(.*)$" "$1; SameSite=Lax" "expr=!(resp('Set-Cookie') -strmatch '*SameSite*')"
</IfModule>
# END WebForensik Security

WordPress Alternative for WordPress: functions.php in child theme

If your host disallows .htaccess changes: append this PHP snippet to the end of your CHILD theme's functions.php. Back up first — NEVER edit the parent theme, it gets overwritten on updates.

add_action('send_headers', function () {
    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("X-Content-Type-Options: nosniff");
    header("Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=(), usb=(), accelerometer=(), gyroscope=(), magnetometer=(), interest-cohort=(), browsing-topics=()");
});

// Cookie-Flags für PHP-Session-Cookies — wirkt nur auf $_SESSION,
// NICHT auf von Plugins/Themes per setcookie() gesetzte Cookies.
// Für umfassende Cookie-Absicherung die .htaccess-Variante oben verwenden.
add_action('init', function () {
    if (headers_sent()) return;
    @ini_set('session.cookie_httponly', '1');
    @ini_set('session.cookie_samesite', 'Lax');
}, 1);
Dry-run — we re-load your site with the proposed headers and show which resources would be blocked. Takes about 30 seconds.
HTTP Response Headers
HeaderValue
cache-control max-age=0
content-encoding br
content-type text/html; charset=UTF-8
date Sat, 29 Aug 2026 23:23:22 GMT
expires Sat, 29 Aug 2026 23:23:22 GMT
link <https://sterkyachts.com/wp-json/>; rel="https://api.w.org/", <https://sterkyachts.com/wp-json/wp/v2/pages/459>; rel="alternate"; title="JSON"; type="application/json", <https://sterkyachts.com/>; rel=shortlink
referrer-policy strict-origin-when-cross-origin
server Apache
set-cookie uncode_privacy[consent_types]=%5B%5D; expires=Sun, 29 Aug 2027 23:23:24 GMT; Max-Age=31536000; path=/; secure; SameSite=Strict
strict-transport-security max-age=31536000; includeSubDomains
vary Accept-Encoding
x-content-type-options nosniff nosniff
x-frame-options sameorigin
x-ua-compatible IE=edge
x-xss-protection 1; mode=block

New Scan · Compare

Embed your score on your website

Show your WebForensik score publicly. The badge is a lightweight SVG, loads fast, and respects your visitors' privacy (no tracking).

WebForensik Score Badge

HTML code to embed (this specific scan)

<a href="https://webforensik.de/results.php?id=1227" target="_blank" rel="noopener">
  <img src="https://webforensik.de/badge.php?id=1227" alt="WebForensik Score" width="174" height="28">
</a>

Or dynamically — always shows the latest scan of this domain

<a href="https://webforensik.de/?url=https://sterkyachts.com" target="_blank" rel="noopener">
  <img src="https://webforensik.de/badge.php?domain=sterkyachts.com" alt="WebForensik Score" width="174" height="28">
</a>