CMS ADMINS Security Check Report: Sicherheitscheck für WordPress

Beschreibung

Security Check Report sieht sich 61 Aspekte einer WordPress-Installation an und macht aus den Befunden einen benoteten Bericht. Es ändert keine Einstellung, keine Datei und kein Konto. Es speichert seine eigenen Ergebnisse in der Datenbank und schreibt eine temporäre Datei im Uploads-Verzeichnis, die in derselben Anfrage wieder gelöscht wird.

Der Bericht beginnt mit den fünf Dingen, die sich zuerst lohnen, nicht mit einer Tabelle aus 61 Zeilen. Jeder Befund sagt, was gefunden wurde, warum das wichtig ist und was zu tun ist.

Ab dem zweiten Durchlauf öffnet die Seite nicht mehr mit dem Start-Button, sondern mit einer Übersicht: die Note, ein Satz dazu, wo die Website beim ersten Durchlauf stand und wo sie heute steht, ein Balken je aufgezeichnetem Durchlauf, fünf Aufgaben zum Abarbeiten, was noch offen ist und was wann behoben wurde.

Jede Aufgabe hat einen Button, der genau diese Prüfung erneut ausführt und innerhalb von Sekunden antwortet. Eine Korrektur ist damit bestätigt, während du noch auf der Seite bist, und nicht erst beim nächsten vollständigen Durchgang. Eine einzelne erneute Prüfung schreibt keinen Punkt in den Verlauf, und die Seite sagt das auch, denn eine aus mehreren Durchgängen zusammengesetzte Note ist keine, die in einem gemessen wurde.

Was du bekommst

  • Eine gewichtete Note von A bis F, bei der eine nicht bestandene kritische Prüfung nicht hinter fünfzig bestandenen kleinen verschwindet
  • Eine Checkliste mit jeweils fünf Aufgaben, hergeleitet aus Dringlichkeit und Bewertung statt geraten, bei der die nächste nachrückt, sobald du eine erledigt hast
  • Ein Button pro Aufgabe, der genau diese eine Prüfung erneut ausführt, damit du das Ergebnis einer Korrektur in Sekunden siehst
  • Ein Verlauf der letzten 24 Durchläufe, bei dem der allererste dauerhaft erhalten bleibt, damit der Ausgangspunkt sichtbar bleibt
  • Ein Vergleich mit dem vorigen Durchlauf: neu nicht bestanden, behoben, geändert
  • Stummschalten, das sich merkt, was ein Befund gesagt hat, damit ein akzeptierter Befund sofort wieder auftaucht, sobald er sich tatsächlich ändert
  • „Nicht ermittelt“ als eigenes Ergebnis, damit eine blockierte Anfrage nie als Problem gemeldet wird und die Note nie verändert
  • Eine Zahl am Menüeintrag, ein Widget auf der Dashboard-Startseite und eine Erinnerung, sobald der letzte Durchlauf mehr als 30 Tage her ist
  • Export als Text, JSON und CSV
  • Ein WP-CLI-Befehl, der dieselbe Note liefert wie die Oberfläche
  • Eine Erklärung zu jeder Prüfung, durchsuchbar, direkt auf der Seite

Was geprüft wird

Core, Plugins und Themes. WordPress-Version, PHP-Version gegen die veröffentlichten End-of-Life-Daten, automatische Core-Updates, Unversehrtheit der Core-Dateien gegen die offiziellen Prüfsummen, Dateien in den Core-Verzeichnissen, die nicht zu WordPress gehören, ausstehende Plugin- und Theme-Updates, ungenutzte Plugins und Themes, Plugins, die verwaist wirken, Plugins mit geschlossenem Eintrag, Plugins mit gewechseltem Autor, Must-use-Plugins und Drop-ins, weitere WordPress-Installationen neben dieser.

Konfiguration. Debug-Modus, öffentlich erreichbares Debug-Log, der Theme- und Plugin-Editor, Installation von Code über das Dashboard, Authentifizierungsschlüssel und Salts, Tabellenpräfix, Rechte des Datenbankbenutzers, ob der Zeitplaner tatsächlich läuft, Größe der automatisch geladenen Optionen, eingeschleuste Inhalte in der Options-Tabelle, Backups, Anmeldeschutz, Passwortrichtlinie.

Dateien und Berechtigungen. Dateirechte von wp-config.php, dem Uploads-Verzeichnis und den Core-Verzeichnissen, für alle beschreibbare Pfade, ausführbare Dateien zwischen den Medien, ob der Server PHP aus dem Uploads-Verzeichnis ausführt, Konfigurations- und Backup-Dateien, die der Server ausliefert, lesbare .git-, .svn- und .hg-Ordner, Datenbank-Dumps im Webroot, Überbleibsel unterbrochener Updates, Verzeichnisauflistung.

Konten und Zugriff. Erratbare Passwörter, vorhersehbare Administrator-Namen, wie viele Konten Administratorrechte haben und welche davon inaktiv geworden sind, Rollen unterhalb von Administrator mit Berechtigungen, die sie nicht haben sollten, offene Registrierung und die Rolle, die sie vergibt, Zwei-Faktor-Abdeckung pro Administrator, die Übersicht der Anwendungspasswörter samt letzter Nutzung und Herkunft.

