Plugin Documentation

CreaCaptcha

Plugin Name: CreaCaptcha
Plugin URI: https://github.com/creationell-dev/creationell-captcha
Description: Datenschutzfreundlicher Proof-of-Work-Captcha, Firewall, Rate-Limiter, Under-Attack-Modus, E-Mail-Obfuskation und Bild-Code-Challenge — vollständig selbst-gehostet ohne externe Dienste.
Version: 1.0.1
Author: creationell® – die Werbeagentur marketing@creationell.de
Author URI: https://www.creationell.de/
Contributors: creationell-dev, JPKCom
Tags: captcha, spam, anti-spam, anti-bot, proof of work
Requires at least: 6.9
Tested up to: 7.0
Requires PHP: 8.3
Stable tag: 1.0.1
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: creationell-captcha
Domain Path: /languages

Schützt WordPress-Formulare und ganze Sites mit einem selbst-gehosteten Proof-of-Work-Captcha, Firewall, Rate-Limiter, Under-Attack-Interstitial, E-Mail-Obfuskation und optionaler Bild-Code-Challenge — ohne externe Dienste.


Description

CreaCaptcha ist ein vollständig selbst-gehostetes Schutz-Plugin für WordPress. Es kombiniert einen Proof-of-Work-Captcha auf Basis der MIT-Bibliothek altcha-org/altcha mit einer Firewall, einem per-IP-Rate-Limiter, einem Under-Attack-Modus, E-Mail-Obfuskation und einer optionalen Bild-Code-Challenge. Es gibt keine externen API-Aufrufe, kein Lizenz-Gate, keine SaaS-Anbindung und keine Telemetrie — alle Funktionen laufen lokal in WordPress.

Das Plugin schützt die vier WordPress-Kernformulare (Kommentare, Login, Registrierung, Passwort-Reset) sowie automatisch alle Formulare gängiger Form-Plugins (Contact Form 7, Forminator, WPForms, WooCommerce mit Checkout / My-Account-Login / Registrierung / Lost-Password). Eigene oder fremde Formulare lassen sich über den Shortcode [creationell_captcha], das Template-Tag creationell_captcha_widget() oder den generischen Interceptor (Pfad-Schutz) absichern.

Key Features


Installation

  1. Den Plugin-Ordner creationell-captcha nach /wp-content/plugins/ hochladen — entweder als ZIP über Plugins → Installieren → Plugin hochladen oder per FTP/SSH/wp plugin install.
  2. Unter Plugins → Installierte Plugins das Plugin CreaCaptcha aktivieren.
  3. Den neuen Menüpunkt CreaCaptcha im WordPress-Adminbereich öffnen.
  4. Unter CreaCaptcha → Einstellungen im Tab Captcha den Master-Toggle prüfen (Standard: aktiv) und den Tab Formulare durchgehen, um WordPress-Kernformulare und Form-Plugins zu aktivieren.
  5. Falls eigene Formular-Pfade abgesichert werden sollen: im Tab Captcha → Interceptor die Liste Geschützte Pfade pflegen.
  6. Empfohlen: einmal CreaCaptcha → Statistik öffnen, damit der Event-Log aktiviert werden kann (optional — die Aggregat-Statistik läuft auch ohne).

Anforderungen

Das Plugin prüft die Mindestversionen beim Aktivieren und zeigt im Admin-Bereich eine deutliche Hinweisleiste, wenn die Umgebung zu alt ist.

Updates

Updates kommen direkt aus dem GitHub-Repo. Der eingebaute Self-Hosted-Updater (includes/class-plugin-updater.php) prüft regelmäßig das Manifest, vergleicht Versionen und installiert das offiziell signierte ZIP samt SHA-256-Checksum.


Dokumentation

Ressource URL
Plugin-Dokumentation (Web) https://creationell-dev.github.io/creationell-captcha/
Update-Manifest (JSON) https://creationell-dev.github.io/creationell-captcha/plugin_creationell-captcha.json
API-Referenz (PHPDoc) https://creationell-dev.github.io/creationell-captcha/docs/api/

Das Plugin aktualisiert sich über das Update-Manifest selbst — es ist kein Eintrag im WordPress.org-Plugin-Verzeichnis erforderlich.


Konfiguration

Sämtliche Einstellungen liegen unter CreaCaptcha → Einstellungen und sind in sechs Tabs gegliedert. Alle Tabs teilen ein gemeinsames „Änderungen speichern”.

Tab: Captcha

Steuert die Proof-of-Work-Engine, das Widget-Aussehen und die Bild-Code-Challenge.

Section „Engine”

Option Beschreibung
Captcha aktivieren Master-Toggle. Aus = keinerlei PoW-Verifikation; alle anderen Module bleiben unbeeinflusst
Algorithmus pbkdf2 (Standard, kein PHP-Extension-Bedarf) oder argon2id (benötigt ext-sodium)
Schwierigkeit Anzahl PoW-Iterationen; Standard 50.000 (≈ 1 s auf Mittelklasse-Hardware)
Challenge-Gültigkeit Sekunden, in denen eine ausgestellte Challenge eingelöst werden kann (Replay-Schutz)

Section „WordPress-Kernformulare”

Vier unabhängige Toggles für Kommentare, Login, Registrierung und Passwort-Reset.

Section „Widget-Erscheinungsbild”

Option Beschreibung
Anzeigemodus standard / floating (schwebend über Submit-Button) / overlay / bar / invisible
Interaktionstyp checkbox / switch / native
Auto-Trigger none / onload / onsubmit
Theme Eines der acht ALTCHA-v3-Themes
ALTCHA-Branding ausblenden Versteckt Footer und Logo
Akzentfarbe Color-Picker; wird als CSS-Variable --creationell-captcha-primary ausgespielt
Eigenes CSS Wird inline nach dem Theme-CSS ausgegeben — beliebige Überschreibungen möglich
Übersetzungstexte überschreiben JSON-Map zum Überschreiben einzelner Widget-Strings
Floating-Anchor CSS-Selektor für den Anker des schwebenden Modus (leer = erster Submit-Button)
Floating-Position auto / top / bottom
Floating-Offset Abstand in Pixel (0–200)

Die Floating-Felder sind nur aktiv, wenn der Anzeigemodus auf schwebend steht — sonst werden sie ausgegraut.

Sprache: CreaCaptcha erkennt die Widget-Sprache automatisch aus der WordPress-Locale (get_locale()) und enqueued die passende von 20 vendorierten ALTCHA-Locale-Dateien (DE, EN, FR-FR/CA, ES-ES/419, IT, NL, PT-PT/BR, PL, CS, SK, DA, SV, FI, NB, HU, RO, EL). Eine nicht abgedeckte WP-Locale lässt das Widget auf seine eigene <html lang>/Browser-Sprach-Detection bzw. Englisch zurückfallen. Einzelne Begriffe lassen sich weiterhin über das Setting Übersetzungstexte überschreiben anpassen — Auto-Locale und Override greifen kombiniert, der Override gewinnt pro Schlüssel.

