=== Bastora Security Audit ===
Contributors: mathiasva
Tags: security, audit, brute force, hardening, login
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 0.2.3
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: bastora-security-audit

Ehrlicher 52-Punkte-Sicherheits-Check für WordPress. Prüft, härtet die wichtigsten Stellen automatisch und tritt zur Seite, wenn ein anderes Sicherheits-Plugin schon zuständig ist.

== Description ==

**Bastora** ist ein ehrlicher WordPress-Sicherheits-Check. Statt tausend Schalter ohne Erklärung prüft Bastora Deine Installation gegen einen festen Katalog aus **52 Sicherheitspunkten** und zeigt Dir das Ergebnis als Klartext-Ampel direkt in Deinem Dashboard.

Bastora unterscheidet sich von anderen Sicherheits-Plugins in drei Punkten:

1. **Ehrliche Außensicht.** Bastora prüft Deine Seite so, wie ein Bot sie sieht: Versionslecks im HTML, offene Verzeichnis-Listen, fehlende Security-Header, sichtbare Endpoints. Die meisten anderen Plugins prüfen nur ihre eigene Konfiguration.
2. **Konflikt-erkennende Auto-Härtung.** Härtungen sind ab Werk aktiv. Bastora prüft, ob ein anderes Sicherheits-Plugin (Wordfence, Solid Security, AIOS, Limit Login Attempts und andere) denselben Punkt schon übernimmt, und tritt elegant zur Seite, statt einen Konflikt zu bauen.
3. **Null Konfiguration.** Installieren, aktivieren, einmal „Sicherheitsprüfung starten" klicken, fertig. Bastora richtet sich selbst ein.

= Was Bastora prüft =

* **Zugangssicherheit (11 Punkte):** HTTPS-Login, Brute-Force-Schutz, Salt-Keys, geteilte Konten, Login-Verhalten
* **Systemabsicherung (10 Punkte):** Datei-Editor, Verzeichnis-Listings, wp-config-Sperre, Debug-Modus, Dateirechte, Revisionen
* **Informationsschutz (10 Punkte):** Generator-Tag, RSD-Link, WLW-Manifest, XML-RPC, REST-API-Benutzer, Pingbacks, X-Powered-By
* **Security-Header (5 Punkte):** X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, HSTS
* **Pingbacks (2 Punkte):** ausgehende und eingehende Pingbacks
* **Auto-Updates (7 Punkte):** nächtlicher Schutz, Minor-/Major-Auto-Updates, Plugin-/Theme-Auto-Updates, verwaiste Erweiterungen
* **Monitoring und Betrieb (7 Punkte):** Transients, Revisions-Cleanup, Captcha, WordPress-Version, PHP-Version, /uploads/-PHP-Sperre, Sicherheits-Plugin-Status

= Was Bastora härtet (wenn kein Konflikt erkannt wird) =

* WordPress-Version aus HTML und RSS-Feed entfernt
* RSD-Link und WLW-Manifest entfernt
* Login-Shake-Effekt deaktiviert
* Login-Fehlermeldung verallgemeinert (verrät nicht mehr, welche Benutzer existieren)
* Author-Seiten umgeleitet (verhindert das Aufzählen von Benutzernamen)
* XML-RPC abgeschaltet (außer ein konkurrierendes Plugin übernimmt das schon)
* Pingback-XML-RPC-Methoden gesperrt
* REST-API-Endpoint /users für nicht eingeloggte Anfragen gesperrt
* Application Passwords deaktiviert
* **Login-Honeypot:** verstecktes Formularfeld in der Login-Maske, das Bots ausfüllen und sich damit als Bot zu erkennen geben
* **Brute-Force-Schutz mit IP-Sperre:** 5 Fehlversuche → 30 Minuten Sperre. Bei wiederholten Sperren: Eskalation auf 4 Stunden, dann 24 Stunden. Zähler setzt sich nach erfolgreichem Login zurück. IPv6 wird auf dem /64-Präfix gesperrt. Cloudflare- und Reverse-Proxy-IP-Erkennung ist eingebaut.