Netzwerk und Transport. HTTPS und die Weiterleitung von http, Ablauf des TLS-Zertifikats und ausgehandeltes Protokoll, die Sicherheits-Header und ihre Qualität statt nur ihres Vorhandenseins, Cookie-Attribute, CORS, sichtbare Softwareversionen, veraltete Discovery-Tags, XML-RPC, Benutzeraufzählung, REST-Routen, die Schreibzugriffe ohne Berechtigungsprüfung annehmen, und ob sich die Client-Adresse über Forwarded-Header fälschen lässt.

Transparenz und Offenlegung. Ob KI-generierte Inhalte eine maschinenlesbare Kennzeichnung tragen und ob Besucher erfahren, wenn sie mit einem KI-System sprechen. Artikel 50 des EU AI Act verlangt das seit dem 2. August 2026. Die Offenlegungs-Plugins aus dem Plugin-Verzeichnis werden an ihrem Ordner und an den Einstellungen erkannt, die sie schreiben, damit ein Plugin, das installiert und nie eingerichtet wurde, nicht für eine Lösung gehalten wird. Eine Website, die nichts aus KI veröffentlicht, hat auch nichts zu kennzeichnen. Diese Prüfung warnt deshalb nur und bewegt die Note kaum.

Was es nicht ist

  • Keine Firewall. Es blockiert nichts und fängt keine Anfragen ab.
  • Kein Malware-Scanner. Es vergleicht Core-Dateien mit den offiziellen Prüfsummen und sucht nach eingeschleusten Inhalten in der Options-Tabelle, aber es jagt nicht nach Signaturen im Plugin- oder Theme-Code, und es entfernt nichts.
  • Keine Datenbank für Sicherheitslücken. Es meldet, dass ein Plugin veraltet, verwaist oder aus dem Verzeichnis entfernt ist; einzelne CVEs schlägt es nicht nach.
  • Kein Auto-Fixer. Jeder Befund kommt mit einer Anleitung, und du setzt sie um.
  • Kein Monitoring. Nichts läuft im Hintergrund, nichts ist eingeplant, es wird keine Mail verschickt. Eine Prüfung läuft, wenn du sie startest.

Daten und Verbindungen

Das Plugin spricht mit api.wordpress.org und mit deiner eigenen Website. Sonst nichts, und es gibt keine Telemetrie. Welche Endpunkte genau und was lokal gespeichert wird, steht in den Fragen weiter unten.

Wer es entwickelt

CMS ADMINS wartet, hostet und sichert WordPress- und Drupal-Websites von München aus. Dieses Plugin ist die Checkliste, die wir selbst abarbeiten, als Paket. Es ist kostenlos, es bleibt kostenlos, und es funktioniert genauso, ob du je mit uns sprichst oder nicht.

Screenshots

Installation

  1. Installiere das Plugin aus dem WordPress-Plugin-Verzeichnis oder lade den Ordner nach /wp-content/plugins/security-check-report hoch.
  2. Aktiviere es auf der Seite „Plugins“.
  3. Öffne „Security Check“ im Admin-Menü und starte einen Durchlauf.

Das Plugin braucht PHP 7.4 oder neuer und WordPress 7.0 oder neuer. Zum Ausführen der Prüfungen ist die Berechtigung manage_options nötig, auf einer normalen Website also ein Administrator.

FAQ

Ändert das Plugin etwas an meiner Website?

Nein. Jede Prüfung liest den Zustand und berichtet darüber.

Es gibt eine Ausnahme, und die ist gewollt. Um herauszufinden, ob dein Server eine PHP-Datei ausführen würde, die jemand ins Uploads-Verzeichnis legt, muss das Plugin es ausprobieren. Es schreibt eine Datei mit zufälligem Namen, ruft sie einmal per HTTP ab und löscht sie in derselben Anfrage wieder. Ein Shutdown-Handler entfernt die Datei auch dann, wenn PHP zwischendurch abbricht, und was ein früherer unterbrochener Durchlauf hinterlassen hat, wird vor dem nächsten Start aufgeräumt.

Sendet es Daten irgendwohin?

Nur an api.wordpress.org, an dieselben Endpunkte, die WordPress selbst für seine Update-Prüfungen nutzt:

  • https://api.wordpress.org/core/version-check/1.7/, gelesen aus den Update-Informationen, die WordPress schon vorhält, um die aktuelle WordPress-Version zu erfahren. Das Plugin fragt diesen Endpunkt nie selbst ab.
  • https://api.wordpress.org/plugins/update-check/1.1/ und https://api.wordpress.org/themes/update-check/1.1/ für ausstehende Updates, ebenfalls aus dem gelesen, was WordPress ohnehin schon vorhält
  • https://api.wordpress.org/plugins/info/1.2/, um zu sehen, ob der Eintrag eines Plugins noch offen ist und wann es zuletzt veröffentlicht wurde. Das ist der einzige Endpunkt, den das Plugin direkt abfragt statt über plugins_api(), denn ein geschlossener Eintrag wird als HTTP 404 ausgeliefert, und plugins_api() macht daraus einen Fehler. Damit geht genau das Kennzeichen verloren, das die Prüfung braucht. Die Antwort wird zwölf Stunden zwischengespeichert.
  • https://api.wordpress.org/core/checksums/1.0/ für die offiziellen Hashes der Core-Dateien

