WP Manifestindependent plugin directory
manifest / security / rh-login

RH Login WP Registry grade B. Medium-severity findings · 2 findingsWP RegistryMedium-severity findings · 2 findingsOpen the reportB

Login-Schutz: Versuch-Limit mit IP-Sperre und optionales Verstecken der Login-URL.

★ 0stars
58release downloads
≈10active sites
v0.3.6latest · 29d ago

Install

Download rh-login.zip From the v0.3.6 release on GitHub, Oct 6, 2026

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/herbeckrobin/rh-login/releases/download/v0.3.6/rh-login.zip
Updates itself. It ships its own updater (Plugin Update Checker), so new versions appear under Dashboard → Updates.

Login-Schutz: Versuch-Limit und optionales Verstecken der Login-URL. Teil der rh-blueprint Kollektion.

App-seitiger Schutz, der server-seitiges CrowdSec/fail2ban ergänzt (das sieht den POST, aber nicht Erfolg/Fehlschlag).

Was es macht

  • Login-Versuch-Limit: zählt Fehlversuche pro IP und sperrt die IP nach dem Limit für eine Weile. Erfolgreicher Login setzt den Zähler zurück.
  • Login-URL verstecken (opt-in): wp-login.php und /wp-admin führen für nicht eingeloggte Besucher ins Leere (Startseite), der Login liegt unter einem geheimen Pfad. Der geheime Pfad wird dabei nicht im Redirect verraten. Passwortgeschützte Beiträge (postpass) bleiben funktionsfähig.

Einstellungen

Im Backend unter RH Blueprint → Login:

  • Login-Limit an/aus, maximale Fehlversuche (Standard 5), Sperrdauer in Minuten (Standard 15).
  • Login-URL verstecken an/aus, Login-Pfad (z.B. mein-zugang, team-eingang, oder etwas Eigenes mit Zufallsteil wie zugang-7f3a9).

Sicherheitshinweis

Nach dem Aktivieren des Versteckens unbedingt Login UND Logout im Browser testen. Falls du dich aussperrst: das Plugin deaktivieren, dann ist /wp-login.php wieder normal erreichbar (alles läuft nur über Laufzeit-Hooks).

Für Entwickler

Filter rh-blueprint/login/client_ip ($ip): die erkannte Client-IP überschreiben, wenn die Site hinter einem Proxy läuft (z.B. Coolify).

Installation

ZIP hochladen und aktivieren. Der geteilte Core ist gebündelt.

Voraussetzungen

WordPress 6.5+, PHP 8.1+.

Releases

8 releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
v0.3.6 latest
Oct 6, 2026 29d ago
rh-login.zip
10
Sep 29, 2026 1mo ago
rh-login.zip
8
Sep 29, 2026 1mo ago
rh-login.zip
2
Sep 23, 2026 1mo ago
rh-login.zip
8
Aug 17, 2026 2mo ago
rh-login.zip
13
Jun 18, 2026 4mo ago
rh-login.zip
13
Jun 17, 2026 4mo ago
rh-login.zip
2
Jun 17, 2026 4mo ago
rh-login.zip
2

Active-site estimate ≈10 comes from the median of recent superseded releases. Method.

B grade

Security

RH Login 0.3.6 · audited by WP Registry

Medium-severity findings.

1 medium 1 low
Audited release
0.3.6
Findings
2
Worst severity
medium
Content hash
7d8a37b75d00a15d8222beb5…

Findings

  • medium Hide-login rewrites the public post-password form onto the secret path

    information_disclosure

    When Login-URL verstecken is enabled, filterUrl rewrites every site_url or network_site_url that contains the substring wp-login.php to home_url('/{secret}'), preserving the query string. Core get_the_password_form() builds the form action with site_url('wp-login.php?action=postpass'). Any anonymous visitor who can view a password-protected post, or its content in the RSS/Atom feed via get_the_content_feed(), therefore receives the hidden login path in HTML. Opening that path runs serveLogin() and loads wp-login.php. This is unnecessary: intercept() already returns early for an exact action=postpass request (without key or checkemail), so the real wp-login.php?action=postpass endpoint still sets the post-password cookie. The rewrite defeats the secrecy 0.3.4 and 0.3.5 tried to restore for canonical and alias leaks. It does not skip the password check or the attempt limit. Deliberate login and logout links are a separate, intended disclosure so those flows keep working.

    inc/HideLogin.php:134-144

    Recommendation

    Do not rewrite URLs whose action is exactly postpass; leave those on wp-login.php, which is already allowlisted. Only rewrite wp_login_url, logout, reset, and register flows that must hit the secret path.

  • low Login lockout counter loses updates under parallel failures

    auth_bypass

    recordFailure() reads the per-IP transient and writes current+1 in two steps, once per request (the $counted flag correctly suppresses the double hook from wp_login_failed and application_password_failed_authentication). enforceLockout() allows the attempt when the stored value is still below max_attempts, and the password check at authenticate priority 20 runs before this increment. Concurrent failed logins from one IP can all observe the same count and all write the same next value, so a parallel client exceeds the configured cap by roughly the concurrency times the threshold before the lockout sticks. Impact is extra password guesses against the rate limit, not an authentication bypass and not unlimited guesses. WordPress XML-RPC system.multicall does not multiply this further: after one failed wp_xmlrpc_server::login(), auth_failed short-circuits later calls in that request.

    inc/Login.php:131-140

    Recommendation

    Increment the counter atomically (for example a single SQL UPDATE of the transient option, or an object-cache increment) and reject the attempt when the pre-increment value is already at the cap.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.