= Konflikt-erkennend =

Wenn eines der folgenden Plugins schon läuft, erkennt Bastora das und deaktiviert nur die überlappenden Bereiche:

* Wordfence Security
* Sucuri Security
* Solid Security (früher iThemes)
* All-In-One WP Security & Firewall
* MalCare Security
* WP Cerber Security
* Limit Login Attempts Reloaded
* Disable XML-RPC
* Disable Application Passwords
* Really Simple SSL
* HTTP Headers

Im Dashboard siehst Du pro Härtung im Klartext, warum sie aktiv oder inaktiv ist.

= Was Bastora bewusst **nicht** macht =

* **Kein erzwungenes TOTP.** Solopreneure sperren sich regelmäßig mit Authenticator-Apps aus. Bastora setzt stattdessen auf Brute-Force-Schutz, Rate-Limit und Anomalie-Erkennung.
* **Kein Verstecken der Login-URL.** Eine umbenannte Login-URL macht den Passwort-Reset-Link in der Mail kaputt, sobald das Plugin deaktiviert wird. Rate-Limit plus Honeypot ist die saubere Lösung.
* **Keine Cloud-Verbindung ohne Zustimmung.** Alle externen Verbindungen (auch Versions-Abgleich gegen wordpress.org) sind ab Werk aus. Sie schalten sich erst ein, wenn Du sie im Welcome-Wizard oder in den Einstellungen ausdrücklich freigibst.

= Optionale anonyme Statistik (geplant, in dieser Version noch nicht aktiv) =

Eine künftige Plugin-Version wird optionale anonyme Sicherheits-Telemetrie an bastora.de anbieten. **In dieser Plugin-Version wird keine Telemetrie gesendet. Der Opt-in-Schalter speichert nur Deine Zustimmung für ein späteres Release.** Wenn die Versand-Pipeline später live geht, würden ausschließlich folgende anonymisierten technischen Werte übertragen:

* WordPress-, PHP- und MySQL-Versions-Strings
* Locale (zum Beispiel de_DE)
* Liste der installierten Plugin-Slugs (ohne Versionen)
* Audit-Ergebnisse (welche der 52 Punkte sind rot, gelb, grün)
* Eine zufällige anonyme Site-ID (UUID), lokal beim ersten Plugin-Start erzeugt

Was **nie** übertragen würde: Domain, URL, IP-Adressen, E-Mail-Adressen, Benutzernamen, Beitragsinhalte, Dateiinhalte.

== Installation ==

1. Installiere das Plugin aus dem WordPress-Plugin-Verzeichnis oder lade den ZIP-Ordner nach `/wp-content/plugins/`.
2. Aktiviere das Plugin im Menü „Plugins".
3. Öffne das neue Menü „Bastora" und klicke einmal auf „Sicherheitsprüfung starten".

Mehr ist nicht zu tun. Bastora richtet sich selbst ein.

== Frequently Asked Questions ==

= Brauche ich technisches Wissen, um Bastora zu nutzen? =

Nein. Bastora braucht keine Konfiguration. Installieren, aktivieren, scannen — fertig.

= Funktioniert Bastora neben Wordfence/Sucuri/Solid Security? =

Ja. Bastora erkennt diese Plugins beim Aktivieren und tritt in den überlappenden Bereichen zur Seite. Das Dashboard zeigt Dir, welche Härtungen wegen eines Konflikts inaktiv sind.

= Überträgt das Plugin Daten von meiner Seite? =

Ab Werk nichts. Die einzigen externen Verbindungen, die diese Version macht, sind opt-in-Versions-Abgleiche gegen api.wordpress.org (nur der Slug, keine Domain, keine Nutzerdaten). Die anonyme Statistik-Pipeline an bastora.de ist **in dieser Version nicht aktiv** — der Opt-in-Schalter in den Einstellungen speichert nur Deine Zustimmung für ein späteres Release.