Datenschutzerklärung und Nutzungsbedingungen von WordPress.org.

Die übrigen Anfragen gehen an deine eigene Website, weil sich einige Prüfungen nur von außen beantworten lassen: ob eine Datei ausgeliefert wird, ob ein Header gesendet wird, ob ein Verzeichnis aufgelistet wird. Es gibt keine Telemetrie und keine Rückmeldung an den Plugin-Autor.

Eine dieser Anfragen an deine eigene Website benutzt die WordPress-HTTP-API nicht. Die Zertifikatsprüfung öffnet eine einfache TLS-Verbindung zum eigenen Hostnamen auf Port 443, um das Ablaufdatum zu lesen, weil die HTTP-API das Zertifikat nicht herausgibt. Das Ziel ist weiterhin deine eigene Website und nichts verlässt sie, aber WP_HTTP_BLOCK_EXTERNAL und die Filter pre_http_request und http_request_args greifen bei dieser einen Verbindung nicht.

Was speichert das Plugin?

Eine Handvoll Optionen in deiner Datenbank, die alle entfernt werden, wenn du das Plugin löschst:

  • den letzten Durchlauf und den davor, damit der Bericht zeigen kann, was sich geändert hat
  • den Verlauf der letzten 24 Durchläufe, jeder mit Datum, Note, Risikowert und einem einzelnen Zeichen pro Prüfung, das ist die Grundlage der Fortschrittsanzeige
  • welche Befunde du stummgeschaltet hast, zusammen mit einem Fingerprint dessen, was sie gemeldet haben
  • eine Baseline aus dem ersten Durchlauf mit Plugin-Autoren, Rollendefinitionen und der Liste der Must-use-Plugins und Drop-ins, damit spätere Durchläufe Änderungen erkennen
  • die Zahl der nicht bestandenen Prüfungen aus dem letzten Durchlauf, damit die Zahl am Menüeintrag nicht auf jeder Admin-Seite einen ganzen Durchlauf laden muss
  • den Zeitpunkt, zu dem du dem Durchlauf zugestimmt hast, damit du nicht bei jedem Besuch erneut gefragt wirst

Zwei Einträge landen in den Benutzer-Metadaten. Der eine ist ein Anmeldezeitstempel pro Konto, weil WordPress selbst keine Anmeldehistorie führt und die Administrator-Prüfung sonst nichts über inaktive Konten sagen könnte. Der andere hält fest, dass jemand den Erinnerungshinweis abgeschaltet hat, und das ist eine Entscheidung pro Person, nicht pro Website. Beide werden bei der Deinstallation gelöscht.

Ist das ein Malware-Scanner oder eine Firewall?

Weder noch. Es findet Schwachstellen in der Konfiguration und unnötig Offengelegtes, und genau darüber werden die meisten WordPress-Websites tatsächlich übernommen. Es blockiert keinen Traffic und es säubert keine infizierte Website.

Es bemerkt einiges, was auf eine Kompromittierung hindeutet: Core-Dateien, die vom offiziellen Release abweichen, ausführbare Dateien im Uploads-Verzeichnis, Must-use-Plugins oder Drop-ins, die aus dem Nichts aufgetaucht sind, Rollen, die Administrator-Berechtigungen bekommen haben, eingeschleuste Skripte in der Options-Tabelle. Wenn davon etwas auftaucht, nimm es als Ausgangspunkt für eine Untersuchung, nicht als Urteil.

Was bedeuten die Noten?

  • A, sehr gut: nichts Wesentliches offen
  • B, gut: kleinere Verbesserungen möglich
  • C, mittelmäßig: einiges, das sich zu beheben lohnt
  • D, schlecht: erhebliche Schwachstellen, bald handeln
  • F, kritisch: sofort handeln

Wie wird die Note berechnet?

Jede Prüfung hat eine Dringlichkeit, und die Dringlichkeit bestimmt, wie schwer ein Befund wiegt:

  • Kritisch, Gewicht 3,0: Authentifizierung, Codeausführung, offengelegte Geheimnisse
  • Hoch, Gewicht 2,0: Updates, Transportsicherheit, wichtige Konfiguration
  • Mittel, Gewicht 1,5: Header, Dateirechte, Richtlinien
  • Niedrig, Gewicht 1,0: Fingerprinting und gute Praxis

Der Wert ist das gewichtete Risiko als Prozentsatz des schlechtestmöglichen Ergebnisses. Prüfungen, die nicht ermittelt werden konnten, bleiben auf beiden Seiten dieser Rechnung außen vor, eine blockierte ausgehende Anfrage bewegt die Note also in keine Richtung. Eine nicht bestandene kritische Prüfung zieht das Ergebnis mindestens auf ein D herunter, damit ein ernstes Problem nicht im Durchschnitt untergeht. Ein paar Prüfungen sind rein informativ und haben gar kein Gewicht.

Warum sagt eine Prüfung „Nicht ermittelt“?