Section „Bild-Code-Challenge”

Option Beschreibung
Code-Challenge aktivieren Master-Toggle. Benötigt PHP-GD
Trigger: Immer Spielt die Code-Challenge bei jedem Captcha-Request aus (Test / pauschal erhöhte Sicherheit)
Trigger: Under-Attack-Modus Greift nur bei aktivem Under-Attack-Modus (außer auf dem Interstitial selbst — dort ist sie unterdrückt)
Trigger: Rate-Limit-Schwelle Greift, sobald die IP die Rate-Limit-Auslastung von 50–95 % überschreitet
Trigger: Watch-Liste IPs/CIDRs, die immer eine Code-Challenge bekommen
Code-Länge 4–8 Zeichen
Zeichensatz Nur Ziffern / alphanumerisch / alphanumerisch ohne Verwechsler (0-O, 1-I-l)
Token-Gültigkeit 60–900 Sekunden
Anzeige-Modus standard / overlay / bottomsheet (im Modal des Widgets)

Mehrere Trigger sind OR-verknüpft. Wenn die Code-Challenge eingerichtet, aber GD nicht verfügbar ist, deaktiviert sich das Feature stillschweigend und zeigt eine Warn-Notice.

Section „Interceptor”

Option Beschreibung
Geschützte Pfade URL-Pfade mit *-Wildcard. !-Präfix kehrt das Muster um (Ausschluss). Eine Zeile pro Muster
Geschützte Aktionen WordPress-Action-Namen für admin-post.php/admin-ajax.php ($_POST[action] / $_GET[action]). * und ! werden unterstützt. Überschreibt den is_admin-Bypass
Inject-Pfade Pfade, auf denen die Sicherheitsabfrage automatisch vor jedem </form> eingefügt wird (idempotent)
Bei eingeloggten Usern überspringen Bypass für angemeldete User mit edit_posts-Capability

Der Interceptor läuft als früher Request-Guard auf init und arbeitet fail-closed: Fehlt eine Verifikation, wird die Anfrage abgelehnt (HTTP 403, AJAX-Requests bekommen JSON-403).

Tab: Formulare

Vier Toggles für die WordPress-Kernformulare (siehe Captcha-Tab — werden hier als Komfort-Kopie gespiegelt) sowie sechs Toggles für die Form-Plugin-Integrationen.

Option Beschreibung
Contact Form 7 schützen Aktiv, wenn CF7 installiert ist. Auto-Inject vor Submit, Verify über wpcf7_spam
Forminator schützen Aktiv, wenn Forminator installiert ist. Auto-Inject + Verify über forminator_custom_form_submit_errors
WPForms schützen Aktiv, wenn WPForms installiert ist. Auto-Inject vor Submit, Verify über wpforms_process
WooCommerce schützen Master-Toggle. Aktiv, wenn WooCommerce installiert ist
→ Checkout schützen Auto-Inject auf woocommerce_review_order_before_submit, Verify auf woocommerce_after_checkout_validation
→ My-Account-Login schützen Auto-Inject auf woocommerce_login_form_end, Verify auf woocommerce_process_login_errors
→ Registrierung schützen Auto-Inject auf woocommerce_register_form, Verify auf woocommerce_registration_errors
→ Lost-Password schützen Render-only — Server-Verify läuft über das Kern-Modul protect_password_reset

CF7 bietet zusätzlich einen Form-Tag [creationell_captcha], mit dem die Position der Sicherheitsabfrage frei wählbar ist. Forminator/WPForms nutzen Auto-Inject standardmäßig vor dem Submit-Button — der Filter creationell_captcha_forminator_autoinject (bzw. creationell_captcha_wpforms_autoinject) erlaubt das Deaktivieren je Formular.

Hinweis: WooCommerce-Produktbewertungen sind WordPress-Kommentare und werden bereits durch WordPress-Kommentare schützen abgedeckt. Es gibt absichtlich keinen separaten Sub-Toggle.

Tab: Firewall

Vier Sections in dieser Reihenfolge: Proxy → Firewall → Bypass → Rate-Limit.

Section „Proxy & IP-Ermittlung”

Option Beschreibung
Proxy-Modus Aktivieren, wenn die Site hinter einem Reverse-Proxy / CDN liegt
Forwarded-Header X-Forwarded-For (Standard) / X-Real-IP / CF-Connecting-IP / True-Client-IP
Vertrauenswürdige Proxies IP-/CIDR-Liste, eine pro Zeile. Nur diese Hops dürfen den Forwarded-Header setzen
Cloudflare-IPs vertrauen Cloudflare-v4 + v6-Ranges automatisch laden
Cloudflare-Auto-Refresh Täglicher Cron-Refresh aus den offiziellen Cloudflare-Listen
Private Netze vertrauen RFC1918 + ULA als trusted Hops behandeln

Zusätzlich kann die wp-config-Konstante CREATIONELL_CAPTCHA_TRUSTED_PROXIES (Array von CIDRs) die Trust-Liste ergänzen.

Section „Firewall”

Option Beschreibung
Firewall aktivieren Master-Toggle
IP-Blockliste Eine pro Zeile, exakt oder CIDR (v4 + v6)
IP-Erlaubnisliste Global wirksam: umgeht Firewall, Rate-Limiter, Captcha und Under-Attack
User-Agent-Blockliste Wildcard-Muster (z. B. *bot*, *scanner*)

Section „Bypass”

Drei Eintragsarten, die jeweils Firewall, Rate-Limit, Captcha und Under-Attack-Modus umgehen.

Option Beschreibung
User-Agent-Erlaubnisliste Wildcard-Muster für Allow-listing (z. B. eigene Monitoring-Bots)
Cookie-Bypass Liste im Format name=wert, eine pro Zeile

Treffer auf Formular-Ebene erscheinen im Event-Log als verified-Eintrag mit passendem Grund (IP-Allowlist / UA-Bypass / Cookie-Bypass).

Section „Rate-Limit”

Option Beschreibung
Rate-Limit aktivieren Master-Toggle
Maximale Anfragen Fixed-Window-Limit pro IP, Standard 30
Zeitfenster Sekunden des Fensters, Standard 300
Wirkungsbereich core (nur Kernformulare) / forms (alle Formulare) / all (global, alle Anfragen)
edit_posts-Exemption Eingeloggte User mit Schreibrechten ausnehmen

Bei Überschreitung sendet der Plugin-Stack HTTP 429 mit Retry-After-Header.