= Wie nehme ich die Statistik-Zustimmung wieder zurück? =

Bastora → Einstellungen → Haken bei „Zustimmung vormerken" raus → speichern. Da in dieser Plugin-Version keine Daten gesendet werden, löscht das Zurücknehmen einfach die gespeicherte Zustimmung.

= Wo werden die Daten gespeichert? =

Auf deutschen Servern. Bastora arbeitet ausschließlich mit einem deutschen Hoster.

= Was passiert, wenn ich Bastora deinstalliere? =

Bei normaler Deaktivierung bleiben die Bastora-Einstellungen erhalten. Wenn Du das Plugin per „Löschen" entfernst, werden alle Einstellungen, Audit-Berichte und Site-IDs gelöscht. Härtungen werden automatisch zurückgerollt.

= Wann kommt der gedruckte Bericht? =

In einer der nächsten Plugin-Versionen. Ab 0.1.0 steht der Bericht als HTML direkt im Dashboard zur Verfügung.

== Screenshots ==

1. Der erste Scan startet — Bastora prüft 52 Sicherheitspunkte in etwa 20 Sekunden.
2. Ergebnis des ersten Scans: Score plus klare Aufteilung in bestanden, Hinweise und offene Punkte.
3. Bastora schaltet die Härtungen scharf — wo ein anderes Sicherheits-Plugin schon zuständig ist, lässt Bastora die Hand davon.
4. Das Dashboard nach Aktivierung: aktueller Sicherheits-Score und jeder Prüfpunkt mit Klartext-Erklärung.

== Changelog ==

= 0.2.3 =
* Plugin-Header-Beschreibung und readme.txt auf Deutsch übersetzt — Plugin-Listing-Seite auf wordpress.org ist damit für die deutsche Zielgruppe lesbar.
* Screenshots-Sektion wieder aufgenommen, vier Bilder ergänzt (Scan-Start, Scan-Ergebnis, Härtung scharf schalten, Dashboard).
* Plugin-Assets (Icon, Banner) im WP.org-Plugin-Verzeichnis aktualisiert.

= 0.2.2 =
* Plugin Review Team feedback: all paid-tier markers removed. The dead `premium_only_ids()` list, the dashboard upsell block, the report's premium section and the wizard's paid-service step are gone. The wizard now has three steps (opt-in → scan → activation). No more references to a paid tier inside the plugin code, the admin UI or the printable report.
* Conflict-check marker constant renamed from `BASTORA_PRO_SECURITY_LAYER_VERSION` to `BASTORA_MANAGED_LAYER_VERSION` (neutral naming, no Pro/Premium connotation).
* readme.txt: paid-service section removed.
* Telemetry consistency: the opt-in toggle in the welcome wizard and in settings now clearly states that the bastora.de sender pipeline is **not active in this plugin version**, the toggle only records consent for a future release. readme.txt Privacy section aligned to match.
* Scanner: `check_monitor_03` (captcha plugins detection) and `check_monitor_07` (security plugin detection) now read `active_plugins` directly from the option instead of loading `wp-admin/includes/plugin.php`. One less `require_once` of a core file.

= 0.2.1 =
* Plugin-Name auf „Bastora Security Audit" gekürzt (deckungsgleich mit dem Slug, kein Sonderzeichen im Header).
* `Donate link` aus `readme.txt` entfernt (verwies auf die Produktseite, keine echte Spenden-URL).
* `== Screenshots ==`-Sektion temporär aus `readme.txt` entfernt. Wird wieder aufgenommen, sobald die Bilder im WordPress-Assets-Verzeichnis liegen.
* MU-Plugin-Konflikt-Check liest jetzt zusätzlich eine Marker-Konstante. Quellcode-Kommentar produktneutral formuliert.