Weil sie keine Antwort bekommen hat, meist wegen einer blockierten ausgehenden Anfrage oder einer Datei, die sie nicht lesen darf. Das wird bewusst nicht als Befund gewertet. Ein nicht erreichbarer Endpunkt sagt nichts über deine Website aus, und ihn als Problem zu melden würde dir nur beibringen, den Bericht zu ignorieren.

Ein Befund trifft auf meine Installation nicht zu. Was nun?

Schalte ihn stumm. Das Plugin blendet den Befund aus und speichert einen Fingerprint dessen, was gemeldet wurde. Sobald sich der Inhalt ändert, etwa weil eine weitere Datei betroffen ist, taucht er von selbst wieder auf.

Das ist der Unterschied zwischen einem bekannten Zustand, den du akzeptierst, und einem, den du nicht mehr siehst. Deshalb gibt es standardmäßig das Stummschalten und kein dauerhaftes Ausblenden.

Wie oft sollte ich es laufen lassen?

Monatlich ist ein vernünftiger Richtwert, dazu ein Durchlauf nach jeder größeren Änderung: einer Migration, einem neuen Plugin, einem Serverumzug. Sobald der letzte vollständige Durchlauf mehr als 30 Tage her ist, weist ein Hinweis im Dashboard darauf hin. Diesen Hinweis kannst du dauerhaft abschalten, und er ist die einzige Erinnerung, die das Plugin überhaupt verschickt.

Was passiert, wenn ich eine einzelne Aufgabe erneut prüfe?

Diese eine Prüfung läuft erneut, ihr Ergebnis ersetzt das alte im gespeicherten Durchlauf, und die Note wird aus dem berechnet, was dann gespeichert ist. Das dauert ein paar Sekunden, du kannst also etwas beheben und das Ergebnis sehen, ohne 61 Prüfungen abzuwarten.

Der Verlauf bleibt unangetastet, denn eine Prüfung ist kein Durchlauf. Solange der gespeicherte Durchlauf Ergebnisse aus mehr als einem Durchgang enthält, nennt die Seite, wie viele Prüfungen einzeln wiederholt wurden und wann der letzte vollständige Durchgang war. Die Note wird also nie als etwas dargestellt, was sie nicht ist.

Wie viel Verlauf wird aufbewahrt?

Die letzten 24 Durchläufe. Kommt ein 25. dazu, fällt der zweitälteste Punkt weg statt des ältesten, damit der erste Durchlauf erhalten bleibt und der Satz darüber, wo die Website angefangen hat, weiter stimmt. Ein Punkt enthält das Datum, die Note, den Risikowert und ein Zeichen pro Prüfung, für den gesamten Verlauf sind das ein paar Kilobyte.

Wenn du schon eine frühere Version benutzt hast, werden die zwei dort gespeicherten Durchläufe zu den ersten beiden Punkten, damit die Anzeige nach dem Update nicht leer ist.

Kann ich es über die Kommandozeile starten?

Ja, und es kommt dieselbe Note heraus wie in der Oberfläche, weil die Bewertung so oder so in PHP stattfindet.

wp security-check run for a table, `wp security-check run --format=json` for the full result, `wp security-check run --failed-only` for just what needs attention.

Ein Durchlauf über die Kommandozeile schreibt nichts mit und speichert nichts. Verlauf, Checkliste und die Zahl am Menüeintrag richten sich nach den Durchläufen, die du in der Oberfläche startest.

Funktioniert es auf Multisite?

Ja. Es läuft pro Website: Wer auf einer Website manage_options hat, kann es dort starten und sieht die Konten, Plugins, Themes und Optionen dieser Website.

Einiges funktioniert in einem Netzwerk anders, und die Prüfungen berücksichtigen das. Die Registrierung ist eine Netzwerkeinstellung, die Registrierungsprüfung liest also diese statt der Option der einzelnen Website. Netzwerkadministratoren haben jede Berechtigung, unabhängig von ihrer Rolle auf der aktuellen Website, deshalb schließen die Prüfungen zu Konten, Passwörtern und Zwei-Faktor sie mit ein. Die Prüfung des Tabellenpräfixes betrachtet das Basispräfix statt des Präfixes der einzelnen Website.

Die Prüfungen zu Dateien, Dateirechten und Serverkonfiguration melden zwangsläufig auf jeder Website im Netzwerk dasselbe, weil sie eine einzige Installation beschreiben. Eine netzwerkweite Übersicht gibt es nicht.

Verlauf, Checkliste und Erinnerung gehören ebenfalls zu einer einzelnen Website. Jede Website im Netzwerk hat ihre eigenen.

Kann ich eigene Prüfungen hinzufügen?

Ja. cascr_registry filtert die Liste der Prüfungen, du kannst also eine hinzufügen, entfernen oder anders gewichten. cascr_test_result filtert ein einzelnes Ergebnis, bevor es bewertet wird. Eine Prüfung ist ein Callable, das eines der vier Ergebnisse zurückgibt, die CASCR_Result baut.

Welche WordPress- und PHP-Versionen werden unterstützt?

WordPress ab 7.0, PHP 7.4 bis 8.5. Jedes Release wird gegen WordPress 7.0 und die aktuelle Version getestet, auf Einzelinstallationen und auf Multisite, und auf allen sieben PHP-Zweigen dazwischen gelintet.