Tab: Under-Attack

Option Beschreibung
Under-Attack aktivieren Master-Toggle. Bei an muss jeder anonyme Besucher eine PoW-Sicherheitsabfrage bestehen, bevor er die Site erreicht
Pass-Dauer Lebenszeit des HMAC-signierten Pass-Cookies in Sekunden
Eingeloggte Besucher ausnehmen Standard: aktiv

wp-admin, REST-API und Cron sind automatisch ausgenommen. Der Kill-Switch CREATIONELL_CAPTCHA_DISABLE (wp-config-Konstante) hebt den Modus global auf.

Section „Erscheinungsbild”

Optional — leere Felder verwenden die Standardwerte. Sichtbar, sobald der Under-Attack-Modus aktiv ist (sonst ausgegraut).

Option Beschreibung
Logo-URL Bild über der Überschrift, zentriert, Höhe ≤ 128 px. Default: kein Logo. Alt-Text = Website-Name. Über .crea-ua-logo im Eigenes-CSS-Feld feinjustierbar
Browser-Tab-Titel <title>-Tag der Interstitial-Seite. Default: „Sicherheitsprüfung”
Überschrift Große H1 mittig auf der Seite. Default: „Die Website wird gerade besonders geschützt”
Hinweistext Erläuternder Text unter der Überschrift. Default: „Ihr Browser wird kurz geprüft — einen Moment bitte.”
NoScript-Hinweis Nur sichtbar bei deaktiviertem JS. Default: „Für die Sicherheitsprüfung muss JavaScript aktiviert sein.”
Hintergrundfarbe Hex, z. B. #0a0a0a. Default: #f0f0f1
Textfarbe Hex, z. B. #ffffff. Default: #1d2327
Eigenes CSS Beliebige CSS-Regeln. Werden nach dem Default-Stylesheet ausgegeben und überschreiben alles. Verfügbare CSS-Variablen: --creationell-captcha-ua-bg, --creationell-captcha-ua-text. Verfügbare Selektoren: body, .crea-ua, .crea-ua h1, .crea-ua p, .crea-ua noscript, .crea-ua-logo

Tab: Analytics

Option Beschreibung
Event-Log aktivieren Schreibt jede Aktion in die Tabelle <prefix>creationell_captcha_events. Aggregierte Tageszähler laufen immer
Aufbewahrungsdauer Tage, nach denen Event-Log-Einträge gelöscht werden (Default 30)
IP-Adressen anonymisieren DSGVO-First: trunkiert IPv4 auf das letzte Oktett, IPv6 auf die letzten 80 Bit (Default: an)
Request-Body-Fingerprint speichern JSON-Map aus Feldnamen und Wertlängen — ohne die Werte selbst. Sensitive Feldnamen (password, secret, token, iban, api_key, cvv, …) werden zusätzlich gehasht
Erfolgreiche Verifikationen loggen Per-Event-Typ-Schalter, Default: an
Fehlgeschlagene Verifikationen loggen Default: an
Firewall-Blocks loggen Default: an
Rate-Limit-Blocks loggen Default: an
Under-Attack-Abfragen loggen Default: an
Bestandene Under-Attack-Prüfungen loggen Default: an
Ausgestellte Challenges loggen Default: aus (hochvolumig)

Tab: E-Mail-Schutz

Option Beschreibung
E-Mail-Adressen verschleiern Master-Toggle
Verschleierungsmodus content (Filter auf the_content / the_excerpt / widget_text / widget_block_content / comment_text) oder buffer (Vollseiten-Ausgabepuffer)

Im Buffer-Modus werden auch theme-hartkodierte mailto:-Links und Klartextadressen im Footer/Header erfasst. <head>, <script> und <style> bleiben unberührt. Feed-Requests und der Admin-Bereich umgehen die Obfuskation immer.


Shortcode & Template-Tag

[creationell_captcha]

Bettet das ALTCHA-Widget an beliebiger Stelle ein.

Attribut Werte Default
class CSS-Klassen

Bei aktiviertem CF7-Plugin ist [creationell_captcha] zusätzlich als CF7-Form-Tag verfügbar und kann direkt im CF7-Form-Editor platziert werden.

creationell_captcha_widget()

Template-Tag mit identischer Wirkung. Nützlich, wenn ein Shortcode nicht in Frage kommt (z. B. in Theme-PHP-Templates):

<form method="post">
    <!--Felder … -->
    <?php creationell_captcha_widget(); ?>
    <button type="submit">Senden</button>
</form>

Bei serverseitiger Verifikation immer auch den Pfad in Geschützte Pfade eintragen (siehe nächster Abschnitt) — sonst läuft eine manipulierte Submission ungeprüft durch.


Geschützte Pfade & Interceptor

Der Interceptor läuft auf init und ist die generische Schutzschicht für eigene Formulare. Konfiguriert wird er im Captcha-Tab.

Pfad-Muster

[creationell_captcha]-Shortcode und Template-Tag rendern nur das Widget. Die Server-Verifikation übernimmt der Interceptor anhand der Pfad-Liste.