= 0.2.0 =
* Neuer Onboarding-Wizard mit schrittweiser Aktivierung der Härtungen plus Vorher-Nachher-Vergleich.
* Härtungen werden erst nach dem ersten Klick auf „Jetzt absichern" im Wizard scharf geschaltet. Davor läuft das Plugin im reinen Mess-Modus.
* Bisheriges Welcome-Banner mit Zwei-Häkchen-Block durch den Wizard ersetzt.

= 0.1.6 =
* Plugin Review Team-Feedback: `Author URI` aus dem Plugin-Header entfernt, da identisch mit `Plugin URI`. Nur noch eine URI im Header.

= 0.1.5 =
* Welcome-Banner und Bericht: Inline-`onclick`-Handler durch enqueued JavaScript ersetzt (`assets/admin.js`, `assets/js/report.js`).
* Inline-`style`-Attribute im Welcome-Banner und im Login-Honeypot in Utility-Klassen (`assets/admin.css`, `assets/css/login-honeypot.css`) ausgelagert.
* Menü-Icon nutzt jetzt das WordPress-Standard-Dashicon `dashicons-shield` statt eines `base64`-Inline-SVG.
* `$_POST`-Werte im Welcome- und Settings-Handler durchlaufen jetzt zusätzlich `wp_unslash` + `sanitize_text_field`, auch wenn sie nur als Bool genutzt werden.
* Plugin-Header um `Author URI` und `Domain Path` ergänzt.

= 0.1.4 =
* Konflikt-Check liest die aktiven Plugins direkt aus der `active_plugins`-Option und lädt `wp-admin/includes/plugin.php` nicht mehr unnötig. Vermeidet einen `require_once` ohne unmittelbar folgenden Funktions-Aufruf.

= 0.1.3 =
* Konflikt-Check erkennt jetzt auch MU-Plugin-basierte Sicherheits-Schichten (Marker-Konstanten/Funktionen). Plugin zieht sich automatisch in den überlappenden Bereichen zurück (XML-RPC, REST users, Security Headers, Brute-Force, Honeypot, Application Passwords), damit Filter nicht doppelt feuern und der Bastora-Honeypot auf Whitelabel-Sites unsichtbar bleibt.

= 0.1.2 =
* External version-check calls to api.wordpress.org are now opt-in by default. Welcome banner uses two separate checkboxes (external calls + anonymous statistics), each independently toggleable in the settings page.
* Update-related audit points (update.06, update.07, monitor.04) report "not checkable" when the user has not enabled external calls.
* Privacy section in readme.txt expanded with the exact endpoint URLs and opt-in mechanics.

= 0.1.1 =
* Text domain aligned with plugin slug (bastora-security-audit)
* Printable report CSS moved from inline style to enqueued stylesheet
* Contributors list corrected to plugin author account

= 0.1.0 =
* Initial release
* Scanner covering all 52 audit points
* 11 conflict-aware filter hardenings
* Conflict detection for 13 known security plugins
* Admin dashboard with status card, findings list and hardening overview

== Upgrade Notice ==

= 0.2.3 =
Plugin-Beschreibung und Plugin-Listing-Seite auf wordpress.org auf Deutsch übersetzt. Screenshots-Sektion mit vier Bildern wieder aufgenommen.

= 0.2.2 =
Plugin Review Team feedback: all paid-tier markers removed from code, UI and report. Wizard is now three steps. Marker constant for the conflict-check renamed to a neutral name.

= 0.2.1 =
Vorbereitung für die Einreichung im WordPress-Plugin-Verzeichnis: Plugin-Name, Donate-Link und Screenshots-Sektion bereinigt.

= 0.2.0 =
Neuer Onboarding-Wizard mit vier Schritten plus echtem Vorher-Nachher-Vergleich. Härtungen werden erst nach Klick scharf geschaltet, das Plugin misst vorher nur.