Wer steckt hinter diesem Plugin, und wo melde ich ein Problem?

Entwickelt und gepflegt wird es von CMS ADMINS, einer Münchner Agentur, die seit 2012 WordPress- und Drupal-Installationen betreut.

Wenn eine Prüfung etwas meldet, das du für falsch hältst, ist ein GitHub-Issue mit dem Text des Befunds der schnellste Weg zu einer Korrektur. Fehlalarme werden wie Bugs behandelt.

Rezensionen

Zu diesem Plugin liegen noch keine Rezensionen vor.

Mitwirkende und Entwickler

„CMS ADMINS Security Check Report: Sicherheitscheck für WordPress“ ist Open-Source-Software. Folgende Menschen haben an diesem Plugin mitgewirkt:

Mitwirkende

„CMS ADMINS Security Check Report: Sicherheitscheck für WordPress“ wurde in 1 Sprache übersetzt. Danke an die Übersetzer für ihre Mitwirkung.

Übersetze „CMS ADMINS Security Check Report: Sicherheitscheck für WordPress“ in deine Sprache.

Interessiert an der Entwicklung?

Durchstöbere den Code, sieh dir das SVN-Repository an oder abonniere das Entwicklungsprotokoll per RSS.

Änderungsprotokoll

Versionen vor 2.2.0 stehen in changelog.txt.

2.4.0

Neu

  • Eine Checkliste statt eines einmaligen Urteils. Ab dem zweiten Durchlauf öffnet die Seite mit einer Übersicht: die Note, wo die Website angefangen hat und wo sie heute steht, ein Balken für jeden Durchlauf, die fünf Dinge zum Abarbeiten, was noch offen ist und was wann behoben wurde. Die geführte Abfolge aus drei Schritten bleibt für den ersten Durchlauf.
  • Jede Aufgabe trägt einen Button, der genau diese eine Prüfung erneut ausführt und innerhalb von Sekunden antwortet. Eine Korrektur ist bestätigt, während du noch vor der Seite sitzt, und die nächste Aufgabe rückt nach, statt auf den nächsten vollständigen Durchgang zu warten.
  • Ein Verlauf der letzten 24 Durchläufe. Der allererste bleibt dauerhaft erhalten, damit der einleitende Satz immer nennen kann, wo die Website angefangen hat. Eine Installation, die von einer früheren Version kommt, findet ihre zwei gespeicherten Durchläufe als die ersten beiden Punkte wieder.
  • Fortschritt pro Kategorie, damit sichtbar ist, welcher Teil der Website erledigt ist und welcher nicht.
  • Ein sechster Bereich, Transparenz und Offenlegung, mit einer Prüfung darin: ob KI-generierte Inhalte auf der Website gekennzeichnet sind. Artikel 50 des EU AI Act verlangt seit dem 2. August 2026 eine maschinenlesbare Kennzeichnung und einen Hinweis bei KI-Chatbots. Die Offenlegungs-Plugins aus dem Plugin-Verzeichnis werden an ihrem Ordner und an den Einstellungen erkannt, die sie schreiben, und die Prüfung warnt nur, weil eine Website ohne KI-Inhalte nichts zu kennzeichnen hat.
  • Eine Zahl am Menüeintrag, ein Widget im Dashboard und eine Erinnerung, sobald der letzte vollständige Durchlauf älter als dreißig Tage ist. Die Erinnerung lässt sich dauerhaft abschalten, pro Benutzer.

Geändert

  • Der Bericht wird jetzt auf dem Server gebaut. Früher wurde er im Browser zusammengesetzt, damit konnte es die Übersicht vor dem Ende eines Durchlaufs nicht geben, und dasselbe Markup hätte zweimal geschrieben werden müssen.
  • Eine einzelne erneute Prüfung schreibt nie einen Punkt in den Verlauf, und die Seite sagt deutlich, dass die Note dann zum Teil auf älteren Messungen beruht. Ein Teildurchgang ist kein Durchlauf.
  • Ein Durchlauf speichert, was jede Prüfung gemeldet hat, damit sich der Bericht neu aufbauen lässt, ohne alles erneut auszuführen.

Behoben