/kontakt              ← exakt
/forms/*              ← Wildcard
!/forms/whitelisted   ← Ausschluss (mit ! kombinierbar)

!-Muster greifen vor positiven Mustern. So lässt sich /forms/* schützen, ein einzelner Sub-Pfad aber gezielt freistellen.

Action-Schutz

Für AJAX-/Admin-Post-Endpoints reicht die Pfad-Liste nicht — Requests gehen alle an admin-ajax.php oder admin-post.php. Die Liste Geschützte Aktionen wertet stattdessen das action-Feld (POST oder GET) aus:

my-custom-action
form/*
!form/internal

Action-Treffer überschreiben den is_admin()-Bypass — die Verifikation läuft auch dann, wenn der Aufruf aus dem Admin-Backend käme.

Auto-Inject auf Pfaden

Die Inject-Pfade-Liste fügt die Sicherheitsabfrage automatisch vor jedem </form> der passenden Seite ein, ohne dass das Theme oder ein Plugin angepasst werden muss. Idempotent: Formulare mit bereits eingebautem Widget bleiben unangetastet.

Bypass-Kette

Vor jeder Verifikation läuft die Bypass-Kette in dieser Reihenfolge:

  1. Kill-Switch CREATIONELL_CAPTCHA_DISABLE (wp-config-Konstante)
  2. Master-Toggle aus
  3. Request-Methode GET (Renderpfad — Verify nur auf POST/PUT/DELETE/PATCH)
  4. CLI / Cron / XML-RPC (nicht-Browser-Kontexte)
  5. is_admin()wird durch Action-Schutz überschrieben, sobald die action auf einer geschützten Liste steht
  6. REST-API-Eigen-Endpoints (Challenge-/Code-Routes)
  7. WordPress-Kernformulare (siehe Tab Formulare)
  8. edit_posts-Capability (eingeloggte User)
  9. Bei aktiviertem Toggle: alle eingeloggten User
  10. Globale Bypass-Quellen: IP-Allowlist, UA-Allowlist, Cookie-Bypass

Greift einer der Schritte, wird die Anfrage durchgelassen. Auf Formular-Ebene wird der erfolgreiche Bypass als verified-Event mit Grund-Annotation geloggt.

Entwickler-Filter

// Pfad/Action-Listen runtime ergänzen
add_filter( 'creationell_captcha_interceptor_paths', function ( array $paths ): array {
    $paths[] = '/api/mein-form/*';
    return $paths;
} );

add_filter( 'creationell_captcha_interceptor_actions', function ( array $actions ): array {
    $actions[] = 'mein_plugin_form';
    return $actions;
} );

// Eigenen Bypass anhängen (true = durchlassen)
add_filter( 'creationell_captcha_interceptor_bypass', function ( bool $bypass ): bool {
    return $bypass || ( defined( 'MY_DEV_BYPASS' ) && MY_DEV_BYPASS );
} );

// Custom geschützten Pfad zur Laufzeit registrieren
creationell_captcha_protect_path( '/checkout/step2' );

Bild-Code-Challenge

Die Bild-Code-Challenge ist eine zweite Stufe nach der PoW-Verifikation — kein Ersatz. Der Browser löst zuerst die PoW, der Server schickt dann optional ein PNG mit einem 4–8-stelligen Code, den der Nutzer abtippt.

Trigger-Bedingungen

Trigger Wirkung
Immer Pauschal aktiv bei jedem Captcha-Request
Under-Attack-Modus Greift nur, wenn UA-Modus aktiv ist (außer auf dem Interstitial — dort unterdrückt)
Rate-Limit-Schwelle Greift ab konfigurierter Auslastung (50–95 %) der IP-Bucket
Watch-Liste IPs/CIDRs, die immer eine Code-Challenge bekommen

Mehrere Trigger sind OR-verknüpft.

REST-Endpoints

Methode Route Zweck
GET /wp-json/creationell-captcha/v1/code-image?t=<token> PNG-Bild ausliefern (Cache-Header no-store)
POST /wp-json/creationell-captcha/v1/code-verify Code prüfen, signierte ALTCHA-Payload zurückgeben

Tokens sind opake 32-Hex-Server-Identifier; der erwartete Code lebt nur in einem WP-Transient und verlässt den Server nie. Die zurückgegebene Payload geht durch den bestehenden Verify-Pfad.

Rendering

PHP-GD mit vendorierter DejaVuSans-Bold-TTF (assets/fonts/captcha.ttf) und naiver Anti-OCR-Verzerrung (rotierte Zeichen, Querlinien, Rauschen). Fehlt die TTF, fällt der Renderer auf den GD-Bitmap-Font 5 zurück.

Fehlt GD selbst, deaktiviert sich das Feature stillschweigend und der Section-Renderer zeigt eine Warn-Notice.

Bypass-Schutz

Engine::verify() lehnt jeden Payload ab, in dem parameters.data.ccode clientseitig gesetzt ist — ein Angreifer kann den originalen Payload nicht recyclen, um die Code-Stufe zu überspringen.


Under-Attack-Modus

Der Under-Attack-Modus ist ein Notfall-Schalter für aktive Bot-Wellen. Bei aktivem Modus liefert WordPress für jeden anonymen Besucher ein HTTP-503-Interstitial mit einem invisiblen ALTCHA-Widget aus. Erst nach bestandener PoW-Sicherheitsabfrage setzt der Server ein HMAC-signiertes Pass-Cookie und lässt den Browser auf die eigentliche Seite.

Ablauf

  1. Anonymer Besucher öffnet beliebige Seite
  2. template_redirect fängt den Request ab, zeigt das Interstitial
  3. Browser löst die PoW-Sicherheitsabfrage im Hintergrund
  4. Server prüft, signiert das Pass-Cookie creationell_captcha_ua_pass (HMAC, gültig für die konfigurierte Pass-Dauer)
  5. Browser wird mit Location-Header auf die ursprüngliche URL umgeleitet
  6. Folgende Requests passieren den Modus, bis das Cookie abläuft

wp-admin, REST-API und Cron sind automatisch ausgenommen — die Site bleibt von innen administrierbar. Eingeloggte User sind per Default ebenfalls ausgenommen.

Kill-Switch

Definiert man define( 'CREATIONELL_CAPTCHA_DISABLE', true ); in wp-config.php, sind alle CreaCaptcha-Funktionen — inklusive Under-Attack — global deaktiviert. Praktisch für den Fall, dass die Site sich selbst aussperrt.


Statistik & Event-Log

Aggregat-Statistiken

Immer aktiv, datenschutzfreundlich, keine personenbezogenen Daten. Zwei Counter-Tabellen in wp_options:

Detail-Event-Log

Optional, schaltbar im Analytics-Tab. Schreibt in die eigene Tabelle <prefix>creationell_captcha_events mit 15 Spalten:

Spalte Inhalt
id Auto-Increment
event_type verified / failed / firewall / ratelimit / underattack / underattack_passed / challenge
created_at UTC-Zeitstempel
ip Client-IP (anonymisiert, wenn konfiguriert)
path Request-Pfad (REQUEST_URI ohne Query-Args — keine GET-Token im Log)
user_id WordPress-User-ID (falls eingeloggt)
user_agent UA-String
referrer HTTP-Referer
plugin Auslösendes Modul (cf7 / forminator / wpforms / wc-checkout / …)
action Action-Name (bei admin-post/admin-ajax)
form_id Plugin-spezifische Form-ID (z. B. WPForms-/Forminator-ID)
interceptor Interceptor-Pfadmuster, das gegriffen hat
reason Klartext-Grund (z. B. „IP-Allowlist”, „Replay-Schutz”, „PoW-Hash falsch”)
verification_data Eingereichter Captcha-Payload (gekürzt)
request_body Body-Fingerprint (JSON-Map Feldname → Wertlänge; sensitive Felder gehasht)

Statistik-Dashboard

CreaCaptcha → Statistik liefert drei Tabs:

Tab Inhalt
Übersicht Vier KPI-Kacheln für die letzten 24 h (Captcha gelöst, Abgewehrt = Firewall + Rate-Limit, Under-Attack Abfragen/bestanden, Captcha fehlgeschlagen) plus thematisch gruppierte Vergleichstabellen (Formular-Captchas / Abgewehrte Zugriffe / Under-Attack-Modus / Technisch) über vier Zeitfenster (24 h / 7 Tage / 30 Tage / 90 Tage)
Verlauf Zeitreihen-Plot je Ereignistyp über das gewählte Fenster
Ereignisse Filterbare Tabelle der Detail-Events, seitenweise (50/Seite), mit Detail-Modal je Eintrag und CSV-Export der gefilterten Menge

Die Filter-Leiste im Ereignisse-Tab kombiniert Freitextsuche (IP + Pfad), Ereignistyp-Filter und Von/Bis-Datumsbereich.

Performance

Seit v0.26.0:


E-Mail-Schutz (Obfuskation)

Zwei Modi

Modus Wirkung
Content the_content, the_excerpt, widget_text, widget_block_content, comment_text durchlaufen EmailObfuscator::process()
Buffer Ganzseiten-ob_start() auf template_redirectEmailObfuscator::process_page() verarbeitet den gesamten <body>

Verschleierung

mailto:-Hrefs werden zu href="#" data-cce="<hex>", Klartext-Adressen zu <span data-cce="<hex>">[E-Mail-Adresse — bitte JavaScript aktivieren]</span>. Der Hex-String ist eine XOR-Verschlüsselung der Adresse mit einem einmaligen Per-Page-Key.

Decoder

assets/js/email-obfuscation.js läuft auf DOMContentLoaded, bindet sich auf alle [data-cce]-Elemente und stellt die Original-Adresse im Browser wieder her.

Ausnahmen

<head>, <script>, <style> werden im Buffer-Modus übersprungen. Feed-Requests, wp-admin und der Kill-Switch umgehen die Obfuskation immer.


WP-CLI

Alle Plugin-Funktionen sind per wp creacaptcha automatisierbar. Eine Übersicht aller Befehle:

wp help creacaptcha

Betriebsbefehle

Befehl Zweck
wp creacaptcha status Übersicht: Kill-Switch, Module, Listengrößen, Proxy/CF-Trust, Code-Challenge, Watchlist, Form-Plugin-Toggles
wp creacaptcha info Diagnose: Plugin-Version, Lib-Version, Algorithmus, HMAC-Secrets vorhanden, Event-Log-Tabelle
wp creacaptcha stats [--window=24h\|7d\|30d\|90d\|all] Analytics-Kennzahlen für das gewählte Fenster
wp creacaptcha enable <feature> Modul/Feature aktivieren (siehe unten)
wp creacaptcha disable <feature> Modul/Feature deaktivieren
wp creacaptcha repair Selbstheilung: fehlende Secrets generieren, Event-Log-Tabelle anlegen, Default-Keys ergänzen
wp creacaptcha doctor Pflicht-Checks: Lib, Secrets, Tabelle, Cron, Konflikte, PHP-/GD-/Sodium-Versionen, Settings-Defaults
wp creacaptcha test-bypass [--ip=…] [--ua=…] [--cookie=…] Simuliert die Bypass-Auswertung; Exit 0 bei Bypass, Exit 1 sonst

Die <feature>-Schlüssel für enable/disable: captcha, comments, login, registration, password-reset, cf7, forminator, wpforms, woocommerce, wc-checkout, wc-login, wc-registration, wc-lost-password, firewall, ratelimit, under-attack, analytics, event-log, email-obfuscation, code-challenge.

Einstellungen

Befehl Zweck
wp creacaptcha settings list Alle Settings mit aktuellen Werten ausgeben
wp creacaptcha settings get <key> Einen Wert lesen
wp creacaptcha settings set <key> <value> Einen Wert setzen (bool / int / text / color / textblock / list / json)
wp creacaptcha settings export [--file=…] JSON-Export aller Settings
wp creacaptcha settings import --file=… JSON-Import
wp creacaptcha settings reset Voller Werksreset inklusive aller Listen
wp creacaptcha settings load-defaults Nur Konfigwerte zurücksetzen, Listen bleiben

Listen-Pflege

Jede Liste hat denselben Subcommand-Baukasten: add <eintrag>, remove <eintrag>, list, clear.

Befehl Liste
wp creacaptcha blocklist … IP-Blockliste
wp creacaptcha allowlist … IP-Erlaubnisliste (global wirksam)
wp creacaptcha ua-blocklist … User-Agent-Blockliste
wp creacaptcha paths … Geschützte Pfade
wp creacaptcha actions … Geschützte Aktionen
wp creacaptcha inject-paths … Inject-Pfade
wp creacaptcha trusted-proxies … Vertrauenswürdige Proxies
wp creacaptcha bypass-ua … UA-Bypass-Liste
wp creacaptcha bypass-cookies … Cookie-Bypass (name=wert)
wp creacaptcha watchlist … Code-Challenge-Watchlist

Cloudflare-Cache

Befehl Zweck
wp creacaptcha cloudflare refresh CF-v4/v6-Ranges aktualisieren
wp creacaptcha cloudflare status Status des CF-Caches (Anzahl Ranges, letzter Refresh, nächster Cron, Quelle)
wp creacaptcha cloudflare clear CF-Cache leeren

Der frühere Alias wp creacaptcha refresh-cloudflare-ips wurde mit v1.0.1 entfernt — bitte wp creacaptcha cloudflare refresh verwenden.

Event-Log

Befehl Zweck
wp creacaptcha log list [--fields=…] [--format=…] [--limit=…] Event-Log-Einträge auflisten; ohne --fields 4-Spalten-Default, mit --fields= alle 15 Spalten verfügbar
wp creacaptcha log show <id> Einen Event mit allen 15 Spalten anzeigen
wp creacaptcha log clear Event-Log komplett leeren
wp creacaptcha log prune Alte Einträge gemäß Aufbewahrungsdauer löschen

Die Werkzeuge-Seite im Backend (siehe nächster Abschnitt) bietet dieselben Export-/Import-/Reset-/Load-Defaults-Aktionen.


Werkzeuge

CreaCaptcha → Werkzeuge ist die Backend-Entsprechung der wichtigsten CLI-Aktionen. Fünf Karten:

Karte Aktion
Einstellungen exportieren Lädt alle Settings als JSON-Datei herunter
Einstellungen importieren JSON-Upload, Validierung gegen das Settings-Schema
Standardwerte laden Konfigwerte auf Default zurücksetzen; Listen bleiben unverändert
Auf Werkseinstellungen zurücksetzen Voller Werksreset inklusive aller Listen (mit Warn-Box und Confirm-Dialog)
Cloudflare-IP-Cache Status + Buttons „Jetzt aktualisieren” und „Cache leeren”

Developer Reference

Die wichtigsten Konstanten, Hooks und Filter im Überblick:

Konstanten (wp-config.php überschreibbar)

Konstante Default Zweck
CREATIONELL_CAPTCHA_VERSION '1.0.1' Plugin-Version
CREATIONELL_CAPTCHA_FILE __FILE__ Plugin-Hauptdatei
CREATIONELL_CAPTCHA_PLUGIN_PATH plugin_dir_path(...) Plugin-Ordner
CREATIONELL_CAPTCHA_PLUGIN_URL plugin_dir_url(...) Plugin-URL
CREATIONELL_CAPTCHA_MIN_PHP '8.3' PHP-Mindestversion
CREATIONELL_CAPTCHA_MIN_WP '6.9' WordPress-Mindestversion
CREATIONELL_CAPTCHA_DEBUG WP_DEBUG Aktiviert Debug-Logging
CREATIONELL_CAPTCHA_DISABLE ungesetzt Wenn true: globaler Kill-Switch — alle Module aus
CREATIONELL_CAPTCHA_HMAC_SECRET autogeneriert Override für das Challenge-HMAC-Secret
CREATIONELL_CAPTCHA_HMAC_KEY_SECRET autogeneriert Override für das HMAC-Key-Secret
CREATIONELL_CAPTCHA_TRUSTED_PROXIES ungesetzt Array von zusätzlich vertrauenswürdigen Proxy-CIDRs

Hooks (Actions)

Hook Wann
creationell_captcha_loaded Nach dem Plugin-Bootstrap, alle Module geladen
creationell_captcha_deactivated Beim Deaktivieren des Plugins
creationell_captcha_event Bei jedem Aggregat-Event-Bump ($type, $context)
creationell_captcha_firewall_blocked Firewall hat eine IP/UA geblockt
creationell_captcha_ratelimit_exceeded Rate-Limit für eine IP überschritten
creationell_captcha_interceptor_blocked Interceptor hat eine Submission abgewiesen
creationell_captcha_interceptor_passed Interceptor hat eine Submission durchgelassen

Hooks (Filter)

Filter Zweck
creationell_captcha_interceptor_paths Pfad-Liste runtime modifizieren
creationell_captcha_interceptor_actions Action-Liste runtime modifizieren
creationell_captcha_interceptor_bypass Eigene Bypass-Logik anhängen (true = durchlassen)
creationell_captcha_interceptor_guarded Modifiziert die Liste der „immer geschützten” Anker-Pfade
creationell_captcha_firewall_block Eigene Block-Logik anhängen (true = blocken)
creationell_captcha_forminator_autoinject Forminator-Autoinject je Formular toggeln (bool, int $form_id)
creationell_captcha_wpforms_autoinject WPForms-Autoinject je Formular toggeln
creationell_captcha_wc_checkout_autoinject WooCommerce-Checkout-Autoinject toggeln
creationell_captcha_wc_login_autoinject WooCommerce-Login-Autoinject toggeln
creationell_captcha_wc_registration_autoinject WooCommerce-Registrierungs-Autoinject toggeln
creationell_captcha_wc_lost_password_autoinject WooCommerce-Lost-Password-Autoinject toggeln
creationell_captcha_request_body_sensitive_patterns Sensitive Feldnamen-Patterns für die Body-Fingerprint-Maskierung erweitern
creationell_captcha_doctor_checks Eigene Doctor-Checks zur WP-CLI-Diagnose ergänzen

REST-Endpoints

Alle Routes unter dem Namespace creationell-captcha/v1:

Methode Route Zweck
GET /challenge Neue PoW-Challenge ausstellen
GET /code-image?t=<token> PNG der Bild-Code-Challenge ausliefern
POST /code-verify Eingegebenen Code prüfen, signierte ALTCHA-Payload zurückgeben

Wichtige PHP-Helper

// Schutz für eigene Pfade registrieren
creationell_captcha_protect_path( '/checkout/step2' );

// Widget rendern (Template-Tag-Variante)
creationell_captcha_widget();

// Settings memoiziert laden
$settings = creationell_captcha_get_settings();

// Bypass-Auswertung manuell aufrufen
$bypass_active = creationell_captcha_request_bypassed();

Architektur

Das Plugin folgt einer require-basierten Classic-WordPress-Architektur. Die Klassen liegen unter Creationell\Captcha\… in includes/class-*.php; prozedurale Bootstrap-Helper in includes/<modul>.php. Die geprefixte ALTCHA-Library landet via Strauss in lib/Creationell\Captcha\Vendor\…. Es gibt keinen Composer-Autoloader im Release-ZIP — alle Requires sind explizit.


FAQ

Sendet CreaCaptcha Daten an externe Dienste?

Nein. Das Plugin arbeitet vollständig selbst-gehostet — es gibt keine API-Aufrufe, kein Telemetrie-Backend, keinen Lizenz-Check und keine SaaS-Anbindung. Die einzige optionale externe Anfrage ist der Cloudflare-IP-Refresh aus den offiziellen Cloudflare-Listen, der ausschließlich auf expliziten Toggle läuft.

Welcher Captcha-Algorithmus läuft im Hintergrund?

CreaCaptcha nutzt die offizielle MIT-Bibliothek altcha-org/altcha. Standardmäßig kommt PBKDF2/SHA-256 zum Einsatz (kein PHP-Extension-Bedarf). Optional lässt sich auf Argon2id umschalten, dafür wird ext-sodium benötigt.

Funktioniert das Plugin ohne JavaScript?

Nein — die Proof-of-Work-Sicherheitsabfrage muss vom Browser gelöst werden. Ohne JavaScript erscheint das Widget als Hinweistext, und die Server-Verifikation wird die Submission abweisen. Für ein vollständig JS-loses Schutz-Setup ist die Firewall+Rate-Limit-Schicht der richtige Ansatz.

Welche Form-Plugins werden unterstützt?

Mit dedizierten Integrationen: Contact Form 7, Forminator, WPForms (Lite und Pro), WooCommerce (Checkout, My-Account-Login, Registrierung, Lost-Password). Beliebige andere Formulare lassen sich über [creationell_captcha] und die Geschützte-Pfade-Liste absichern. Für AJAX-/Admin-Post-Endpoints gibt es zusätzlich die Geschützte-Aktionen-Liste.

Wie schütze ich ein eigenes Formular auf einer beliebigen Seite?

Drei Schritte: (1) Den Shortcode [creationell_captcha] oder das Template-Tag creationell_captcha_widget() ins Formular einbauen. (2) Den Pfad der Seite oder den Submit-Pfad in Captcha → Interceptor → Geschützte Pfade eintragen. (3) Bei AJAX-/Admin-Post-Submissions zusätzlich den action-Namen in Geschützte Aktionen. Der Interceptor verifiziert dann automatisch jede Submission.

Was passiert mit ungelösten Bot-Submissions?

Der Server lehnt die Submission ab. Bei klassischen Formularen erhält der Browser die normale Validierungs-Fehlermeldung des jeweiligen Plugins. Bei AJAX wird 403 Forbidden mit JSON-Body geliefert. Der Bot bekommt keine Hilfe in Form von Hinweisen, woran das Captcha gescheitert ist — der reason landet nur im Event-Log.

Wie kann ich mich selbst aussperren — und wie komme ich wieder rein?

Wer durch eigene Firewall-Regeln, Rate-Limit oder einen kaputten Under-Attack-Modus ausgesperrt wird, kann zu jeder Zeit per wp-config.php den Kill-Switch setzen:

define( 'CREATIONELL_CAPTCHA_DISABLE', true );

Sofort sind alle Module aus — Firewall, Rate-Limit, Captcha, Under-Attack, Interceptor. Anschließend lassen sich die problematischen Einstellungen im Backend korrigieren. Ohne SSH/FTP-Zugriff bleibt der direkte Datenbank-Eingriff: wp option update creationell_captcha_settings … oder per wp creacaptcha settings load-defaults.

Funktioniert das Plugin hinter Cloudflare oder einem Reverse-Proxy?

Ja. Im Tab Firewall unter „Proxy & IP-Ermittlung” den Proxy-Modus aktivieren und den passenden Forwarded-Header wählen. Für Cloudflare zusätzlich „Cloudflare-IPs vertrauen” und optional den Auto-Refresh einschalten — die offiziellen Cloudflare-v4/v6-Ranges werden dann täglich neu geladen. Ohne Trust-Konfiguration wird der Header ignoriert, damit Angreifer nicht beliebige IPs spoofen können.

Wie viel Performance kostet das Plugin?

Sehr wenig. Die Captcha-Berechnung läuft im Browser, nicht auf dem Server. Die Firewall-Auswertung ist eine reine IP-/Pattern-Prüfung (keine externen Lookups). Analytics-Counter werden seit v0.26.0 pro Request gesammelt und in einem einzigen DB-Roundtrip auf shutdown geschrieben. Das Event-Log nutzt seit derselben Version einen Composite-Index, der typgefilterte Dashboard-Queries ohne Filesort beantwortet.

Wie DSGVO-konform ist das Plugin?

Out-of-the-box ist die IP-Anonymisierung im Event-Log aktiv (IPv4 auf letztes Oktett, IPv6 auf letzte 80 Bit trunkiert). Aggregat-Zähler enthalten keinerlei personenbezogene Daten. Im Event-Log werden keine Query-String-Werte (GET-Token, Magic-Links, API-Keys) gespeichert — der Pfad wird vor dem Schreiben auf den reinen Pfadanteil reduziert. Request-Body-Fingerprints enthalten nur Feldnamen und Wertlängen; sensitive Feldnamen werden zusätzlich gehasht.

Wie deaktiviere ich das Plugin sauber?

Über Plugins → Installierte Plugins deaktivieren reicht für den Betrieb. Wer auch die Daten loswerden will, kann das Plugin anschließend löschen — der uninstall.php-Cleanup entfernt alle Options, Transients (inklusive _cc_*-Caches und _git_update_*-Locks) sowie die Event-Tabelle.

Funktioniert das Plugin mit Multisite?

Ja, allerdings pro Site einzeln aktivierbar. Es gibt aktuell keine Network-Activate-Logik mit zentralen Settings — jede Site hat ihre eigene Konfiguration. Network-weite Aktivierung ist möglich, hat aber denselben Effekt wie eine Aktivierung pro Site.

Kann ich CreaCaptcha parallel zu einem anderen Captcha-Plugin betreiben?

Technisch ja — die Code-Pfade kollidieren nicht. wp creacaptcha doctor prüft auf bekannte Captcha-Plugins (reCAPTCHA, hCaptcha, Turnstile, ALTCHA-WordPress) und warnt, weil zwei Captcha-Layer auf demselben Formular für den Nutzer unzumutbar werden. Empfehlung: nur eines aktiv lassen.

Wo finde ich Logs, wenn etwas nicht funktioniert?

Mit define( 'CREATIONELL_CAPTCHA_DEBUG', true ); (oder global WP_DEBUG) schreibt das Plugin Debug-Hinweise nach wp-content/debug.log. Zusätzlich liefert wp creacaptcha doctor einen kompletten Diagnose-Lauf, und das Event-Log zeigt alle abgewiesenen Requests samt Grund.

Wie aktualisiere ich auf eine neue Version?

Drei Wege: (1) Der eingebaute Self-Hosted-Updater zeigt neue Versionen automatisch im Plugins-Bildschirm — wie ein normales wp.org-Update. (2) ZIP von der GitHub-Release-Seite herunterladen und manuell über Plugins → Installieren → Plugin hochladen einspielen. (3) Per WP-CLI: wp plugin install --activate <release-url> mit der URL aus den GitHub-Releases.


Changelog

1.0.1

1.0.0

Erstes stabiles Release. CreaCaptcha ist ein vollständig selbst-gehosteter Spamschutz für WordPress — ohne externe Dienste, ohne Tracking, ohne Lizenz-Gate.

Funktionsumfang:

Neu in diesem Release:

Das Update von v0.30.x erfolgt ohne Datenbank-Migration und ohne Breaking Changes — bestehende Einstellungen, Listen und Statistiken bleiben unverändert erhalten.

0.30.1

Wartungsrelease: Release-Infrastruktur umgestellt — keine funktionalen Änderungen am Plugin.

0.30.0

Under-Attack Pass-Event & Statistik-Übersicht — das Backend unterscheidet jetzt, ob ein Besucher die Under-Attack-Prüfung bestanden hat oder hängen blieb, und die Statistik-Übersicht erklärt ihre Zahlen selbst.

0.29.0

Logo im Under-Attack-Interstitial — die 503-Seite kann jetzt ein Logo oberhalb der Überschrift anzeigen.

0.28.0

Feature-Modul 21 — Under-Attack-Customization: Wording und Erscheinungsbild der Interstitial-Seite sind ab sofort über das Backend konfigurierbar, ohne Plugin-Code zu patchen.

Sites nach Update sehen ohne Aktion keine visuelle Veränderung — alle sieben Felder sind initial leer und das Template fällt damit auf die bisherigen Default-Werte zurück.

0.27.2

Metadaten-Anpassung an WordPress 7.0 / 6.9.

Keine funktionalen Code-Änderungen.

0.27.1

CSS-Fix: Widget-Abstand zum darauffolgenden Element im Standard-Modus.

0.27.0

Feature-Modul 20 — Widget-i18n: Die Sicherheitsabfrage erscheint endlich in der korrekten Sprache, ohne dass der Admin etwas konfigurieren muss.

0.26.2

Bugfix-Release: schließt eine Verify-Regression aus v0.22.0 / Commit c322b96, die seit der Korrektur des configuration-JSON-Attributs das ALTCHA-Widget dazu brachte, bei jedem gelösten PoW die /code-verify-Route aufzurufen — und dort mit 400 invalid_request abgewiesen zu werden, weil im Plain-Mode (ohne Code-Challenge im /challenge-Response) das code-Feld im Body fehlt.

Die ALTCHA-verifyUrl-Mechanik schaltet das Widget pauschal in den Server-Verify-Modus — auch ohne Code-Challenge im Response. Beide Fixes zusammen: saubere Standard-Konfiguration ohne Roundtrip und Defense-in-Depth, falls code_challenge_enabled aktiv ist aber kein Trigger greift.

0.26.1

UX-Polish-Release: schließt die drei nicht-essenziellen UX-Befunde aus dem Qualitäts-Audit (Modul 18) ab.

0.26.0

Performance-Release: drei aufgeschobene Optimierungen aus dem Qualitäts-Audit (Modul 18) — Settings-Memoize, Analytics-Bump-Memoize und ein Composite-Index auf der Events-Tabelle.

0.25.0

Qualitäts-Audit-Release: Security-Härtung des Updaters, Event-Log-Privacy, Body-Fingerprint-Maskierung sowie umfassende UX-Hilfetexte und Konsistenz- Fixes im Backend.

Sicherheit: - Updater (includes/class-plugin-updater.php): Checksum-Vergleich nutzt jetzt hash_equals() (timing-safe). Slug-Heuristik in verify_download_checksum() durch Exakt-Match gegen manifest.download_url ergänzt — verhindert Bypass über ein manipuliertes Manifest mit Slug-freier Download-URL. Manifest-Fetch über wp_safe_remote_get() (Defense-in-Depth gegen SSRF). - Event-Log: Analytics::current_path() reduziert REQUEST_URI auf den Pfad-Anteil. GET-Token, Magic-Login-Links und API-Keys landen damit nicht mehr im persistenten Event-Log. - Request-Body-Fingerprint: Feldnamen mit sensitiven Substrings (password, secret, token, iban, api_key, cvv, …) werden vor dem JSON-Encode durch [masked:<sha256-8>] ersetzt, um Custom-Form- Schemata nicht im Event-Log preiszugeben. Neuer Filter creationell_captcha_request_body_sensitive_patterns für projektspezifische Erweiterungen. - Analytics::clear_events() nutzt jetzt wpdb::prepare( 'DELETE FROM %i', $table ) statt Roh-Interpolation (WP-6.2+-konform).

Backend-UX: - DSGVO-First: Default analytics_anonymize_ip von false auf true. Neue Installs anonymisieren IPs out-of-the-box; bestehende Installs behalten ihre Wahl. - Rate-Limit-Default ratelimit_max von 10 auf 30 (besser für Login-Scope — ein Nutzer mit Tippfehler-Marathon läuft nicht mehr ins 5-Minuten-Lockout). - Tab-Reihenfolge: „Analytics” steht nun vor „E-Mail-Schutz” (näher an den Schutzmodulen). - Firewall-Tab: Sektionen sortiert auf Proxy → Firewall → Bypass → Rate-Limit (Bypass folgt der Firewall, deren Regeln sie überstimmt). - widget_code_challenge_display in die Code-Challenge-Section verschoben und an code_challenge_enabled gekoppelt. - 21 fehlende oder schwache Settings-Hilfetexte ergänzt (algorithm, difficulty, challenge_expiry, alle widget_*-Customization-Felder, Core-Forms-Toggles, alle Form-Plugin-Toggles, Rate-Limit-Felder, firewall_proxy_header, firewall_ip_block/ua_block, underattack_enabled, analytics_event_log, bypass_cookies, firewall_cloudflare_auto_refresh, interceptor_skip_logged_in). Section-Renderer für Engine, Code-Challenge und Firewall mit erklärenden Texten ergänzt (PoW-Konzept, OR-Logik der Trigger, CIDR-Notation). - interceptor_actions-Hilfetext nennt jetzt die edit_posts-Exemption (Autoren/Editoren weiterhin ausgenommen). - Tools-Page: Reset-Karte + Confirm-Dialog erwähnen jetzt explizit auch Interceptor- und Bypass-Listen.

WP-CLI: - wp creacaptcha status zeigt drei neue Zeilen: Proxy-Modus, CF-Trust / CF-Auto-Refresh und IP-Anonymisierung. - wp creacaptcha doctor prüft ext-sodium, wenn der Algorithmus auf Argon2id steht — Error mit Fix-Vorschlag, wenn die Extension fehlt.

Code-Qualität: - defined( constant_name: 'ABSPATH' )defined( 'ABSPATH' ) in 48 Dateien. Named-Args auf PHP-Builtins sind nicht stabilitäts-garantiert und werden von Static-Analyzern als Anti-Pattern geflaggt. - PHPDoc: über 20 eigene do_action/apply_filters-Hooks vollständig dokumentiert (creationell_captcha_event, Interceptor-Filter-Familie, WPForms-/WC-Autoinject-Filter), Repeat-Dispatches mit WordPress-Core- style „This action is documented in …“-Verweisen. - REST-Callback-PHPDocs in includes/rest.php und includes/code-challenge.php ergänzt (@param/@return mit Status-Code-Tabelle).

Tooling & Doku: - phpdoc.xml Version-Drift 0.1.00.25.0. - Plugin-Header-Description nennt jetzt Firewall, Rate-Limit, Under-Attack, E-Mail-Obfuskation und Code-Challenge (vorher: nur PoW-Spamschutz). - README-Description um WPForms-, WooCommerce-Integrationen und Code-Challenge-Absatz erweitert. - uninstall.php: Transient-Cleanup vom _used_-Prefix auf das gesamte creationell_captcha_-Prefix erweitert; entfernt jetzt auch _cc_*, _rl_* und _git_update_*-Caches/Locks.

Behebt: - Inkorrekt formulierter IPv6-Anonymisierungs-Hilfetext (includes/settings.php): stimmt jetzt mit der Code-Logik überein (erste 48 Bit bleiben, letzte 80 Bit auf 0). - Tippfehler „mehrmietigen” → „mehrmandantigen (Shared Hosting)“. - Tested up to: 6.96.8 (WordPress 6.9 ist Stand 2026-05-28 noch nicht released).

0.24.0

0.23.0

0.22.0

0.21.0

0.20.0

0.19.0

0.18.0

0.17.0

0.16.0

0.15.0

0.14.0

0.13.0

0.12.0

0.11.0

0.10.0

0.9.0

0.8.0

0.7.0

0.6.0

0.5.0

0.4.0

0.3.0

0.2.0

0.1.0