= 0.1.6 =
Plugin Review Team-Feedback: doppelte URI im Header entfernt.

= 0.1.5 =
Plugin Review Team-Vorbereitung: Inline-`onclick`/`style`/`base64`-SVG durchgängig in enqueued Assets bzw. Dashicons ausgelagert; POST-Sanitization gehärtet.

= 0.1.4 =
Plugin Review Team feedback: unnötiges `require_once` von `wp-admin/includes/plugin.php` im Konflikt-Check entfernt.

= 0.1.3 =
Konflikt-Check erkennt jetzt auch MU-Plugin-basierte Sicherheits-Schichten — verhindert Filter-Doppelung und Whitelabel-Brüche.

= 0.1.2 =
External calls to api.wordpress.org are now opt-in by default — review your settings after upgrade if you rely on the update-related audit points.

= 0.1.1 =
Plugin Review Team feedback: text domain alignment, CSS enqueue, contributors fix.

= 0.1.0 =
Initial release.

== Privacy ==

= Externe Verbindungen =

Bastora kontaktiert externe Server in zwei klar getrennten Fällen. **Beide sind opt-in. Ab Werk macht das Plugin keine externen Verbindungen.**

**1. Versions-Abgleich gegen api.wordpress.org (opt-in)**

Wenn Du im Welcome-Wizard oder in den Einstellungen „Versions-Abgleich erlauben" aktivierst, fragt Bastora bei einem manuellen Scan die api.wordpress.org nach:

* der aktuellen WordPress-Core-Version: `https://api.wordpress.org/core/version-check/1.7/`
* pro erkennbarem Plugin nach dessen letztem Update-Datum: `https://api.wordpress.org/plugins/info/1.0/<slug>.json`
* pro erkennbarem Theme nach dessen letztem Update-Datum: `https://api.wordpress.org/themes/info/1.2/?action=theme_information&request[slug]=<slug>`

Das ist dieselbe API, die WordPress selbst für seine eigenen Update-Checks nutzt. Übertragen wird nur der Slug pro Plugin oder Theme. Keine Domain, keine Nutzerdaten, keine Besucher-IP. Die Abfragen laufen nur bei manuellem Klick auf den Scan-Button, nie automatisch im Hintergrund. Antworten werden 24 Stunden zwischengespeichert.

Wenn Du diesen Punkt nicht aktivierst, werden die update-relevanten Audit-Punkte als „nicht prüfbar" markiert und es geht keine Anfrage raus.

**2. Anonyme Telemetrie an bastora.de (geplant, in dieser Version nicht aktiv)**

Eine künftige Plugin-Version soll optionale anonymisierte Telemetrie an bastora.de anbieten. **In dieser Plugin-Version ist diese Pipeline nicht implementiert — kein `wp_remote_post`, kein Payload, keine Übertragung an bastora.de findet im Code statt.** Der Opt-in-Schalter in den Einstellungen speichert nur Deine Zustimmung für ein späteres Release.

Wenn die Versand-Pipeline in einem späteren Release live geht, würden die folgenden anonymisierten Werte übertragen:

* WordPress-, PHP- und MySQL-Versions-Strings
* Locale-Code (zum Beispiel de_DE)
* Liste der installierten Plugin-Slugs (ohne Versionen)
* Theme-Slug des aktiven Themes
* Audit-Ergebnisse: pro Sicherheitspunkt der Status (passed / warning / failed)
* Eine zufällige anonyme Site-ID (UUID), lokal beim ersten Plugin-Start erzeugt

Was **nie** übertragen würde: Domain, URL, IP-Adressen, E-Mail-Adressen, Benutzernamen, Beitragsinhalte, Dateiinhalte, Datenbankinhalte.

= Datenschutzhinweis =

Vollständige Datenschutzerklärung: https://bastora.de/datenschutz.php
Verantwortliche Stelle laut Impressum: https://bastora.de/impressum.php