Jede Prüfung wurde gegen die Quellen gelesen, die sie nennt: php.net, das WordPress-Handbuch, den Core-Quelltext, MDN und die Pakete der Plugins, die sie erkennt. Dabei kamen Befunde heraus, die bei korrekter Konfiguration auslösen, einer, der überhaupt nicht auslösen konnte, und Aussagen, die seit Jahren nicht mehr stimmen.

  • Websites mit Zwei-Faktor-Schutz wurden gemeldet, als hätten sie keinen. Der für iThemes, Solid und Kadence Security hinterlegte Benutzer-Meta-Schlüssel ist nicht der, den diese Plugins schreiben, und den für Defender gibt es dort überhaupt nicht. Google Authenticator speichert die Zeichenkette „disabled“, die als zweiter Faktor zählte, weil sie nicht leer ist. Damit blieb genau der Fall unbemerkt, für den es die Prüfung gibt.
  • Die Prüfung auf Plugins, die aus dem Verzeichnis entfernt wurden, konnte gar nicht auslösen. Die API antwortet bei einem geschlossenen Eintrag mit 404, und die WordPress-Funktion macht daraus einen Fehler, bevor das Kennzeichen „closed“ überhaupt gelesen wird. Die Prüfung gab also genau in dem Fall Entwarnung, für den sie geschrieben wurde. Sie fragt den Endpunkt jetzt selbst ab und unterscheidet einen geschlossenen Eintrag, ein nie gelistetes Plugin und ein nicht erreichbares.
  • Ein WordPress, das in einem eigenen Verzeichnis installiert ist, wurde als eingeschleuster Optionswert gemeldet, mit kritischer Dringlichkeit. Der Vergleich von WordPress-Adresse und Website-Adresse kann das nicht von einer Übernahme unterscheiden, und bei einer echten Übernahme werden beide gemeinsam geändert. Der Vergleich ist deshalb entfallen.
  • Eine Website hinter Cloudflare wurde gemeldet, als ließe sich ihre Client-Adresse fälschen. Die Prüfung sucht jetzt nach einem Proxy, der sich zu erkennen gibt, und meldet das Ergebnis als nicht ermittelt, wenn sie es nicht entscheiden kann, statt zu warnen.
  • Die WooCommerce Store API wurde als ungeschützte Schreibroute gemeldet. Eine Route als öffentlich zu registrieren ist die Schreibweise, die das Handbuch vorgibt, deshalb werden eine Route ganz ohne Permission-Callback und eine absichtlich öffentliche jetzt auseinandergehalten.
  • Die strenge Content Security Policy aus der veröffentlichten Empfehlung wurde gemeldet, als ließe sie genau die Lücke offen, die sie schließt. Browser, die ’strict-dynamic‘ verstehen, ignorieren den daneben stehenden Fallback ‚unsafe-inline‘, und die Prüfung macht das jetzt ebenso. Ein Host-Wildcard wird nicht mehr damit verwechselt, Skripte von überall zuzulassen.
  • DISALLOW_FILE_MODS schließt den Datei-Editor und stoppt Hintergrund-Updates. Keine der beiden Prüfungen wusste das. Wer dem eigenen Rat dieses Plugins folgte, ließ damit einen Befund stehen und machte aus einem anderen eine falsche Entwarnung.
  • system.multicall verstärkt Passwortraten seit WordPress 4.4 nicht mehr, und die XML-RPC-Prüfung erkennt jetzt den Filter, mit dem die meisten Sicherheits-Plugins die Schnittstelle abschalten.
  • Der Rat, einen anderen Anzeigenamen als den Anmeldenamen zu wählen, bringt nichts, weil der Autoren-Slug den Anmeldenamen behält, aus dem er erzeugt wurde.
  • Anwendungspasswörter wurden auf jeder Website ohne HTTPS als abgeschaltet gemeldet, also genau dort, wo WordPress sie ohnehin verweigert.
  • Ein Server, der den Quelltext einer PHP-Datei ausliefert, wurde gemeldet, als würde er sie ausführen. Das sind verschiedene Probleme mit verschiedenen Lösungen.
  • .user.ini und .htpasswd standen in der Liste der Dateien, die zu löschen sind. Sie sind aktive Konfiguration, und wer die zweite löscht, sperrt Leute aus.
  • Auf IIS riet die Prüfung zur .htaccess dazu, die Permalink-Einstellungen zu speichern, was dort eine web.config schreibt und nie eine .htaccess.
  • Eine Rolle, die seit dem ersten Durchlauf lediglich hinzugekommen ist, wie es ein Shop- oder Mitgliedschafts-Plugin tut, wurde als Rolle mit Administrator-Rechten gemeldet.
  • Installer und Shell-Skripte zwischen den Uploads gelten nicht mehr als Code, den der Server ausführt.
  • Ein von 2.3.2 gespeicherter Durchlauf konnte beim ersten Seitenaufruf nach dem Update eine PHP-Warnung auslösen. Der Stummschaltungsstand, mit dem er gespeichert wurde, bleibt jetzt erhalten, bis ein Durchlauf dieser Version ihn ersetzt.
  • Scans und Abfragen, die nicht abgeschlossen werden können, sagen das jetzt, statt Entwarnung zu geben: ein Scan der Core-Dateien, der an seine Grenze gestoßen ist, ein Plugin-Eintrag, der nicht abgerufen werden konnte, ein Datenbank-Dump, dessen URL nicht geantwortet hat.

Erklärungen

  • Jeder der einundsechzig Einträge wurde gegen die Methode gelesen, die er dokumentiert. Vierzehn beschrieben Ergebnisse, die die Prüfung gar nicht kennt, oder schwiegen über die, die sie hat.
  • Der Eintrag zu den Sicherheits-Headern nennt jetzt die Werte, die einzutragen sind, das Einzige, was ihm gefehlt hat. Die Einträge zu den Dateirechten sagen, wo sich Dateirechte ohne Shell-Zugang ändern lassen. Rund ein Dutzend Begriffe wird dort erklärt, wo sie zuerst auftauchen, statt vorausgesetzt zu werden.
  • Die Warnung zum Tabellenpräfix nannte den falschen Mechanismus, und die Begründung für 640 gegenüber 440 bei wp-config.php war verdreht. Dateien im Webroot galten pauschal als harmlos, obwohl phpinfo.php die gesamte PHP-Umgebung ausgibt.

2.3.2

Behoben

  • Die Prüfung auf ausführbare Dateien im Uploads-Verzeichnis meldete die leere index.php, die WordPress und die meisten Plugins in jeden Upload-Ordner legen, um die Verzeichnisauflistung zu unterbinden. Diese Dateien sind das Gegenteil eines Befunds, und weil die Prüfung als kritisch zählt, zog eine einzige davon eine sonst gesunde Website auf Note D herunter. Auf zwanzig Websites war die Note allein deshalb identisch. Die Prüfung liest so eine Datei jetzt, statt sie nach dem Namen zu beurteilen: Eine index.php besteht nur, wenn sie klein bleibt, keine Request-Daten liest, keine andere Datei einbindet, keine der Funktionen aufruft, die eine eingeschleuste Shell braucht, und nichts Eigenes ausgibt. Alles andere wird weiterhin gemeldet, index.php eingeschlossen.
  • Jede gemeldete Datei trägt jetzt ihre Größe und, wenn eine index.php nicht bestanden hat, den Grund für die Meldung. Eine Schutzdatei hat ein paar hundert Bytes, die Zahl allein klärt also meist, was eine Datei ist.
  • Die Zwei-Faktor-Abdeckung konnte ein Konto, das die Einrichtung nie abgeschlossen hat, nicht von einem unterscheiden, das sie schlicht nicht lesen konnte, und meldete beides als nicht ermittelt. Jedes unterstützte Plugin ist jetzt zusammen mit den Benutzer-Metadaten hinterlegt, die es schreibt. Ein installiertes Plugin, das niemand nutzt, wird damit als das gemeldet, was es ist: eine Lücke, samt der Konten ohne zweiten Faktor.
  • Die Zwei-Faktor-Erkennung deckt jetzt ReportedIP Hive, Solid Security, Kadence Security, WP Defender und Google Authenticator ab. iThemes Security wurde zweimal umbenannt und kommt unter drei Ordnernamen vor, alle drei werden erkannt.

2.3.1

  • Die Seite ist jetzt in drei Schritte gegliedert: Prüfung starten, Ergebnis lesen, den Rest durchgehen. Schritt zwei und drei sagen schon vor dem ersten Durchlauf, was sie enthalten werden, die Seite erklärt sich also selbst.
  • Der Start-Button sagt, was er tut und wie lange es dauert, und der Hinweis zur temporären Datei steht direkt darüber.
  • Das Ergebnis beginnt mit einem klaren Satz statt nur mit einem Buchstaben: wie viele Befunde jetzt Aufmerksamkeit brauchen, wie viele sich zu verbessern lohnen und wie viele Prüfungen nicht abgeschlossen werden konnten.
  • Die Seite scrollt zum Ergebnis, wenn ein Durchlauf fertig ist, statt es unterhalb des sichtbaren Bereichs liegen zu lassen.
  • Die Prioritätenliste heißt jetzt, was sie ist: To-do-Liste. Und sie sagt, dass man sie der Reihe nach abarbeitet.
  • Ein Befund kann einen Link zu weiterer Hilfe enthalten. Der Zwei-Faktor-Befund verweist damit auf das Plugin Two Factor vom WordPress-Core-Team und auf ReportedIP Hive, das wir selbst entwickeln und auch so kennzeichnen.
  • Drei Oberflächentexte und zwei Stylesheet-Regeln entfernt, die vom Neuaufbau übrig geblieben waren.

2.3.0

Neu aufgebaut

  • Eine Registry ist jetzt die einzige Quelle für eine Prüfung: Kennung, Bezeichnung, Gruppierung, Dringlichkeit, Gewicht, Callback und Dokumentation lagen vorher an vier getrennten Stellen, die nichts synchron hielt. Ein Test erzwingt jetzt, dass sie übereinstimmen.
  • Die Bewertung ist aus dem Browser nach PHP gewandert, damit ist das Ergebnis reproduzierbar, testbar und auch außerhalb des Dashboards verfügbar.
  • Der admin-ajax-Endpunkt wurde durch REST-Routen unter cascr/v1 ersetzt, die drei Prüfungen gleichzeitig ausführen statt strikt eine nach der anderen.
  • Ergebnisse werden gespeichert, damit der Bericht einen Durchlauf mit dem vorigen vergleichen kann.

Neu

  • Fünfundzwanzig Prüfungen, darunter öffentlich lesbare Konfigurationsdateien und Repository-Ordner, Datenbank-Dumps im Webroot, Must-use-Plugins und Drop-ins, Änderungen an Rollen und Berechtigungen, das Inventar der Anwendungspasswörter mit letzter Nutzung, Zwei-Faktor-Abdeckung pro Administrator, REST-Schreibrouten ohne Authentifizierung, Ablauf des TLS-Zertifikats, Qualität von HSTS und CSP, Cookie-Attribute, gefälschte Client-Adressen und Besitzerwechsel bei Plugins.
  • wp security-check run als WP-CLI-Befehl.
  • Eine Prioritätenliste mit den fünf Dingen, die sich zuerst lohnen, ganz oben im Bericht.
  • Ein Vergleich mit dem vorigen Durchlauf: neu nicht bestanden, behoben, geändert.
  • Stummschalten mit Inhalts-Fingerprint, damit ein akzeptierter Befund wieder auftaucht, sobald er sich tatsächlich ändert.
  • „Nicht ermittelt“ als eigenes Ergebnis, damit eine blockierte Anfrage kein Befund mehr ist und die Note nicht mehr beeinflusst.
  • Export als Text, JSON und CSV.
  • Die Filter cascr_registry und cascr_test_result.

Behoben

  • Multisite meldete „Registrierung geschlossen“ auf einem Netzwerk, in dem sich jeder registrieren konnte, weil die Prüfung die Website-Option las, die Multisite ignoriert. Jetzt liest sie die Netzwerkeinstellung.
  • Netzwerk-Administratoren fehlten in den Prüfungen zu Passwort, Administratoren, Zwei-Faktor und Anwendungspasswörtern. Sie haben jede Berechtigung, unabhängig von ihrer Rolle auf einer Website, eine Abfrage nach Rolle allein fand sie also nicht.
  • Die Tabellenpräfix-Prüfung verglich auf Multisite das Präfix der einzelnen Website, sodass jede Website im Netzwerk aussah, als hätte sie ein eigenes.
  • Ein Stored-Cross-Site-Scripting-Pfad: Befunde mit Website-Daten wie Plugin- oder Benutzernamen wurden per innerHTML in die Zusammenfassung geschrieben.
  • Die Prüfungen der Dateirechte verglichen gegen exakt 0755 und meldeten deshalb 0750 und das verbreitete setgid 2755 als unsicher.
  • WP_AUTO_UPDATE_CORE auf true wurde als Risiko gemeldet, obwohl es mehr Updates freischaltet als die empfohlene Einstellung.
  • „Seit sechs Monaten nicht geändert“ galt als „veraltet“, was gut gepflegte Plugins markierte. Ersetzt durch Veröffentlichungsdatum, getestete WordPress-Version und Status im Plugin-Verzeichnis.
  • Der Malware-Signatur-Scan durchsuchte wp-admin und wp-includes nach Zeichenketten wie eval( und $_GET[ und brauchte eine handgepflegte Liste von 180 Core-Dateien, um Ruhe zu geben. Ersetzt durch einen Abgleich mit der offiziellen WordPress-Dateiliste.
  • Sicherheits-Header waren alles oder nichts. Sie werden jetzt pro Header bewertet, die Cross-Origin-Isolation-Header gelten als optional.
  • Die Oberfläche folgte dem Farbschema des Betriebssystems und malte dunkle Kacheln auf das helle Dashboard. Jetzt folgt sie dem WordPress-Admin.

Geändert

  • Eine Anfrage an die Startseite pro Durchlauf statt vier, und eine Update-Abfrage statt einer Anfrage pro installiertem Plugin.
  • Doppelte Prüfungen zusammengelegt (PHP-Versionssupport, XML-RPC-Methoden, Begrenzung der Anmeldeversuche) und zwei gestrichen, die nie fehlschlagen konnten (jQuery-Version, Storage-Engine der Tabellen).
  • Jeder Text der Oberfläche ist übersetzbar. Der Bericht war vorher fest auf Englisch, mit deutschem Datumsformat.
  • Zahlen im Bericht nutzen richtige Pluralformen, statt immer den Plural anzunehmen.
  • Der JavaScript-Alert wurde durch einen Admin-Hinweis und eine Screenreader-Ansage ersetzt.
  • Die Testsuite läuft jetzt auch gegen Multisite, als blockierender Schritt vor jedem Release.

2.2.2

  • PHP-Kompatibilität erweitert: Das Plugin läuft auf PHP 7.4 bis 8.5
  • Benötigt WordPress 7.0 oder neuer
  • Automatisierte Testsuite ergänzt, die jede Prüfung sowie die Berechtigungs- und Nonce-Sperren abdeckt
  • Die Continuous Integration lintet auf sieben PHP-Versionen und lässt die Tests gegen WordPress 7.0 und die aktuelle Version laufen
  • PHP-Warnung in den Update-Prüfungen für Themes und Plugins behoben, wenn ein Pfad nicht mehr existiert
  • Ungenutzte Altlasten im Code entfernt und volle Konformität mit den WordPress Coding Standards erreicht

2.2.1

  • Erste Veröffentlichung im WordPress.org-Plugin-Verzeichnis
  • Plugin-Ordner, Hauptdatei und Textdomain in security-check-report umbenannt
  • Spamhaus-IP-Blacklist-Test entfernt, der die Serveradresse ungefragt an einen Dritten schickte
  • Ungenutzten Altcode und Dateien entfernt
  • Laden der Übersetzungen ab WordPress 6.7 behoben
  • Zertifikatsprüfung für die Testanfrage zur PHP-Ausführung aktiviert

2.2.0

  • Oberfläche neu gestaltet, mit einem nativen Akkordeon aus details und summary
  • Live-Suche über die Prüfungsdokumentation ergänzt
  • Jede Prüfungsbeschreibung in ein einheitliches Format gebracht: was geprüft wird, warum das wichtig ist, was zu tun ist
  • Farbschema vereinheitlicht und mehrere Layout-Probleme behoben